OpenShift RoundRobin负载均衡流量分配不均问题咨询及优化方案请求
OpenShift内部路由RoundRobin负载均衡异常问题
我发现OpenShift负载均衡存在异常行为:通过内部路由(非GTM)从一个微服务调用另一个微服务,已配置RoundRobin负载均衡并禁用会话粘滞(配置已100%生效),配置如下:
haproxy.router.openshift.io/balance: roundrobin haproxy.router.openshift.io/disable_cookies: 'true'
我使用禁用连接复用的curl命令发起请求:
curl.exe $url -X GET -H "Connection: close" --no-keepalive
在2个Pod的环境下发起20次请求,不同请求间隔下的流量分配结果异常:
- 100ms间隔:13/7
- 200ms间隔:16/4
- 1秒间隔:19/1
- 30秒间隔:20/0
由于服务需执行大量计算,20秒间隔是生产常见场景,此时所有请求集中到单个Pod导致其被压垮,之后切换至另一个Pod,循环往复。
我理解RoundRobin应针对服务所有端点调度,但不应出现20/0的极端情况,目前无法定位问题根源,恳请解答:
- 为何出现该流量分配不均情况?
- 如何实现2个Pod间接近10/10的流量分配?
问题解答
1. 流量分配不均的原因
OpenShift的HAProxy路由默认存在几个可能导致该现象的逻辑:
- 调度单位与空闲状态重置:HAProxy的RoundRobin默认基于连接而非请求调度,即便你禁用了连接复用,当请求间隔过长时,HAProxy会重置调度轮询状态,重新从第一个注册的Pod开始分配流量,导致后续请求全部集中到同一Pod。
- 后端Pod注册顺序固定:如果Pod的注册顺序始终不变,HAProxy在空闲期后重新初始化调度时,会优先选择列表头部的Pod,进而出现持续单Pod承接流量的情况。
- 动态权重隐式调整:HAProxy会根据Pod的健康检测结果、连接成功率等指标动态调整权重,若某Pod在空闲期被标记为"更健康",会被分配更多流量,极端情况下出现全量请求集中。
2. 实现均衡流量分配的方案
- 强制基于请求的RoundRobin调度:通过路由注解添加HAProxy配置片段,启用
http-server-close确保每个请求触发一次调度:haproxy.router.openshift.io/configuration-snippet: | option http-server-close balance roundrobin - 固定Pod权重为均等值:显式配置所有后端Pod的权重为1,避免动态调整干扰:
haproxy.router.openshift.io/backend-config-snippet: | server-template pod 2 ${POD_IP}:80 check weight 1 - 切换为Kubernetes Service调用:微服务内部调用直接使用ClusterIP Service,其RoundRobin实现基于请求调度,默认会均匀分配流量到所有健康Pod,规避HAProxy路由的额外逻辑。
- 调整空闲超时参数:缩短HAProxy的服务器空闲超时时间,避免调度状态因长期空闲重置:
haproxy.router.openshift.io/timeout-server: "10s" haproxy.router.openshift.io/timeout-connect: "5s"
内容的提问来源于stack exchange,提问作者Bohdan Petrenko
相关产品推荐
相关产品推荐

