最近一直在处理k8s升级版本的事情,从1.20.0升级至1.23.5版本,途中踩到了很多坑,对遇到的一些问题进行简单归纳记录。
项目中部署k8s使用了ansible脚本,方便快捷,在升级过程中,对ansible脚本做了一些改动。这里我简单记录下自己更换k8s版本测试的过程。
环境准备
参考网上的k8s升级教程和项目实际情况,登陆每一个测试虚拟机,安装1.23.5版本的kubeadm、kubectl和kubelet,并登陆用作镜像服务的虚拟机,安装所需要的镜像,可以通过下面的命令查询所需要的镜像,kubeadm config images list --kubernetes-version v1.23.5
kubeadm init报错
在ansible脚本做好一些准备工作后,执行kubeadm init命令进行初始化操作。
提示错误 curl -sSL http://localhost:10248/healthz‘ failed with error
经查原因是驱动问题,即 docker的驱动与kubelet的驱动不一致
通过查询docker的方式为 cgroupfs
1.23.5版本下 kubelet 的驱动方式为 systemd
网上好多帖子的解决方案是修改docker驱动方式为 systemd
vim /etc/docker/daemon.json
加入 "exec-opts": [ "native.cgroupdriver=systemd" ]
修改后重启docker
systemctl daemon-reload
systemctl restart docker
修改后执行后续步骤提示安装成功
通过执行kubectl get nodes可以查看集群节点情况
到这里可能有人会误认为k8s集群安装成功了
但是可能还会有些异常
执行 kubectl get pods -n kube-system -o wide查询coredns、etcd等组件的安装情况
结果提示 flannel 安装异常,驱动方式不对
针对这种情况,我取消了上述将docker驱动方式为systemd的操作,而是选择修改kubelet的驱动方式为 cgroupfs
选择这种操作,一个原因是上述的flannel异常,另一个是查询了项目原先的kebelet1.20版本的驱动方式为cgroupfs,替换成开源的1.23.5版本后,变成了systemd
修改kubelet的驱动方式为cgroupfs的操作是在ansible脚本执行到 kubeadm init初始化阶段时修改对应的kubeadm-init.yaml文件,添加
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: cgroupfs
coredns pod 异常
当修改上述配置重新执行后,查询所有pod状态时,发现coredns有3个pod,一个running,2个pending
原因是测试环境只有2个woker,资源不够
coredns增加了应用的反亲和性,防止coredns调度到一台主机上,增强其可用性