记一次Flannel排错处理

容器跨主机的解决方案很多种,其中常用的有calico、flannel等。最近flannel配好后,发现跨主机容器依旧不能通信,下面简单说一下排错过程。

情景再现:

两台节点,节点1和节点2.

节点1 IP: 10.0.5.3 容器IP: 172.17.22.2

节点2 IP:10.0.5.1 容器IP: 172.17.92.3

在172.17.22.2这个容器中 ping 对方主机 10.0.5.1发现能通,然而 ping 172.17.92.3 发现不能通。

从容器ping对方主机能通,我们可以判断数据包从容器的eth0—->docker0—->flannel0—->对方宿主机的网卡 这条路是没有问题的。

而跨主机容器互ping不通,那么可以判断数据包在到达对方宿主机的网卡上后,从flannel0—->docker0这条线路出了问题。

  • 第一步 可以先看看两台宿主机的路由表:

节点1

节点2

从路由表上来看,是没有问题的。

  • 第二步 检查主机上ip_forward功能是否开启

#sysctl -a|grep ip_forward

我在检查的时候发现两台主机上的ip_forward都是开启的

  • 第三步 查看iptables

#iptables -nvL

发现Forward链上的策略是DROP,如下图所示:

修改策略# iptables -P FORWARD ACCEPT

然后再测试,发现跨主机容器也可以正常通信了。

补充:关于linux下的数据包转发。一般情况下,处于安全考虑。linux系统默认禁止数据包转发。当linux系统拥有不止一块网卡的时候,其中某一块网卡收到数据包后,会根据数据包的目的IP地址将其转发到本机另一块网卡上。可通过修改/proc/sys/net/ipv4/ip_forward进行修改,1代表打开,0代表禁止。