前言
近期在测试环境k8s集群发现Calico的节点出现了异常,状态一直处于连接中,而且node节点的ip也出现了变化。
于是对此次处理过程进行记录。这个异常不具备普遍性,因此文档仅供参考。
发现在Calico 异常的node节点上,出现了大量的br开头的以及一些其他的虚拟网卡和虚拟ip. 应该是这些ip导致的。由于具体排查和处理需要大量的时间,为了不影响服务,先把异常节点下线。
备注:
可查看异常pod日志,再处理问题
kubectl logs calico-node-f846j -n kube-system
日志中能看到也不过是与172.19.0.1的ip网络不通而已.node2的存在网络问题。
去除异常节点
<1>驱除异常节点上的服务
Master上操作:
kubectl drain 异常node的IP/主机名 --delete-local-data --force --ignore-daemonsets
kubectl drain node2 --delete-local-data --force --ignore-daemonsets
驱除后查看Pod是否成功迁移到其他节点:
kubectl get pods -A -o wide
<2>驱除异常节点上的服务
Master上操作:
kubectl delete node 异常node的IP/主机名
kubectl delete node node2
删除后查看该node是否去除:
kubectl get nodes
<3>清除节点信息
去异常的node上操作:
kubeadm reset
iptables -nL
iptables -F
iptables -X
iptables -Z
必须执行。否则重新加入集群会报错
处理异常
清除节点信息后,k8s部署产生的ip都消失了。br开头的虚拟网卡仍然存在。
查看端口信息后,发现上面存在一个docker-compose部署的harbor。应该是docker-compose创建的。
清理一下网络环境(harbor之后会移到别的位置)
<1>停止docker-compose服务
cd harbor
docker-compose stop
查看发现br开头的网卡仍然存在
<2>重启docker
systemctl restart docker
<3>删除多余网桥
ifconfig br-0aab8223549c down
ip link set br-0aab8223549c down
ip link delete br-0aab8223549c
or
yum install bridge-utils
brctl delbr br-0aab8223549c
重新加入集群
<1>生成加入集群的token命令
Master上执行:
kubeadm token create --print-join-command
通常一个token的使用时间的24小时,因此即使是保存着创建集群时的token也没用。需要重新生成。
查看token:
kubeadm token list (当token过期时,就查询不到内容.可使用kubeadm token create ,这个仅生成token)
<2>去需要加入集群的node执行,上方生成的命令即可
<3>查看是否加入集群
kubectl get nodes
kubectl get pods -A -o wide
calicoctl node status
接着,重新部署一下calico及其他服务即可
问题原因
原因:
Calico的yml配置存在问题;
K8s集群中有一个节点部署了Harbor,由于调整了docker配置文件并重启后。 Calico获取的PEER ADDRESS为docker-compose创建的网卡的IP。导致其与k8s集群网络不通。
(如果使用默认的Calico.yml文件。在ip较多,网络环境较复杂的情况,重启docker等服务后,极易出现此问题,绑定到的可能不是你想使用的地址。因此在K8s集群中,不建议再去一些创建其他的网络环境)
解决方法:
可以强制让calico选择某网卡进行通信
<1>编辑calico.yaml找到name: CLUSTER_TYPE,新增加内容:
- name: CLUSTER_TYPE
value: "k8s,bgp"
# 新增部分
- name: IP_AUTODETECTION_METHOD
value: "interface=eth0"
# value: "interface=eth.*"
# value: "interface=can-reach=www.baidu.com"
# 新增部分结束
- name: IP
value: "autodetect"
- name: CALICO_IPV4POOL_IPIP
value: "Always"
<2>重新初始化caloco网络
kubectl apply -f calico.yaml
or
rm -rf /var/lib/cni
kubectl apply -f calico.yaml