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,返回端口开放提示即为连通正常。
- 验证HTTP服务可用性:进入UI Pod后执行
- 修正访问端口:如果需要通过ClusterIP访问USER服务,目标端口为Service暴露的80端口,流量会被自动转发到后端Pod的3000端口。
- 最佳实践:集群内服务互访优先使用Service DNS域名(格式为
服务名.命名空间.svc.cluster.local),不要使用固定ClusterIP,避免Service重建后ClusterIP变更导致访问异常。
内容的提问来源于stack exchange,提问作者Yashvardhan Nathawat
相关产品推荐
相关产品推荐

