Kubernetes集群无法ping通Pod IP、Service访问超时故障排查
Kubernetes Calico集群跨节点网络故障排查
集群基础配置
- 集群类型:自建Kubernetes集群
- Pod网段配置:
podSubnet: 172.168.0.0/12 - CNI网络插件:Calico
- 核心故障:所有Pod跨节点访问失败,Service业务端口访问异常
故障详情
1. 跨节点Pod IP连通性异常
在k8s-master01节点查询kube-system命名空间Pod实例,metrics-server-545b8b99c6-r2ql5调度在k8s-node02节点,Pod IP为172.171.14.193,在master节点执行ping测试100%丢包,完全不通。
相关操作输出:
# on k8s-master01 node: $ kubectl get po -n kube-system -o wide metrics-server-545b8b99c6-r2ql5 1/1 Running 0 5d1h 172.171.14.193 k8s-node02 <none> <none> # ping 172.171.14.193 -c 2 PING 172.171.14.193 (172.171.14.193) 56(84) bytes of data. ^C --- 172.171.14.193 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1016ms
2. 节点路由表采集
已采集两个故障节点的路由表信息:
- k8s-master01节点路由表:
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.180.104.1 0.0.0.0 UG 0 0 0 eth0 10.180.104.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.161.125.0 10.180.104.110 255.255.255.192 UG 0 0 0 tunl0 172.162.195.0 10.180.104.109 255.255.255.192 UG 0 0 0 tunl0 172.169.92.64 10.180.104.108 255.255.255.192 UG 0 0 0 tunl0 172.169.244.192 0.0.0.0 255.255.255.255 UH 0 0 0 cali06e1673851f 172.169.244.192 0.0.0.0 255.255.255.192 U 0 0 0 * 172.171.14.192 10.180.104.111 255.255.255.192 UG 0 0 0 tunl0
- k8s-node02节点路由表:
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.180.104.1 0.0.0.0 UG 0 0 0 eth0 10.180.104.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.169.254 10.180.104.11 255.255.255.255 UGH 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.161.125.0 10.180.104.110 255.255.255.192 UG 0 0 0 tunl0 172.162.195.0 10.180.104.109 255.255.255.192 UG 0 0 0 tunl0 172.169.92.64 10.180.104.108 255.255.255.192 UG 0 0 0 tunl0 172.169.244.192 10.180.104.107 255.255.255.192 UG 0 0 0 tunl0 172.171.14.192 0.0.0.0 255.255.255.192 U 0 0 0 * 172.171.14.193 0.0.0.0 255.255.255.255 UH 0 0 0 cali872eed170f4 172.171.14.194 0.0.0.0 255.255.255.255 UH 0 0 0 cali7d7625dd37e 172.171.14.203 0.0.0.0 255.255.255.255 UH 0 0 0 calid4e258f95f6 172.171.14.204 0.0.0.0 255.255.255.255 UH 0 0 0 cali5cf96eb1028
3. Service访问异常
基于demo-nginx工作负载创建ClusterIP类型Servicemy-service,测试发现ClusterIP可以ping通,但80端口连接超时。
相关操作输出:
# kubectl describe svc my-service Name: my-service Namespace: default Labels: <none> Annotations: <none> Selector: app=demo-nginx Type: ClusterIP IP Families: <none> IP: 10.100.75.139 IPs: 10.100.75.139 Port: http 80/TCP TargetPort: 80/TCP Endpoints: 172.161.125.14:80,172.161.125.15:80,172.171.14.203:80 Session Affinity: None Events: <none> # ping 10.100.75.139 -c 1 PING 10.100.75.139 (10.100.75.139) 56(84) bytes of data. 64 bytes from 10.100.75.139: icmp_seq=1 ttl=64 time=0.077 ms # nc -vz 10.100.75.139 80 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connection timed out.
根因定位
从路由表和故障现象判断,核心问题有两个:
- 网段冲突+Docker iptables规则干扰:配置的Calico Pod网段
172.168.0.0/12地址范围为172.160.0.0~172.175.255.255,完全覆盖Docker默认网桥的172.17.0.0/16网段。Docker服务默认会自动生成iptables转发规则,拦截非Docker网桥的网段转发流量,同时冲突的网段会导致部分路由转发异常,Calico下发的tunl0隧道转发规则被Docker规则覆盖。 - IPIP隧道流量可能被拦截:当前Calico使用IPIP模式(路由表存在tunl0接口),跨节点Pod流量会被封装为IP协议号4的报文在物理网络传输,如果节点本地防火墙、云平台安全组没有放通该协议流量,会导致封装后的报文被丢弃,跨节点通信失败。
补充说明:ClusterIP能ping通是因为ICMP报文由节点内核/kube-proxy直接响应,不经过后端Pod转发,所以不受跨节点隧道和Docker规则影响,才会出现能ping通但业务端口不通的现象。
修复步骤
- 所有节点调整Docker配置,解决网段冲突和iptables干扰
编辑所有节点的Docker配置文件/etc/docker/daemon.json,添加以下配置(bip字段请选择和现有物理网段、Pod网段、Service网段都不重叠的私网网段即可):
保存后执行以下命令重启Docker生效:{ "bip": "172.31.0.1/16", "iptables": false, "ip-masq": false }
重启后执行systemctl daemon-reload systemctl restart dockerip a show docker0确认网桥IP为新配置的网段,执行route -n确认原有172.17.0.0/16的路由条目消失。 - 放通集群节点间的网络策略
检查节点本地firewalld/iptables规则、云平台安全组配置,放通以下流量:- 所有集群节点物理IP之间的IP协议号4流量(IPIP隧道封装报文)
- 所有集群节点物理IP之间的TCP 179端口流量(Calico BGP协议使用,后续切换BGP模式时需要)
- 建议集群节点内部网络全放通,避免其他管控流量被拦截
- 重启Calico组件重新下发规则
在任意管控节点执行以下命令重启Calico DaemonSet,让网络规则、路由重新全量下发:
等待所有kubectl rollout restart daemonset calico-node -n kube-systemcalico-nodePod状态变为Running后,重新测试跨节点Pod ping、Service端口访问即可恢复。 - 修复校验
测试通过后可在任意节点执行route -n确认路由表中无冲突网段条目,跨节点Pod网段的路由均指向tunl0接口,下一跳为对应Pod所在节点的物理IP。
内容的提问来源于stack exchange,提问作者galaxy.liu
相关产品推荐
相关产品推荐

