# Kubernetes Service 间歇性访问失败:CoreDNS、kube-proxy、CNI 与 MTU 排查
Service 偶发超时最难排查,因为 Pod 看起来正常,重试又可能成功。建议沿着“域名解析—Service 转发—Pod 网络—宿主机网络—应用监听”逐层缩小范围。
## 一、先固定故障边界
记录调用方 Pod、目标域名、Service、端口、协议、失败时间和比例。分别测试 Service 域名、ClusterIP、Pod IP 和同节点 Pod IP。
```bash
kubectl get svc,endpoints,endpointslices -A -o wide
kubectl run net-debug --rm -it --image=nicolaka/netshoot -- bash
dig +time=2 +tries=1 api.default.svc.cluster.local
curl -sv --connect-timeout 3 http://<cluster-ip>:<port>/health
curl -sv --connect-timeout 3 http://<pod-ip>:<port>/health
```
只有域名失败,重点看 CoreDNS;ClusterIP 失败但 Pod IP 正常,重点看 kube-proxy/IPVS;Pod IP 也失败,重点看 CNI、路由、策略和宿主机。
## 二、检查端点和就绪状态
确认 Service selector 是否选中正确 Pod,EndpointSlice 中是否存在过期地址,readinessProbe 是否频繁抖动。
```bash
kubectl describe svc <svc> -n <ns>
kubectl get endpointslice -n <ns> -l kubernetes.io/service-name=<svc> -o yaml
kubectl get pod -n <ns> -o wide
kubectl describe pod <pod> -n <ns>
```
如果滚动发布期间失败,检查 terminationGracePeriodSeconds、preStop、就绪探针和负载均衡摘除时序。
## 三、检查 CoreDNS
```bash
kubectl -n kube-system get pod -l k8s-app=kube-dns -o wide
kubectl -n kube-system logs -l k8s-app=kube-dns --tail=200
kubectl -n kube-system top pod -l k8s-app=kube-dns
```
关注超时、SERVFAIL、上游 DNS 不可达、缓存击穿和 CPU throttling。必要时临时扩容 CoreDNS,但扩容前应确认节点和网络没有共同故障。
## 四、检查 kube-proxy 与连接跟踪
iptables 模式检查规则是否存在;IPVS 模式检查虚拟服务和真实服务器。
```bash
iptables-save | grep <cluster-ip>
ipvsadm -Ln --stats
conntrack -S
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
```
连接跟踪表接近上限、规则同步失败或 kube-proxy 反复重启,都会导致间歇性丢包。
## 五、检查 CNI、NetworkPolicy 与 MTU
查看 CNI Agent 日志、节点路由和接口错误。跨节点失败、同节点正常时尤其要检查隧道 MTU。
```bash
ip route
ip -s link
ping -M do -s 1400 <pod-ip>
tracepath <pod-ip>
kubectl get networkpolicy -A
```
如果小包正常、大响应超时,常见原因是 VXLAN/IPIP 封装后超过底层 MTU,而 ICMP 又被防火墙拦截。
## 六、止血和验证
先隔离异常节点、扩容健康副本、暂停发布,再针对故障层处理。修复后至少验证:DNS 连续解析、跨节点访问、长连接、滚动发布、峰值并发和大包传输,并持续观察 30 分钟错误率与重传率。