集群内部介绍:
集群内布有四个节点:
节点名称 | 主机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网络配置:
kn1节点的calico网络配置:
查看calico命令:
DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl node status
我们可以看到,在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信息的):
查看kn2上的calico网络状况:
可见ip已经重新都修改到em3网卡网段,节点kn3也已经修改完毕,重新测试各节点pod的ip之间的通信情况,完全可以ping通,完美。
总结:
查询各节点calico的网络配置,看ip是否在一个网段,如果不在一个网段,查看calico.yaml的网卡选择是否符合自己集群的网卡配置,不符合则修改之。
TIPS:
附几个排查calico问题比较好的博文
kubernetes calico网络不通的排查思路
calico 常见问题汇总