K8s Service 无法访问与集群网络不通排查
2026-08-11 00:53:03 # Kubernetes

在集群内通过 Service 名称或 ClusterIP 访问后端 Pod 时超时、拒绝或 DNS 解析失败。Service 是 K8s 网络的枢纽,其不通通常集中在 Endpoint、kube-proxy、CoreDNS 与 NetworkPolicy 四个环节。

问题现象与背景原因

典型现象:

1
2
3
4
5
6
7
# Pod 内访问 Service 名
curl http://web.default.svc.cluster.local
curl: (6) Could not resolve host: web.default.svc.cluster.local

# 或访问 ClusterIP 超时
curl http://10.96.0.10
curl: (28) Connection timeout

常见根因:

  1. Endpoint 为空:Service 的 Selector 与后端 Pod 的标签不匹配,或后端 Pod 尚未 Ready,导致 Endpoint 列表为空,流量无处可去。
  2. kube-proxy 异常:kube-proxy 没起来或 iptables / IPVS 规则未生成,Service 的转发规则缺失。
  3. CoreDNS 故障:CoreDNS Pod 崩溃、ConfigMap 上游 DNS 配置错误,导致 Service 名无法解析。
  4. NetworkPolicy 拦截:命名空间或 Pod 上的 NetworkPolicy 规则拒绝了对该 Service / 端口的访问。
  5. 后端 Pod 本身不健康:即使网络通,后端应用没监听对应端口也会连接失败。

排查过程(思路与定位方法)

第一步:确认 Service 与 Endpoint 是否对应。 Endpoint 为空是最常见的「Service 不通」原因:

1
2
kubectl get svc web
kubectl get endpoints web

ENDPOINTS 列为 <none>,说明没有就绪 Pod 匹配上。核对 Selector 与 Pod 标签:

1
2
kubectl describe svc web | grep -A2 Selector
kubectl get pods --show-labels -n default

第二步:验证 DNS 解析。 起一个临时 Pod 直接在集群内解析 Service 名,隔离「是 DNS 问题还是 IP 不通」:

1
2
kubectl run dns-test --rm -it --image=busybox:1.36 --restart=Never -- sh \
-c 'nslookup web.default.svc.cluster.local'

nslookup 失败但用 ClusterIP 能通,则问题在 CoreDNS;若 ClusterIP 也不通,则是转发 / 后端问题。

第三步:检查 CoreDNS 与 kube-proxy。

1
2
3
kubectl get pods -n kube-system | grep -E 'coredns|kube-proxy'
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50
kubectl get configmap coredns -n kube-system -o yaml

第四步:检查转发规则(节点侧)。 确认 Service 的 iptables / IPVS 规则存在:

1
2
3
4
5
# iptables 模式
sudo iptables-save | grep <service-cluster-ip>

# IPVS 模式
sudo ipvsadm -Ln | grep <service-cluster-ip>

提示:先查 endpoints 再查 dns 再查 kube-proxy,按顺序能区分「没后端」「解析不了」「规则没生成」三类问题。

最终的解决方法

  • Endpoint 为空:修正 Service 的 selector 使其与 Pod 标签一致;确认后端 Pod 处于 Running 且通过 readinessProbe(否则不会进入 Endpoint)。必要时给 Pod 补 labels
  • CoreDNS 故障:重启 CoreDNS(kubectl rollout restart deployment coredns -n kube-system);修正 ConfigMap 中的 forward 上游 DNS;确保 CoreDNS 所在节点网络正常。
  • kube-proxy 异常kubectl rollout restart daemonset kube-proxy -n kube-system;检查 kube-proxy 日志确认选用的 mode(iptables / ipvs)。
  • NetworkPolicy 拦截:在对应命名空间增派放通规则,允许源 Pod 访问目标 Service 的端口;排错时可临时删除 Policy 验证。
  • 后端不通:确认应用实际监听的端口与 Service 的 targetPort 一致。

操作命令(可直接复制执行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1. 看 Service 与 Endpoint
kubectl get svc <svc-name>
kubectl get endpoints <svc-name>

# 2. 核对 selector 与 Pod 标签
kubectl describe svc <svc-name> | grep -A2 Selector
kubectl get pods --show-labels -n <namespace>

# 3. 集群内 DNS 解析测试
kubectl run dns-test --rm -it --image=busybox:1.36 --restart=Never -- sh \
-c 'nslookup <svc-name>.<namespace>.svc.cluster.local'

# 4. 检查 CoreDNS / kube-proxy
kubectl get pods -n kube-system | grep -E 'coredns|kube-proxy'
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50

# 5. 节点侧转发规则
sudo iptables-save | grep <cluster-ip>
sudo ipvsadm -Ln | grep <cluster-ip>

# 6. 重启相关组件
kubectl rollout restart deployment coredns -n kube-system
kubectl rollout restart daemonset kube-proxy -n kube-system