K8s Service 无法访问与集群网络不通排查
2026-08-11 00:53:03
# Kubernetes
在集群内通过 Service 名称或 ClusterIP 访问后端 Pod 时超时、拒绝或 DNS 解析失败。Service 是 K8s 网络的枢纽,其不通通常集中在 Endpoint、kube-proxy、CoreDNS 与 NetworkPolicy 四个环节。
问题现象与背景原因
典型现象:
1 | # Pod 内访问 Service 名 |
常见根因:
- Endpoint 为空:Service 的 Selector 与后端 Pod 的标签不匹配,或后端 Pod 尚未
Ready,导致 Endpoint 列表为空,流量无处可去。 - kube-proxy 异常:kube-proxy 没起来或 iptables / IPVS 规则未生成,Service 的转发规则缺失。
- CoreDNS 故障:CoreDNS Pod 崩溃、ConfigMap 上游 DNS 配置错误,导致 Service 名无法解析。
- NetworkPolicy 拦截:命名空间或 Pod 上的 NetworkPolicy 规则拒绝了对该 Service / 端口的访问。
- 后端 Pod 本身不健康:即使网络通,后端应用没监听对应端口也会连接失败。
排查过程(思路与定位方法)
第一步:确认 Service 与 Endpoint 是否对应。 Endpoint 为空是最常见的「Service 不通」原因:
1 | kubectl get svc web |
若 ENDPOINTS 列为 <none>,说明没有就绪 Pod 匹配上。核对 Selector 与 Pod 标签:
1 | kubectl describe svc web | grep -A2 Selector |
第二步:验证 DNS 解析。 起一个临时 Pod 直接在集群内解析 Service 名,隔离「是 DNS 问题还是 IP 不通」:
1 | kubectl run dns-test --rm -it --image=busybox:1.36 --restart=Never -- sh \ |
若 nslookup 失败但用 ClusterIP 能通,则问题在 CoreDNS;若 ClusterIP 也不通,则是转发 / 后端问题。
第三步:检查 CoreDNS 与 kube-proxy。
1 | kubectl get pods -n kube-system | grep -E 'coredns|kube-proxy' |
第四步:检查转发规则(节点侧)。 确认 Service 的 iptables / IPVS 规则存在:
1 | # iptables 模式 |
提示:先查
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 | # 1. 看 Service 与 Endpoint |