运维经验分享
背景:
2019年04月19日晚21:10分进行网络维护,内容如下:
将域名CNAME到阿里云的Web防火墙(以下简称为WAF),业务请求经防火墙解析到Kubernetes 的 Ingress 的负载均衡(SLB)地址
故障现象:
后端应用通过获取请求中的X-Forwarded-For字段,拿到的IP地址为WAF回源地址,非客户端真实IP。
排查记录:
21:15 查看Ingress日志,发现Ingress拿到的IP就是WAF回源地址,为错误IP,确定非前端nodejs代码bug。
21:33 联系阿里云技术团队一起排查问题。
22:20 确认Ingress的模板文件中 the_real_ip 变量是拿的 remote_addr 字段,等待阿里技术联系Ingree研发同学,给出回复。
23:23 Ingree研发同学联系上后确认Ingress没问题,可能是WAF没传真实IP到Ingress。
23:50 在Ingress容器和前端nodejs所在宿主机tcpdump工具抓包后分析得出:
(1)、WAF已经将真实客户端地址放到了 x-Forwarded-For 的字段中传给了ECS
(2)、ECS(容器的ingress)将真实的客户端IP,放到了x-Original-Forwarded-For;而将WAF的回源地址放到了 x-Forwarded-For4月20日 00:29 将compute-full-forwarded-for配置到Ingress的ConfigMap中,问题解决。
操作:
1 | kubectl -n kube-system edit cm nginx-configuration |
1 | 在data标签下添加如下: |
结论:
阿里云容器服务Kubernetes集群的Ingress默认ConfigMap中未配置 compute-full-forwarded-for参数,导致将ingress拿到的WAF回源IP替换为XFF,而非附加到XFF中。
反思:
预览环境和线上环境架构不一致:
此次故障中,预览环境未使用WAF防护,直接解析到K8S集群,未提前发现此次问题,已修正,以后尽量维持环境统一,避免此类问题出现。
故障点定位速度慢:
网络请求问题优先抓包分析,提升故障定位速度,后续夯实基础知识,提升问题排查能力。
Kubernetes专业知识掌握程度较低
目前仅仅在使用层面上能力ok,但是其实现原理、组件实现方式等知识点薄弱,后续还需在K8S学习中多总结,多学习,争取减少故障,提升运维能力。