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

如何在Kubernetes中实现请求到Pod副本的均匀分发?

问题分析与解决方案

核心问题定位

你的场景里请求分发不均、并行效率低于串行,核心原因是流量未按预期的轮询策略分发到所有Pod,结合提供的YAML和RKE2集群环境,以下是关键排查点和落地修复方案:


0. 先确认Pod扩容生效

你的Deployment配置中replicas: 1,但你提到有20个服务Pod,先确保已完成扩容并验证状态:

# 扩容Pod到20个
kubectl scale deployment alignment-deployment --replicas=20 -n development
# 检查所有Pod是否正常运行
kubectl get pods -n development -l app=alignment

需确认20个Pod均处于Running状态。


1. 部署配置的致命限制:固定节点调度

你的Deployment模板中设置了spec.template.spec.nodeName: m21429.contaboserver.net,这会强制所有Pod调度到同一个节点,直接引发两个问题:

  • 所有Pod共享单节点资源,即使扩容到20个也无法利用集群多节点算力
  • 同节点内的Pod网络会触发kube-proxy的本地路由优化,跳过轮询逻辑,导致请求集中到少数Pod

修复方案:
删除Deployment中的nodeName字段,让Kubernetes自动将Pod调度到空闲的worker节点:

# 移除这一行配置
# nodeName: m21429.contaboserver.net

2. Service选择器的语法错误

检查你的Service selector字段:

selector:
    app: alignment

这里的app键前存在不可见的全角空格/特殊字符,导致Kubernetes无法正确匹配Pod标签,Service只能识别到部分Pod,自然无法全部分发流量。

修复方案:
修正selector格式,使用标准半角空格:

selector:
  app: alignment

3. RKE2 kube-proxy模式与长连接复用

RKE2默认使用iptables模式kube-proxy,但如果调用API的客户端开启了HTTP长连接复用,会打破轮询策略:TCP连接建立后,iptables规则会固定该连接的路由,后续请求会复用同一连接,持续发送到同一个Pod。而你的API单次计算需3分钟,客户端极大概率会复用连接,导致少数Pod接收多个并行请求。

解决方法:

  • 客户端侧:关闭长连接或设置短连接超时,确保每次请求新建连接(比如Python requests添加Connection: close请求头)
  • 集群侧:切换到ipvs模式kube-proxy,IPVS支持更灵活的负载均衡策略,对长连接的分发逻辑更友好:
    # 编辑RKE2配置文件(/etc/rancher/rke2/config.yaml)
    echo "kube-proxy-arg:
      - proxy-mode=ipvs
      - ipvs-scheduler=rr" >> /etc/rancher/rke2/config.yaml
    # 重启RKE2服务
    systemctl restart rke2-server rke2-agent
    

4. 验证负载均衡效果

修复后,验证Service是否正确关联所有Pod,以及流量分发情况:

# 查看Service关联的Pod端点数量,应等于20
kubectl get endpoints alignment-service -n development
# 模拟20次请求,查看Pod日志确认分发情况(需在API中添加请求ID或日志追踪)
for i in {1..20}; do curl -s http://alignment-service.development.svc.cluster.local:8000/your-api-route; done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:25:03