在使用蓝盾公共构建机(Docker)时,我们发现构建机偶尔无法就绪。排查后发现,问题出在拉起的 Pod 在安装蓝盾 Agent 时卡住。经进一步分析,这是由于该 Pod 与 Nginx Ingress Pod 被调度到了同一节点,而同节点访问异常。
背景
在阿里云ACK集群中,出现同节点访问异常的网络现象:
场景 | 流量路径 | 结果 |
---|---|---|
同节点 | Pod → CLB VIP → 同节点 NodePort → 被 CLB 丢弃(回环限制) | ❌ 超时 |
跨节点 | Pod → CLB VIP → 其他节点 NodePort → Ingress Pod | ✅ 正常 |
- 跨节点访问正常:业务 Pod 与 Nginx Ingress Controller 部署在不同节点时,通过 CLB 访问服务完全正常。
- 同节点访问超时:当业务 Pod 与 Ingress Controller 调度到同一节点时,TCP 连接超时:
# 在Pod内测试
curl http://devops.bk.xxx.xxx/static/local/files/docker_init.sh
# 返回错误
curl: (28) Failed to connect to devops.bk.xxx.xxx port 80: Connection timed out
关键组件
- Kubernetes 1.20.11 + Terway网络插件(非ENITrunking模式)
- Nginx Ingress 0.44.0(externalTrafficPolicy: Local)
- CLB 类型:四层TCP监听(端口80)
- 服务转发模式:IPVS
排查过程
基础检查
网络连通性测试:
# DNS解析正常 |
安全组验证:
已确认放行VPC内网段(10.200.0.0/16, 100.100.0.0/16),排除ACL拦截。 |
流量路径分析
CLB后端健康状态:
kubectl get endpoints -n kube-system nginx-ingress-controller |
Ingress Controller配置:externalTrafficPolicy: Local
导致 CLB 只会将流量转发到有 Ingress Pod 的节点。
节点网络抓包:
在Ingress节点执行抓包后,发现 CLB 的请求包能到达节点,但未转发到 Ingress Pod。
根因定位
阿里云 CLB 对四层TCP监听器默认禁止回环流量(即后端服务器通过 CLB VIP访问自身服务),相关阿里云文档。
解决方案
当前使用修改CoreDNS配置的临时方案,其他方案待评估后实施。
修改CoreDNS配置(临时)
将相关域名解析到 Ingress Service 的内网IP(如ClusterIP),绕过 CLB。
更新集群组件
- 升级 Nginx Ingress :使用新版本,已修复兼容性问题。
- 升级 Terway 插件:使用最新版本,优化节点内流量路由。