如何调整K8S Service负载均衡算法/亲和性以解决流量不均问题
解决K8S LoadBalancer UDP流量分配不均的方案
针对你遇到的UDP LoadBalancer流量99%集中在单个Pod的问题,核心原因是默认会话亲和性规则与负载均衡算法的设置导致的,可通过以下调整解决:
1. 修改Service的会话亲和性配置
Kubernetes对UDP类型的Service默认启用ClientIP会话亲和性,这会让同一客户端的所有UDP流量固定转发到同一个后端Pod。如果你的客户端数量较少(比如仅1个或几个),就会出现流量高度集中的情况。
调整方式有两种:
- 完全关闭会话亲和性:将
sessionAffinity设为None,让kube-proxy采用轮询(Round Robin)策略分配流量; - 保留轻度亲和性但缩短超时:若业务需要一定的会话绑定,可缩短客户端IP的超时时间,让流量在超时后重新分配。
修改后的Service YAML示例:
apiVersion: v1 kind: Service metadata: name: my-lb spec: type: LoadBalancer sessionAffinity: None # 关闭客户端IP亲和性,启用轮询分配 # 若需保留亲和性,可替换为以下配置: # sessionAffinity: ClientIP # sessionAffinityConfig: # clientIP: # timeoutSeconds: 30 # 30秒超时后重新分配客户端流量 ports: - name: my-udp-port port: 54545 protocol: UDP selector: app: my-app
2. 配置云厂商负载均衡器的算法
如果你的K8S集群部署在公有云(AWS/GCP/Azure等),LoadBalancer类型的Service会对应云厂商的负载均衡器,部分厂商默认采用源IP哈希算法,同样会导致流量集中。需要手动调整为轮询或最少连接算法:
- AWS EKS:添加注解修改NLB目标组算法
metadata: name: my-lb annotations: service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: "load_balancing.algorithm.type=round_robin" - GCP GKE:添加注解设置GCLB负载均衡策略
metadata: name: my-lb annotations: cloud.google.com/load-balancer-type: "External" networking.gke.io/load-balancer-affinity: "none" - Azure AKS:通过Azure CLI修改LB规则的负载分布
az network lb rule update --resource-group <你的资源组> --lb-name <LB名称> --name <规则名称> --load-distribution Default
3. 验证调整效果
- 查看Service配置:执行
kubectl describe service my-lb,检查Session Affinity字段是否符合预期配置; - 云厂商控制台验证:登录对应云平台的负载均衡器页面,确认算法已修改为目标策略;
- 流量测试:通过多客户端发送UDP请求,观察后端Pod的流量接收情况,确认流量是否均匀分配。
内容的提问来源于stack exchange,提问作者MTZ4
相关产品推荐
相关产品推荐

