记一次k8s的calico跨节点网络不通的问题及排错过程和解决方法

集群内部介绍:
集群内布有四个节点:

节点名称 主机IP
km1 192.168.1.1
kn1 192.168.1.2
kn2 192.168.1.3
kn3 192.168.1.4

网络不通的表征:
进入节点km1的pod,ping kn1-3节点上的pod的ip都不通,kn1-3节点ping km1也不通,但是kn1 kn2 kn3之间他们各自节点上的pod的ip之间是可以相互ping通。

排查过程:
这种情况让我们想起了当时设置路由转发时候的配置,因为我们的四台服务器,只有一个公网IP,我们把192.168.1.1设置为192.168.2~4去公网的网关,从而使整个集群都可以访问公网,我们设置了两块网卡,em3为内网网卡,em4为外网的网卡,同时公网网卡em4配置以公网的ip和掩码等配置,内网网卡配置以内网的ip等配置,路由转发配置如下:

设置路由转发,em3是内网网卡,em4是外网网卡
sudo firewall-cmd --change-interface=em3 --zone=internal --permanent
sudo firewall-cmd --change-interface=em4 --zone=external --permanent
sudo firewall-cmd --zone=internal --add-service=dns --permanent
sudo firewall-cmd --complete-reload
sudo firewall-cmd --list-all

所以我们有理由怀疑是因为当时配置的网卡的原因,导致的calico网络的不通
由于此原因,我们查看一下网卡和节点km1上的calico网络配置

km1网卡配置
记一次k8s的calico跨节点网络不通的问题及排错过程和解决方法_第1张图片

kn1节点的calico网络配置
查看calico命令:

DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config  calicoctl node status

记一次k8s的calico跨节点网络不通的问题及排错过程和解决方法_第2张图片
我们可以看到,在kn1节点上,peer address是两块网卡分配的,它分别符合两块网卡的网段,所以这可能是导致我们上述网络不通的原因

解决方法:
针对这个问题的解决办法,为我们强制让calico选择em3网卡进行通信,方法:

编辑calico.yaml找到name: IP,在它上面写入:

 - name: CLUSTER_TYPE
              value: "k8s,bgp"
            # 新增部分
            - name: IP_AUTODETECTION_METHOD
              value: "interface=em3"
            # value: "interface=eth.*"
            # value: "interface=can-reach=www.baidu.com"
            # 新增部分结束
            - name: IP
              value: "autodetect"
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"

在注释中还有2个写法,eth.*这个写法是GoLang的正则,它可以匹配到eth0、eth1等。can-reach将用第一个可以识别这个地址的network interface。
修改完calico.yaml后:

kubectl apply -f calico.yaml 

即可重新初始化caloco网络。

如果是多次执行过kubectl apply -f calico.yaml的主机,还应该清理cni文件:

rm -rf /var/lib/cni
kubectl apply -f calico.yaml 

注:
如果找不到calico.yaml文件,可以使用命令:

find / -name calico.yaml

此时,我们重新查看kn1上的calico网络状况(只能看到除kn1以外的km1、kn2、kn3节点的calico状况,也就是说,如果只有一个节点是查不到任何node status信息的)
记一次k8s的calico跨节点网络不通的问题及排错过程和解决方法_第3张图片
查看kn2上的calico网络状况
记一次k8s的calico跨节点网络不通的问题及排错过程和解决方法_第4张图片
可见ip已经重新都修改到em3网卡网段,节点kn3也已经修改完毕,重新测试各节点pod的ip之间的通信情况,完全可以ping通,完美

总结
查询各节点calico的网络配置,看ip是否在一个网段,如果不在一个网段,查看calico.yaml的网卡选择是否符合自己集群的网卡配置,不符合则修改之。

TIPS:
附几个排查calico问题比较好的博文
kubernetes calico网络不通的排查思路
calico 常见问题汇总

你可能感兴趣的:(kubernetes,calico,k8s,网络,kubernetes,linux)