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

K8s集群内Pod无法访问ClusterIP类型Service问题咨询

问题现象
  • 集群default命名空间内部署了UI、USER两个应用工作负载,二者均通过ClusterIP类型Service暴露服务,同时配置Ingress资源实现两个服务的公网访问。
  • 执行命令kubectl exec -it UI-POD -- /bin/sh进入UI服务对应Pod后,尝试ping USER服务的ClusterIP地址加端口(USER-SERVICE-CLUSTER-IP:PORT)时访问失败,无任何数据包返回。

相关资源YAML配置如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service-app
  labels:
    app: user-service-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user-service-app
  template:
    metadata:
      labels:
        app: user-service-app
    spec:
      containers:
      - name: user-service-app
        image: <MY-IMAGE-URL>
        imagePullPolicy: Always
        ports:
        - containerPort: 3000
        livenessProbe:
          httpGet:
            path: /ping
            port: 3000
        readinessProbe:
          httpGet:
            path: /ping
            port: 3000
          
          

---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "user-service-svc"
  namespace: "default"
  labels:
    app: "user-service-app"
spec:
  type: "ClusterIP"
  selector:
    app: "user-service-app"
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 3000

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ui-service-app
  labels:
    app: ui-service-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ui-service-app
  template:
    metadata:
      labels:
        app: ui-service-app
    spec:
      containers:
      - name: ui-service-app
        image: <MY-IMAGE-URL>
        imagePullPolicy: Always
        ports:
        - containerPort: 3000

---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "ui-service-svc"
  namespace: "default"
  labels:
    app: "ui-service-app"
spec:
  type: "ClusterIP"
  selector:
    app: "ui-service-app"
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 3000
  


---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: awesome-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  defaultBackend:
    service:
      name: ui-service-svc
      port:
        number: 80
  rules:
  - http:
      paths:      
      - path: /login
        pathType: Prefix
        backend:
          service:
            name: ui-service-svc
            port:
              number: 80
      - path: /user(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: user-service-svc
            port:
              number: 80
故障原因
  • 探测工具使用错误:ping基于ICMP协议工作,不支持指定端口探测,也无法被K8s Service的四层转发规则处理。K8s ClusterIP是kube-proxy通过iptables/ipvs生成的虚拟IP,仅对TCP、UDP协议的流量做负载转发,ICMP报文不会被转发规则匹配,因此带端口ping ClusterIP本身就是错误操作,必然无响应。
  • 访问逻辑误解:Ingress仅负责公网入口的七层流量转发,Pod之间的内网访问不需要经过Ingress,当前Ingress配置和集群内服务互访失败无关。
  • 端口匹配错误:从配置看,USER服务对应的Service将自身80端口映射到后端容器的3000端口,集群内访问时需要访问Service的80端口,而非直接访问容器的3000端口。
解决方法
  • 更换连通性探测工具:禁止用ping验证K8s Service连通性,改用对应协议的探测工具:
    • 验证HTTP服务可用性:进入UI Pod后执行curl http://user-service-svc.default.svc.cluster.local/ping,返回正常响应即说明服务连通正常。
    • 验证TCP端口连通性:执行nc -zv user-service-svc 80,返回端口开放提示即为连通正常。
  • 修正访问端口:如果需要通过ClusterIP访问USER服务,目标端口为Service暴露的80端口,流量会被自动转发到后端Pod的3000端口。
  • 最佳实践:集群内服务互访优先使用Service DNS域名(格式为服务名.命名空间.svc.cluster.local),不要使用固定ClusterIP,避免Service重建后ClusterIP变更导致访问异常。

内容的提问来源于stack exchange,提问作者Yashvardhan Nathawat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:01:28