ClusterIP Service无法向同标签的两个Deployment分发请求
问题原因与解决方案
问题本质
你遇到的不是Service配置问题,而是kubectl port-forward针对Service的工作机制导致的:
当执行kubectl port-forward service/demo 9999:8888时,Kubectl会从Service关联的Endpoints列表中随机选择一个Pod,直接建立本地端口到该Pod端口的转发通道——这个过程完全绕开了Service的kube-proxy负载均衡逻辑。因此所有请求都会固定打到同一个Pod,一旦该Pod被删除,转发连接就会直接中断,Kubectl不会自动切换到其他可用Pod。
验证Service负载均衡正常
你的Deployment和Service配置完全正确,标签匹配、Endpoints注册正常,Service本身的负载均衡功能是可用的。可以通过以下方式验证:
- 在集群内启动一个临时测试Pod,多次访问Service:
会看到返回的文本在两个Pod之间轮询切换(因为你的Servicekubectl run -it --rm --image=curlimages/curl curl-test -- sh # 在Pod内执行多次curl请求 curl demo:8888 curl demo:8888Session Affinity设置为None,默认轮询策略)。
本地测试负载均衡的替代方案
如果需要在本地测试Service的负载均衡效果,可以用以下方法:
使用
kubectl proxy
启动API Server代理:kubectl proxy然后通过以下URL访问Service,请求会经过Service的负载均衡:
http://localhost:8001/api/v1/namespaces/default/services/demo:8888/proxy/多次刷新就能看到不同Pod的返回内容。
手动切换Pod端口转发
分别转发两个Pod的端口,手动测试不同实例:# 转发第一个Pod kubectl port-forward demo-6cf4f66696-9kfqv 9999:8888 # 测试完成后停止,再转发第二个Pod kubectl port-forward raheel-demo-77c6fc76d6-dqrzg 9999:8888
内容的提问来源于stack exchange,提问作者Raheel
相关产品推荐
相关产品推荐

