背景
在用 kubeadm+3台 CentOS 7 虚拟机(1 Master 2 Worker)搭建的k8s集群完成以后,我发现当虚拟机挂起后再恢复,k8s集群网络会出现问题,具体表现在service访问不了,pod之间ping不通等问题。而k8s集群还是能正常创建deployment以及调度pod到各个node上(node都处于 ready 的状态)。
这主要是由于我搭建k8s集群时使用的flannel网络插件出了问题的原因。
版本说明
使用vmware管理虚拟机,虚拟机的网络采用NAT模式
kubernetes(kubectl kubeadm kubelet): 1.18.3
go: 1.15.8 linux/amd64
docker-client、docker-server: 18.09.1
虚拟机OS:CentOS 7
参考 许大仙-从零搭建k8s集群 的第4部分-kubeadm搭建k8s集群,来搭建我的k8s集群
使用的网络插件:flannel,flannel的部署文件在:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注:以下方法或许只对我自己的本地环境生效,仅供参考,下面列出的命令可根据个人情况做一些修改。在照搬输入命令之前最好还是对k8s的service、flannel相关知识有个大致的了解。
解决方案
-
如果是虚拟机本身网络连接的问题(ping www.baidu.com 都不通),直接在终端输入reboot命令来重启虚拟机,一般就能好:
-
如果本身网络连接没问题,那么基本上就是flannel插件的问题了。看看node是不是缺少了flannel.1网络设备,输入ifconfig命令可看:
上图这个节点就没有flannel.1,以及cni0。
解决方法:(flannel的部署文件为master node的 ~/flannel/kube-flannel.yaml)
首先,在master node执行命令:kubectl delete -f flannel/kube-flannel.yaml
然后,在master node和所有worker node依次执行:
sudo ifconfig cni0 down
sudo ip link delete cni0
sudo ifconfig flannel.1 down
sudo ip link delete flannel.1
sudo rm -rf /var/lib/cni/flannel/*
sudo rm -rf /var/lib/cni/networks/cbr0/*
sudo rm -rf /var/lib/cni/cache/*
sudo rm -f /etc/cni/net.d/*
sudo systemctl restart kubelet
sudo systemctl restart docker
sudo chmod a+w /var/run/docker.sock
最后,在 master node 执行命令:kubectl apply -f flannel/kube-flannel.yaml
-
按上述方法创建以后,再在node上输入ifconfig命令,如果其有flannel.1,但是没有cni0(这个不算网络问题),那就在该node手动创建一个pod(保证在该node上运行)并且创建暴露该pod端点的service,cni0网桥就会被flannel自动创建出来。
-
节点上已有flannel.1和cni0,网络也都没问题了,大功告成: