Kubernetes LoadBalancer类型服务3副本仅2个承接流量问题咨询
问题排查与解决方案
异常成因
- kube-proxy默认负载均衡策略偏差:kube-proxy默认iptables模式采用随机负载均衡算法,200并发属于较低请求量级,概率上会出现流量分配不均,极端情况就会出现单个副本完全分配不到流量。
- 会话保持配置导致流量固定:不管是K8s Service侧配置了
sessionAffinity: ClientIP,还是上层LoadBalancer(云厂商负载均衡)默认开启了源IP会话保持,都会把同一客户端的请求固定转发到少数后端Pod,客户端数量少的场景下就会出现部分Pod无流量。 - 未就绪Pod未加入Endpoint:Deployment显示3副本运行不代表3个Pod都处于Ready状态,若第三个Pod的readiness探针检测失败,会被自动从Service的Endpoint列表中移除,自然不会承接任何流量。
- gRPC客户端连接池配置过小:即使排除了单stream单TCP的问题,如果客户端连接池最大连接数配置为2,客户端最多只会和后端建立2条TCP连接,对应只会有2个Pod接收流量。
修复配置方案
- 第一步先核对Endpoint列表,执行命令
kubectl get endpoints <你的Service名称>,确认列表中是否包含3个Pod的IP。如果只有2个,直接排查第三个Pod的 readiness探针配置、容器运行日志,修复故障让Pod进入Ready状态即可。 - 关闭所有会话保持配置:
- K8s Service侧:显式配置
sessionAffinity: None,移除原有会话保持相关配置。 - LoadBalancer侧:在云服务商负载均衡控制台关闭会话保持功能,也可以通过Service的annotation配置禁用对应规则。
- K8s Service侧:显式配置
- 调整kube-proxy负载均衡策略:将kube-proxy的运行模式从iptables改为IPVS模式,同时将负载均衡算法修改为轮询(rr)或者最小连接数(lc),相比iptables的随机算法,IPVS的流量分配均匀度大幅提升。
- 调整gRPC客户端配置:将客户端连接池的最大连接数调整为不小于3,同时开启连接池的动态扩容能力,保证有足够的连接可以分散到所有后端副本。
内容的提问来源于stack exchange,提问作者Tinyden
相关产品推荐
相关产品推荐

