DigitalOcean Kubernetes集群LoadBalancer轮询功能异常排查
问题排查与解决步骤
先确认基础状态
首先执行以下命令,确保集群内的资源状态正常:
- 检查所有Pod是否正常运行:
kubectl get pods -l app=user-service - 验证Service是否关联了所有Pod端点:
查看输出中的kubectl describe service user-serviceEndpoints字段,确认数量与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
相关产品推荐
相关产品推荐

