使用kubeadm将k8s从1.23.x升级到1.24.x
一、背景描述
现有k8s环境是使用kubeadm部署的k8s1.23.9环境,使用的网络解决方案是flannel,k8s节点使用的Centos 7.9.2009-amd64 虚拟机,k8s节点的容器运行时使用是的Docker。k8s1.23.9集群一共有3个节点,详情如下(升级前集群是否正常可用的,图是后面临时截取的,所以状态可以忽略):

目的是在联网的情况下,使用kubeadm升级到k8s1.24.2。但Kubernetes从1.20版本开始已经弃用了DockerShim,并在1.24版本移除了DockerShim,后续如果需要使用Docker作为容器运行时(Container Runtime),需要安装cri-docker,即一个CRI(Container Runtime Interface)的实现。因为并不能直接使用kubeadm将集群升级到k8s1.24.2,但在执行一些针对容器运行时的安装配置后就可以了。具体步骤如下。
同时还需注意,使用kubeadm升级k8s集群时不支持跨大版本升级。打个比方,如果要从k8s1.23.x 升级到k8s1.25.x,就需要先从k8s1.23.x 升级到k8s1.24.x,然后再从k8s1.24.x 升级到k8s1.25.x。如果想在此文档的基础上将k8s升级到更版本,就需要一级一级往上升,不能跳级(可能kubeadm不承认天才吧,哈哈^_^)!
参考:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
二、升级步骤
2.1 安装cri-dockerd(所有节点)
1 |
|
1 |
|
1 |
|
1 |
|
2.2 Master 节点操作
2.2.1 升级 kubeadm
1 |
|
2.2.2 查看升级计划
1 |
|

2.2.3 执行Master节点升级
1 |
|

1 |
|

1 |
|

1 |
|

1 |
|

1 |
|

2.2.4 后续配置
k8s1.24 弃用了 node-role.kubernetes.io/master, 替换成了 node-role.kubernetes.io/control-plane , 所以需要手动添加 master 相关的 lable 和 taint,否则之前使用了该 label,taint 的应用会出问题。
1 |
|
2.3 Worker 节点操作
2.3.1 升级 kubeadm
1 |
|
2.3.2 升级工作节点
1 |
|

1 |
|

1 |
|

2.3.3 工作节点生成config文件
上述操作完成后,在工作节点无法执行kubectl命令,报错如下
1 |
|

1 |
|
2.3.4 注意
其他k8s工作节点都要执行上述操作。
所有工作执行完上述操作后,此时所有k8s节点的状态仍是处于NotReady状态,所有节点keubelet服务activating (auto-restart),请参考以下章节“问题处理”解决。
升级所有操作都完成后,k8s1.24.2集群的所有节点都会处于Ready状态,k8s集群版本显示为v1.24.2:

2.4 问题处理
2.4.1 控制节点升级时,报“Error while dialing dial unix /var/run/dockershim.sock”

解决办法:
1 |
|

2.4.2 升级操作完成后,所有节点都是NotReady状态,所有节点keubelet服务activating (auto-restart)


1 |
|

发现kubelet无法识别"--network-plugin"这个参数,因为该配置和"DockerShim"一起在Kubernetes的1.24版本被移除了。
解决办法:
1 |
|

1 |
|

其他节点也是这样修改与操作后,重启kubelet服务,之后kubelet服务处于Running状态。
之后K8s集群中所有节点都是Ready状态:
