轮询实际发生在service层而非ingress controller,需确认service为clusterip且sessionaffinity=none、kube-proxy模式为iptables/ipvs、endpoints包含多个pod ip,并排查ingress controller资源瓶颈与cve-2026-42945漏洞影响。

轮询失效在K8s中不是Nginx配置写错了,而是容器化环境里请求分发逻辑被多层抽象掩盖了。关键得看清流量路径——Ingress Controller本身是Pod,它背后的upstream是Service的ClusterIP,而Service再通过kube-proxy或eBPF转发到真实Pod。轮询行为实际发生在Service层(默认ClusterIP的sessionAffinity=none时才是轮询),不是Ingress Controller自己做轮询。
确认轮询真正生效的位置
很多人在nginx-ingress的ConfigMap里改upstream权重,却发现没效果,因为Ingress Controller根本没直接管理后端Pod列表。它只把请求转给K8s Service,由Service完成负载分发:
- 查Service类型:必须是ClusterIP且未设置sessionAffinity: ClientIP
- 验证kube-proxy模式:运行
kubectl get configmap -n kube-system kube-proxy -o yaml,确认mode字段为iptables或ipvs(两者都支持轮询) - 检查Endpoints:执行
kubectl get endpoints <service-name></service-name>,确保返回多个Pod IP,且数量与后端Deployment副本数一致
排查Ingress Controller自身是否成为瓶颈
当Ingress Controller Pod只有一个副本,或资源受限(CPU限流、OOMKilled),会导致请求排队甚至丢弃,看起来像“轮询不均”:
- 看Controller日志:
kubectl logs -n ingress-nginx deploy/nginx-ingress-controller --since=10m | grep "upstream timed out" - 检查Pod资源:用
kubectl top pods -n ingress-nginx观察CPU/内存使用率,长期超80%需扩容 - 确认副本数:至少部署2个Ingress Controller副本,并加podAntiAffinity防止调度到同一节点
绕过Service直连Pod(特殊场景适用)
若业务对延迟极度敏感,且能接受失去Service的健康探针和自动剔除能力,可让Ingress Controller跳过Service,直接解析EndpointSlices:
- 启用endpoint-slice特性(K8s v1.21+默认开启)
- 在Ingress Controller ConfigMap中添加:
use-forwarded-headers: "true"和compute-full-forwarded-for: "true",避免X-Forwarded-For被覆盖 - 修改Ingress规则中的
backend.service.name为实际Pod所在Namespace下的endpointslice资源名(需配合自定义admission webhook或operator)
警惕CVE-2026-42945引发的隐性故障
当前主流ingress-nginx镜像(如kubernetes/ingress-nginx:v1.10.2)底层仍基于NGINX 1.27.1,受潜伏18年的堆溢出漏洞影响。该漏洞在高并发下可能触发worker进程异常退出,表现为连接重置、502频发、日志中出现segmentation fault——这些现象常被误判为“轮询失效”:
- 立即检查镜像版本:
kubectl get pod -n ingress-nginx -o wide,比对IMAGE列是否含nginx:1.27.1 - 升级方案:切换至修复版镜像(如us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v1.11.0),该版本已替换NGINX内核为1.29.0+
- 临时缓解:在ConfigMap中增加
worker-shutdown-timeout: "30s",避免崩溃后无法优雅退出











