今天发现k8s集群中不同Node上的pod不能互相ping通。调试了很长时间,发现是flannel的问题,记之。
问题一:对flannel backend的选择
flannel支持多种backend,包括host-gw, vxlan, udp。其中前两个比较常用,在我的集群中一开始随便选择了host-gw作为
backend。这种backend不会在节点上创建形如flannel.1的网卡,它对宿主机的网络有要求,它要求宿主机处于同一个二层网络里。
关于二层网络的定义,网上有很多,不再赘述。而vxlan则没有这个要求,它会在宿主机创建一个虚拟网卡,该网卡负责封装跨节点的
容器通信。
问题二:docker本身的问题
在将backend从host-gw切换至vxlan后,三个node中的两个node可以互相通信了,而第三个node接受不到另两个node上容器中的ping请求。
调试过程如下:
sudo tcpdump -i flannel.1 观察flannel网卡是不是收到报文,结果为已收到
sudo tcpdump -i docker0 观察docker0网卡是不是收到报文,结果为未收到
说明flannel网卡向docker0网卡提交报文时出了问题。
经过一番google,在https://github.com/coreos/flannel/issues/609中找到了解决办法,在节点上执行:
sudo iptables -P FORWARD ACCEPT