You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的极端情况,目前无法定位问题根源,恳请解答:

  1. 为何出现该流量分配不均情况?
  2. 如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:41:08