GKE集群内Pod访问同集群Service端点出现连接错误求助
GKE集群Pod通过Service通信失败排查
问题描述
同一集群同一命名空间下的两个Pod,互相可通过Pod IP正常访问,DNS名称也能解析,但通过ClusterIP类型Service的端点(如http://service-name.namespace.svc.cluster.local)发起HTTP请求时,持续出现超时或“连接被拒绝”错误。
环境概述
- GKE集群:运行在GCP上的Kubernetes集群
- Pod:两个Pod部署在同一命名空间内
- Service:目标Pod通过ClusterIP类型Service暴露
- 网络状态:Pod间DNS解析正常、Pod IP访问正常,仅Service端点访问失败
相关资源YAML配置
LoadBalancer类型Service(dashboard)
apiVersion: apps/v1 kind: Deployment metadata: name: dashboard-deployment spec: replicas: 3 selector: matchLabels: app: dashboard template: metadata: labels: app: dashboard spec: containers: - name: <name of the image> image: <docker image name> ports: - containerPort: 8501 --- apiVersion: v1 kind: Service metadata: name: dashboard-service spec: selector: app: dashboard ports: - protocol: TCP port: 80 # port where the service is listening targetPort: 8501 # port where the pods are listening type: LoadBalancer
ClusterIP类型Service(inference)
apiVersion: apps/v1 kind: Deployment metadata: name: inference-deployment spec: replicas: 3 selector: matchLabels: app: inference template: metadata: labels: app: inference spec: containers: - name: <docker image> image: <docker image name> ports: - containerPort: 5000 # Port for Flask app name: http-port env: - name: WANDB_API_KEY value: WANDB_API_KEY_VALUE --- apiVersion: v1 kind: Service metadata: name: inference spec: selector: app: inference ports: - protocol: TCP port: 80 # Port for Flask app targetPort: 5000
排查步骤与解决建议
1. 验证Service与Pod的标签匹配
执行命令检查Service的选择器是否能正确匹配Pod:
kubectl get pods -n <你的命名空间> --show-labels kubectl describe service <服务名称> -n <你的命名空间>
确认Service的spec.selector字段和Pod的metadata.labels完全一致,大小写、空格等细微差异都会导致匹配失败。
2. 检查Service的Endpoint状态
Service的后端Endpoint是Pod的IP+端口集合,若为空则无法转发流量:
kubectl get endpoints <服务名称> -n <你的命名空间>
如果ENDPOINTS列为<none>,说明没有匹配到Pod,回到第一步检查标签;若有Endpoint,继续下一步。
3. 验证Service端口映射正确性
- 确认Service的
targetPort与容器实际监听端口一致:比如inference Service的targetPort是5000,需确认Flask应用确实在容器内监听5000端口,且不是仅监听127.0.0.1(仅本地回环的话Service无法访问)。 - 进入Pod内测试自身端口:
kubectl exec -it <Pod名称> -n <你的命名空间> -- curl localhost:5000
或查看容器端口监听情况:
kubectl exec -it <Pod名称> -n <你的命名空间> -- netstat -tulpn
4. 检查GKE网络策略
若集群启用了NetworkPolicy,可能会限制Pod到Service的流量:
kubectl get networkpolicies -n <你的命名空间>
查看是否有策略阻止发起请求的Pod访问目标Service的端口,如有则调整策略允许流量。
5. 验证kube-proxy状态
kube-proxy负责集群内Service的流量转发,检查节点上的kube-proxy Pod运行状态:
kubectl get pods -n kube-system -l k8s-app=kube-proxy
若有异常,查看日志排查:
kubectl logs <kube-proxy Pod名称> -n kube-system
6. 测试Service ClusterIP直接访问
在发起请求的Pod内,直接用Service的ClusterIP+端口测试:
kubectl exec -it <客户端Pod名称> -n <你的命名空间> -- curl <Service ClusterIP>:80
如果ClusterIP访问失败,说明Service转发逻辑有问题;若能访问,可能是域名访问时的额外问题(如HTTP请求Host头异常)。
内容的提问来源于stack exchange,提问作者prabhudotpy
相关产品推荐
相关产品推荐

