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

DigitalOcean Kubernetes集群LoadBalancer轮询功能异常排查

问题排查与解决步骤

先确认基础状态

首先执行以下命令,确保集群内的资源状态正常:

  • 检查所有Pod是否正常运行:
    kubectl get pods -l app=user-service
    
  • 验证Service是否关联了所有Pod端点:
    kubectl describe service user-service
    
    查看输出中的Endpoints字段,确认数量与Deployment的replicas一致(你的Manifest里是3个,和你描述的4个副本可能存在笔误,以实际运行状态为准)。

可能的原因及解决方法

1. 客户端长连接导致的请求复用

Postman默认会保持HTTP长连接,而Kubernetes Service(iptables代理模式下)的负载均衡是基于TCP连接的——同一个连接内的所有请求都会被转发到同一个Pod。

解决方法:

  • 在Postman单个请求的Headers中,添加Connection: close,强制每次请求结束后断开连接;
  • 或者用curl测试(天然每次新建连接):
    for i in {1..10}; do curl -H "Connection: close" http://<你的负载均衡IP>:8080/你的接口路径; echo; done
    

2. DigitalOcean负载均衡器的会话亲和性开启

DigitalOcean的LoadBalancer默认可能开启了会话粘性,会把同一客户端IP的请求固定转发到同一个Pod。

解决方法:
修改Service的Manifest,添加注解关闭会话粘性:

apiVersion: v1
kind: Service
metadata:
  name: user-service
  annotations:
    service.beta.kubernetes.io/do-loadbalancer-sticky-sessions: "false"
spec:
  selector:
    app: user-service
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

然后重新应用配置:

kubectl apply -f 你的Service文件.yaml

3. 明确设置Service的会话亲和性策略

虽然Kubernetes默认sessionAffinity为None(轮询),但可以显式配置确保:
在Service的spec中添加:

spec:
  sessionAffinity: None

4. 检查Pod健康状态

如果部分Pod未处于Ready状态,Service会自动将其从端点列表中移除,导致请求集中到健康Pod上。
执行命令查看Pod的详细状态:

kubectl describe pods -l app=user-service

确认所有Pod的Ready状态为1/1,且Events中无错误信息。


集群内部验证

如果外部请求仍有问题,可以先测试集群内部的Service负载是否正常:

CLUSTER_IP=$(kubectl get service user-service -o jsonpath='{.spec.clusterIP}')
for i in {1..10}; do curl -H "Connection: close" http://$CLUSTER_IP:8080/你的接口路径; echo; done

如果集群内部能正常轮询,说明问题出在外部LoadBalancer或客户端配置;如果内部也异常,检查Service的标签选择器是否与Pod标签完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:05:23