这次基于我们安装包默认安装k8s的情景来讨论:
我们安装的K8s使用的插件是基于calico的网络插件实现跨主机的互联互通。
具体实现原理大家可以网络搜索,这里主要讨论如何去查询和测试的方法;
通过kubectl -n kube-system get po | grep calico 查看相关组件是否正常如图:
举一种情况例子是,服务器有多个物理网卡的情况会导致他选错网卡而使得他有问题。需要指定网卡命名规则:
命令打开calico-node的编辑界面:
kubectl -n kube-system edit daemonsets.apps calico-node
找到设置环境变量的部分:
添加配置:
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:
172.20.110.203:
如上图所示正常情况两边都能收到正常信息。
如果抓包是上图的情况下ping不通,应该是机器内设置不对或者组件工作不正常,没有正确的路由规则。着重排查机器内的原因。
若不能生成上图那要一来一回,而是只有出去的包没有回的包,在这样的情况可以推测大概率是宿主机外部的网络阻隔了,需要网络管理者协助。
在科普个网络包的进出顺序:
- 进来的顺序 Wire -> NIC(网卡) -> tcpdump -> netfilter/iptables
- 出去的顺序 iptables -> tcpdump -> NIC(网卡) -> Wire
推荐阅读