Kubernetes Service未在Pod间均匀分配流量问题咨询
Kubernetes v1.20裸金属集群HPA扩缩容后流量不均排查方案
一、Service 核心配置排查
- 确认kube-proxy运行模式
执行命令查看模式配置:kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode- 若为ipvs模式:检查调度算法是否为源地址哈希(sh),该算法会将同来源IP的请求全部转发到同一个Pod,若流量来源IP集中就会出现单Pod承载绝大多数负载的情况,需要修改为轮询(rr)算法。
- 若为iptables模式:默认是随机负载均衡,规则异常才会出现分配不均,后续检查kube-proxy规则更新状态。
- 检查会话保持配置
执行命令查看Service配置:kubectl describe svc <你的服务名称> | grep SessionAffinity
若返回值为ClientIP,说明开启了客户端IP会话保持,同IP的所有请求都会绑定到同一个Pod,将该配置改为None即可解除绑定。
二、Ingress 层配置排查(若通过Ingress接收外部流量)
- 检查负载均衡策略
常用的Nginx Ingress默认会复用长连接,单TCP连接内的所有请求都会转发到同一个后端Pod,若客户端使用连接池、单连接请求量极高,HPA扩容出的新Pod会因为没有新连接分配出现空载。可以添加以下Ingress注解调整:
上述配置会强制使用轮询策略,同时限制单个长连接最多处理100个请求,用完后断开重新分配后端Pod。nginx.ingress.kubernetes.io/load-balance: round_robin nginx.ingress.kubernetes.io/keep-alive-requests: 100 - 检查会话保持注解
若Ingress配置了nginx.ingress.kubernetes.io/affinity: cookie这类会话保持注解,会将同用户会话的请求绑定到固定Pod,直接删除对应注解即可。
三、HPA与Pod就绪检测排查
- 检查HPA触发逻辑
若HPA仅通过CPU利用率触发扩容,当首个Pod的CPU达到阈值才触发扩容,但此时已有流量全部通过长连接走首个Pod,新扩容的Pod就绪后没有新连接进入就会一直空载。建议结合请求QPS指标做HPA触发条件,提前扩容避免流量绑定。 - 检查Pod就绪状态
执行命令确认所有扩容出的Pod都已经加入Service后端端点:kubectl get endpoints <你的服务名称>
若新Pod的IP没有出现在端点列表中,说明Pod的就绪探测失败,没有被纳入流量转发列表,需要调整readinessProbe配置的检测逻辑和周期,确保Pod能正常处理流量后再被加入后端。
四、kube-proxy规则更新排查
- 重启kube-proxy验证
部分场景下kube-proxy进程卡住不会及时更新转发规则,导致新扩容的Pod没有被加入转发列表,执行命令滚动重启kube-proxy:kubectl rollout restart daemonset kube-proxy -n kube-system,重启后观察流量分布是否恢复正常。 - 手动验证转发规则
若使用iptables模式,执行命令检查是否存在新Pod的转发规则:iptables-save | grep <新Pod的IP地址>,无匹配规则的话查看kube-proxy日志排查规则更新失败的具体报错。
内容的提问来源于stack exchange,提问作者Anthony Vinay
相关产品推荐
相关产品推荐

