Nginx Ingress Controller外部访问上游超时、Pod内直连正常问题排查
问题根因分析与解决方案
以下是该场景下按出现概率排序的可能原因及对应处理方案:
1. MTU/MSS不匹配导致大包丢包(最高概率)
- 触发逻辑:
- 你手动在Ingress Pod内部执行curl时,仅携带3个基础请求头,整体报文体积很小,小于Pod网络链路的MTU阈值,可正常传输
- Nginx Ingress转发外部请求时,会默认追加
X-Forwarded-For、X-Forwarded-Proto、X-Real-IP等多个代理头,加上原始请求的头信息,整体报文体积变大。如果集群节点防火墙/安全组拦截了ICMP不可达报文,PMTU探测失效,超过MTU的大包会被直接丢弃,最终导致超时
- 验证方法:
在Ingress Pod内执行带全量代理头的curl命令模拟转发场景,大概率会复现超时:curl -H "Host: test.amazonaws.com.cn" -H "X-Forwarded-For: 10.88.0.1" -H "X-Forwarded-Proto: http" -H "X-Real-IP: 10.88.0.1" http://10.96.175.3 - 修复方案:
- 调整CNI插件的Pod网络MTU,比如Calico/Flannel将MTU设置为1450,预留隧道封装开销
- 为Nginx Ingress添加注解
nginx.ingress.kubernetes.io/proxy-mss: "1400",强制TCP MSS小于链路MTU阈值
2. IPVS模式下的conntrack条目冲突
- 触发逻辑:
若集群kube-proxy使用IPVS模式,Nginx Ingress默认会复用与上游Pod的TCP连接,旧的conntrack条目未及时老化时,新连接如果使用了相同源端口,会被IPVS误判为非法连接丢弃。手动curl使用随机高位源端口,不会命中冲突条目,因此可以正常访问。 - 修复方案:
- 升级kube-proxy到1.22及以上版本,该版本修复了多个IPVS conntrack相关的已知bug
- 为Nginx Ingress添加注解
nginx.ingress.kubernetes.io/upstream-keepalive-connections: "0",临时禁用上游连接复用
3. 跨节点网络单向连通
- 触发逻辑:
你配置了EchoServer的节点反亲和,每个节点部署1个副本,若非Ingress Pod所在节点的出站规则被防火墙限制,回包无法到达Ingress Pod所在节点,也会出现转发超时。该场景下手动curl异常上游IP也会超时,可先执行该操作排除。
内容的提问来源于stack exchange,提问作者Janson
相关产品推荐
相关产品推荐

