Kubernetes Service仅转发流量至单个Pod的问题排查求助
问题原因与解决方案
核心问题:kubectl port-forward不支持Service负载均衡
你遇到的问题本质是kubectl port-forward svc/car-registry-service 9000:9000的工作机制导致的:
- port-forward是直接在本地机器和集群内单个Pod之间建立隧道,完全绕过了Kubernetes Service的负载均衡逻辑(kube-proxy的iptables/IPVS规则)。
- 一旦绑定的那个Pod被删除,隧道直接断开,自然返回空响应,哪怕其他Pod正常运行也不会自动切换目标。
解决方法
方法1:在集群内部测试Service负载均衡
这是验证Service负载均衡最准确的方式,直接在集群里启动临时Pod访问Service:
kubectl run -it --rm --image=curlimages/curl curl-test -- curl car-registry-service:9000/version
多执行几次这个命令,就能看到请求被轮询转发到不同Pod,返回不同的Pod名称。
方法2:用NodePort/LoadBalancer暴露服务(本地测试负载均衡)
如果需要从本地机器验证负载均衡,可修改Service类型为NodePort:
apiVersion: v1 kind: Service metadata: name: car-registry-service spec: type: NodePort selector: app: car-registry ports: - protocol: TCP port: 9000 targetPort: 9000 nodePort: 30090 # 可选,端口范围需在30000-32767之间
然后通过Kind节点IP+NodePort访问:
curl $(kubectl get nodes -o jsonpath='{.items[0].status.addresses[0].address}'):30090/version
多次访问即可看到负载均衡效果。如果想用LoadBalancer,Kind可搭配MetalLB组件实现。
方法3:确认Pod就绪状态
虽然你提到还有4个可用Pod,仍可先确认所有Pod的就绪状态:
kubectl get pods
确保所有Pod的READY列都是1/1,未就绪的Pod不会被Service纳入流量转发范围。
内容的提问来源于stack exchange,提问作者brtk
相关产品推荐
相关产品推荐

