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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:14:50