当跨主机间容器间网络无法联通的思路原创
金蝶云社区-黄辉_2914
黄辉_2914
2人赞赏了该文章 589次浏览 未经作者许可,禁止转载编辑于2021年06月30日 16:24:41

这次基于我们安装包默认安装k8s的情景来讨论:

   我们安装的K8s使用的插件是基于calico的网络插件实现跨主机的互联互通。

   具体实现原理大家可以网络搜索,这里主要讨论如何去查询和测试的方法;

通过kubectl -n kube-system get po | grep calico  查看相关组件是否正常如图:

image.png


举一种情况例子是,服务器有多个物理网卡的情况会导致他选错网卡而使得他有问题。需要指定网卡命名规则:

命令打开calico-node的编辑界面:

 kubectl -n kube-system edit daemonsets.apps calico-node

找到设置环境变量的部分:

image.png

添加配置:

- name: IP_AUTODETECTION_METHOD
  value: "interface=eth.*"
添加完的样子:


image.png


PS:我这里写的是网卡名字的正则,这里代表的是所有的宿主机要相同的物理网卡名字。这里说的情况是宿主机有多网卡的情况。


若通过kubectl -n kube-system get po | grep calico命令检查发现组件完好,容器间跨机器仍然无法访问。

这时可以通过抓ping包解决问题,例子:

机器1IP计算机名node202:172.20.110.202

机器2IP计算机名node203:172.20.110.203 机器2中的容器IP:10.20.100.141

用机器1ping机器2的容器,然后通过命令(tcpdump -i ens33(网卡名) icmp)抓取信息:

这是正常情况两台机器收到的信息:

172.20.110.202:

image.png

172.20.110.203:

image.png

如上图所示正常情况两边都能收到正常信息。

如果抓包是上图的情况下ping不通,应该是机器内设置不对或者组件工作不正常,没有正确的路由规则。着重排查机器内的原因。

若不能生成上图那要一来一回,而是只有出去的包没有回的包,在这样的情况可以推测大概率是宿主机外部的网络阻隔了,需要网络管理者协助。


在科普个网络包的进出顺序:

  • 进来的顺序 Wire -> NIC(网卡) -> tcpdump -> netfilter/iptables
  • 出去的顺序 iptables -> tcpdump -> NIC(网卡) -> Wire


赞 2