如何在多个Ingress Pod间分配负载?解决集群Ingress Pod负载不均问题
多Ingress Pod间的负载分配方案
先排查单Pod独占请求的原因
先确认基础配置是否存在问题:
- 检查Ingress Controller的Service是否开启会话保持:执行
kubectl get service <ingress-controller-service> -o yaml,确认spec.sessionAffinity为None(默认值),如果是ClientIP会导致同一客户端请求固定绑定到单个Pod。 - 确认Ingress Controller的Deployment副本数为2,且所有Pod处于
Running状态:kubectl get pods -n <ingress-namespace>
实现负载均衡的工具与配置方法
1. Kubernetes原生Service(推荐)
Kubernetes的Service本身具备负载均衡能力,只需确保配置正确:
- 使用
ClusterIP或LoadBalancer类型的Service:kube-proxy会自动在后端Pod间做轮询负载分发。 - 若使用
NodePort类型,需确保外部流量能分发到集群所有节点(而非固定某一个节点),比如通过外部负载均衡器把请求转发到所有节点的NodePort端口。
2. 外部负载均衡器
- 云厂商托管LB:当Ingress Service设为
LoadBalancer类型时,AWS、GCP、阿里云等云厂商会自动创建外部负载均衡器,将流量分发到所有运行Ingress Pod的节点,再由kube-proxy转发到Pod。 - 自建负载均衡器:用HAProxy、Nginx等工具搭建前端LB,配置转发规则指向所有Ingress Controller的节点IP+NodePort,或直接通过Service的ClusterIP转发(更稳定,避免Pod IP变动问题)。
3. Ingress Controller自身配置优化
以Nginx Ingress Controller为例:
- 检查Ingress资源的注解,确保没有开启会话绑定:若存在
nginx.ingress.kubernetes.io/affinity: "cookie"注解,会强制会话绑定到单个Pod,需删除或改为nginx.ingress.kubernetes.io/affinity: "none"。 - 确认Nginx配置中上游Pod的负载均衡策略为轮询(默认配置),无需额外修改即可实现请求分发。
4. kube-proxy IPVS模式优化
将kube-proxy切换为IPVS模式,相比默认的iptables模式,支持更丰富的负载均衡策略(轮询、最小连接、加权轮询等),且性能更优:
- 确保集群节点安装了ipvsadm、ipset工具。
- 修改kube-proxy的配置,设置
mode: ipvs,并可指定scheduler(如rr轮询、lc最小连接)。
内容的提问来源于stack exchange,提问作者Антон Жуков
相关产品推荐
相关产品推荐

