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

OpenShift负载均衡异常求助:请求仅分发至单个OCP Pod

解决OpenShift中Python API请求仅分发至单个Pod的问题

以下是逐步排查和解决的方法:

1. 确认所有Pod处于就绪状态

Router只会将请求转发到就绪状态的Pod,先检查Pod的就绪情况:

  • 执行命令查看Pod状态:
    oc get pods
    
    确保所有3个Pod的READY列显示为1/1(需保证容器就绪探针配置正确)。
  • 如果有Pod未就绪,查看Pod事件排查原因:
    oc describe pod <未就绪的Pod名称>
    
    重点检查Readiness Gates或Liveness/Readiness Probe的失败记录,比如API服务启动慢、探针路径错误等。

2. 验证Service与Pod的关联(Endpoints)

Service通过标签选择器关联Pod,如果标签不匹配,会导致Endpoints只包含单个Pod:

  • 查看Service对应的Endpoints:
    oc get endpoints <你的服务名称>
    
    确认Subsets.Addresses列表中包含3个Pod的IP地址。
  • 检查Service的标签选择器:
    oc describe service <你的服务名称>
    
    对比Pod的标签(oc get pods --show-labels),确保两者的标签完全匹配。

3. 确认路由注解已生效

检查路由的注解是否正确应用到Router的配置中:

  • 查看路由的实际注解:
    oc describe route <你的路由名称>
    
    在Annotations部分确认haproxy.router.openshift.io/balance为roundrobin,haproxy.router.openshift.io/disable_cookies为"true"。
  • 查看Router的HAProxy配置,验证负载均衡策略:
    oc exec -n openshift-ingress <Router Pod名称> -- cat /var/lib/haproxy/conf/haproxy.cfg | grep -A 10 <你的路由后端名称>
    
    确认配置中存在balance roundrobin,且没有cookie相关的配置(因为已禁用)。

4. 排查客户端连接复用问题

如果客户端使用长连接复用(比如Python requests默认复用连接),HAProxy会将同一个长连接的所有请求转发到同一个Pod,导致看起来只有一个Pod在工作:

  • 测试时使用不同的客户端,或者强制关闭连接:
    • 使用curl测试:
      curl -H "Connection: close" <你的路由URL>
      
    • 在Python代码中禁用连接复用:
      import requests
      session = requests.Session()
      adapter = requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=1)
      session.mount('http://', adapter)
      # 每次请求后关闭会话
      response = session.get("<你的API URL>")
      session.close()
      
    多次测试后查看Pod的日志或监控,确认请求是否分发到不同Pod。

5. 检查Ingress Controller日志

查看Router Pod的日志,排查负载分发的异常:

oc logs -n openshift-ingress <Router Pod名称> | grep <你的路由域名>

搜索请求转发的记录,确认是否有尝试将请求分发到多个Pod的日志。


内容的提问来源于stack exchange,提问作者shwetha nayak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:16:06