容器云网络故障导致POD访问SVC超时,如何全面解析排查?

摘要:1. 故障背景 单节点Kubernetes集群升级操作系统内核版本、NVIDIA驱动与CUDA后重启服务器,引发容器云管理界面访问异常。核心环境如下: ​​组件版本​​: Ubuntu 5.19.0-40-gene
1. 故障背景   单节点Kubernetes集群升级操作系统内核版本、NVIDIA驱动与CUDA后重启服务器,引发容器云管理界面访问异常。核心环境如下: ​​组件版本​​: Ubuntu5.19.0-40-generic Kubernetes 1.21.5, Docker 27.5.1 网络插件:Flannel(Pod网段 10.233.64.0/18、Svc网段10.233.0.0/18) 域名解析:CoreDNS + NodeLocalDNS 代理模式:Kube-Proxy ipvs模式 ​​关键现象​​: Pod可互访​​Pod IP​​,宿主机可访问​​Service IP​​与​​Pod IP​​,但Pod内部访问​​Service IP超时​​(如 10.233.36.146:6379)。 2. 问题排查 阶段一:基础状态检查​ (1)防火墙确认:ufw status 显示inactive(排除防火墙拦截) (2)核心组件状态: kubectl get pods -n=kube-system # 所有组件Running kubectl get pods -n=容器云核心组件-system # 发现apiserver报错 (3)日志线索定位: kubectl logs -f -n=容器云核心组件-system apiserver-68654cdc5-gg88b 关键报错: Error: failed to connect to redis service, please check redis status, error: dial tcp 10.233.36.146:6379: i/o timeout 2025/07/29 17:22:08 failed to connect to redis service, please check redis status, error: dial tcp 10.233.36.146:6379: i/o timeout 结论:DNS解析正常(域名→Service IP),但Service流量不通。 (4)排查redis服务运行情况: kubectl get pods -n=容器云公共组件-system |grrp redis Redis容器运行状态正常,容器日志也正常,将Redis Svc改成NodePort模式,通过本地Redis客户端工具也能正常连接Redis服务,说明Redis服务是正常的。 阶段二:网络分层验证 客户端: bubybox容器或者宿主机 服务端: 集群里正常运行的Nginx服务 测试类型​​​​操作命令​​​​结果​​​​推断​​ ​​Pod→Pod IP​​ kubectl exec -it busybox -- telnet <PodIP> 80 ✅ 成功 Flannel底层网络正常 ​​Pod→Service IP​​ kubectl exec -it busybox -- telnet <SvcIP> 80 ❌ 超时 Service层异常 ​​宿主机→Service​​ telnet <SvcIP> 80 ✅ 成功 kube-proxy规则对宿主机有效 关键矛盾点​​: IPVS规则存在(ipvsadm -Ln | grep <SvcIP> 显示正常DNAT) 但Pod流量无法穿透Service 注意: 如果使用的是iptables规则使用iptables-save | grep <service-name>命令排查Kube-Proxy组件是否生成了SvcIP转PodIP规则。 阶段三:抓包与内核层深挖​ (1)​​抓包分析(Pod侧)​​ 同时打开2个shell,都进入busybox容器内部,其中一个shell执行tcpdump命令进行抓包,另一个shell执行telnetnginx_svcIp(10.233.42.160) 80命令。 tcpdump -i any 'host 10.233.42.160 and tcp port 80' -w svc_capture.pcap 抓包结束后使用kubectl cp或者docker cp命令将抓的包拷贝到宿主机上再使用sftp工具下载到本地用wireshark分析,发现源地址到不了目标svcIP。 结论: 持续发送SYN包 → ​​零响应​​(无RST/SYN-ACK),排除目标拒绝,指向​​中间层拦截​​。
阅读全文