K8s不同节点的PodIp无法Ping通故障排查思路

在 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 不匹配可能导致分片丢包:
    1. 检查节点间网络设备的 MTU(如物理交换机、云网络):
      ping -s 1472 -M do <目标IP>  # 测试 MTU(1472 + 28 包头 = 1500)
      
    2. 修改 Flannel 的 MTU(通常比物理网络 MTU 小 50,如物理 MTU 1500 则设为 1450):
      kubectl -n kube-system edit configmap kube-flannel-cfg
      
      添加 "mtu": 1450net-conf.json
      {
        "Network": "10.244.0.0/16",
        "Backend": {
          "Type": "vxlan",
          "mtu": 1450
        }
      }
      
    3. 重启 Flannel Pod 使配置生效。

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
    

总结

通过以上步骤,逐步排查以下问题:

  1. 节点间基础网络不通(防火墙、安全组、路由)。
  2. Flannel 配置错误(CIDR 冲突、MTU 不匹配)。
  3. 路由表缺失(Flannel 未能正确同步路由)。
  4. 内核或权限问题(VXLAN 模块未加载)。

若问题仍存在,考虑更换网络插件(如 Calico)或深入抓包分析流量路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风水道人

写作不易且行且珍惜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值