在 Kubernetes 集群中,不同节点的 Pod IP 无法互相 ping
通,通常与 容器网络插件(如 Flannel)的配置 或 底层网络环境 有关。以下是逐步排查和解决方案:
1. 确认基础网络连通性
1.1 节点间网络互通
- 确保节点间通过 主机 IP 可以互相通信:
# 在节点A上 ping 节点B的主机IP ping <节点B的IP> # 检查 TCP 连通性(如 8472 端口) nc -zv <节点B的IP> 8472
- 如果节点间基础网络不通:
- 检查云平台安全组(如 AWS、阿里云)或物理防火墙规则。
- 确保节点位于同一子网且路由正确。
- 如果节点间基础网络不通:
1.2 开放 Flannel 所需端口
- Flannel 的 VXLAN 模式依赖 UDP 8472 端口:
# 使用 firewalld(CentOS/RHEL) sudo firewall-cmd --permanent --add-port=8472/udp sudo firewall-cmd --reload # 使用 ufw(Ubuntu) sudo ufw allow 8472/udp
2. 检查 Flannel 配置
2.1 确认 Flannel 的 Pod CIDR
- 查看 Flannel 的 ConfigMap 配置:
kubectl -n kube-system get configmap kube-flannel-cfg -o jsonpath='{.data.net-conf\.json}' | jq
- 确保
Network
字段与集群的 Pod CIDR 一致(如10.244.0.0/16
)。 - 如果与
kube-controller-manager
的--cluster-cidr
参数冲突,需调整一致。
- 确保
2.2 验证 Flannel 接口状态
- 检查每个节点的
flannel.1
接口:ip addr show flannel.1
- 确保接口存在且状态为
UP
。 - 如果接口不存在,重启 Flannel Pod:
kubectl -n kube-system delete pod -l app=flannel
- 确保接口存在且状态为
3. 检查路由表
3.1 查看节点的路由规则
- 每个节点应有其他节点 Pod 子网的路由条目:
正常输出示例:ip route show | grep flannel
10.244.1.0/24 via 10.244.1.0 dev flannel.1 10.244.2.0/24 via 10.244.2.0 dev flannel.1
- 如果路由缺失:
- Flannel 未能正确同步路由,检查 Flannel 日志。
- 手动添加路由(临时调试):
# 假设节点B的IP为 192.168.1.2,其Pod CIDR为 10.244.1.0/24 ip route add 10.244.1.0/24 via 192.168.1.2 dev eth0
- 如果路由缺失:
3.2 验证跨节点 ARP 表项
- 在节点A上查询节点B的 Pod IP 的 MAC 地址:
arp -n | grep 10.244.1.10 # 假设目标Pod IP为 10.244.1.10
- 如果无 ARP 条目,可能 VXLAN 隧道未建立。
3.2 正确的应该是
master 192.168.79.137
node01 192.168.79.138
node02 192.168.79.139
工作节点中有:主节点
主节点中:有两个工作节点
[root@master ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.79.138 ether 00:0c:29:a3:a0:82 C ens33
192.168.79.2 ether 00:50:56:eb:8c:a6 C ens33
10.244.2.0 ether 52:38:45:cf:cc:d8 CM flannel.1
192.168.79.1 ether 00:50:56:c0:00:08 C ens33
10.244.1.0 ether 6a:2d:87:b2:cc:ee CM flannel.1
10.244.0.7 ether c2:6d:b7:95:cd:78 C cni0
192.168.79.139 ether 00:0c:29:fe:7a:e2 C ens33
[root@node01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.244.2.0 ether 52:38:45:cf:cc:d8 CM flannel.1
192.168.79.137 ether 00:0c:29:fc:31:e0 C ens33
192.168.79.1 ether 00:50:56:c0:00:08 C ens33
192.168.79.2 ether 00:50:56:eb:8c:a6 C ens33
10.244.0.0 ether 2a:ce:1d:ec:09:a6 CM flannel.1
[root@node02 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.79.2 ether 00:50:56:eb:8c:a6 C ens33
10.244.0.0 ether 2a:ce:1d:ec:09:a6 CM flannel.1
10.244.1.0 ether 6a:2d:87:b2:cc:ee CM flannel.1
10.244.2.15 ether 1a:8a:fb:29:f8:c4 C cni0
10.244.2.16 ether 56:38:eb:93:31:f3 C cni0
192.168.79.137 ether 00:0c:29:fc:31:e0 C ens33
192.168.79.1 ether 00:50:56:c0:00:08 C ens33
4. 排查 Flannel 日志
- 查看 Flannel Pod 日志:
kubectl -n kube-system logs <flannel-pod-name> --tail=50
- 关注以下错误:
Failed to create VXLAN interface
:权限或内核模块问题。Failed to ensure iptables rules
:iptables 配置冲突。
- 关注以下错误:
5. 调整 MTU 设置
- MTU 不匹配可能导致分片丢包:
- 检查节点间网络设备的 MTU(如物理交换机、云网络):
ping -s 1472 -M do <目标IP> # 测试 MTU(1472 + 28 包头 = 1500)
- 修改 Flannel 的 MTU(通常比物理网络 MTU 小 50,如物理 MTU 1500 则设为 1450):
添加kubectl -n kube-system edit configmap kube-flannel-cfg
"mtu": 1450
到net-conf.json
:{ "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan", "mtu": 1450 } }
- 重启 Flannel Pod 使配置生效。
- 检查节点间网络设备的 MTU(如物理交换机、云网络):
6. 验证 Pod 间连通性
6.1 创建测试 Pod
在节点A和节点B上分别启动一个 Pod:
kubectl run pod-a --image=alpine --restart=Never -- sleep 3600
kubectl run pod-b --image=alpine --restart=Never -- sleep 3600
6.2 测试跨节点 Pod 通信
进入 pod-a
并 ping pod-b
的 IP:
kubectl exec -it pod-a -- ping <pod-b-ip>
- 如果仍不通:
- 在
pod-a
中抓包:kubectl exec -it pod-a -- tcpdump -i eth0 icmp
- 在目标节点(运行
pod-b
的节点)抓包:tcpdump -i flannel.1 icmp
- 在
7. 其他可能原因
7.1 内核模块未加载
- VXLAN 依赖
vxlan
内核模块:sudo modprobe vxlan lsmod | grep vxlan
7.2 网络策略(NetworkPolicy)限制
- 检查是否有 NetworkPolicy 阻止跨节点流量:
kubectl get networkpolicy -A
7.3 重新部署 Flannel
- 如果所有排查无效,尝试重新部署 Flannel:
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
总结
通过以上步骤,逐步排查以下问题:
- 节点间基础网络不通(防火墙、安全组、路由)。
- Flannel 配置错误(CIDR 冲突、MTU 不匹配)。
- 路由表缺失(Flannel 未能正确同步路由)。
- 内核或权限问题(VXLAN 模块未加载)。
若问题仍存在,考虑更换网络插件(如 Calico)或深入抓包分析流量路径。