k8s升级1.23.5版本踩坑笔记

542 阅读2分钟

最近一直在处理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镜像列表.png

kubeadm init报错

在ansible脚本做好一些准备工作后,执行kubeadm init命令进行初始化操作。

提示错误 curl -sSL http://localhost:10248/healthz‘ failed with error

经查原因是驱动问题,即 docker的驱动与kubelet的驱动不一致

通过查询docker的方式为 cgroupfs

docker 镜像.png

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调度到一台主机上,增强其可用性