将kubeadm创建的k8s集群从 1.23.x 升级到 1.24.x
升级工作的基本流程如下:
- 升级主控制平面节点
- 升级其他控制平面节点
- 升级工作节点
前提条件:
- 先备份下集群的etcd
- 禁用swap
- 腾空待升级的节点,将上面运行的pod驱逐到其余节点上
本例子演示下如何将k8s从1.23.5升级到1.24.5,集群基础环境为centos7,官网参考地址为:
https://v1-24.docs.kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
使用如下命令查找要升级的版本信息,执行如下命令:
yum list --showduplicates kubeadm --disableexcludes=kubernetes

升级控制平面节点
控制面节点上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制面节点。该节点上必须拥有 /etc/kubernetes/admin.conf 文件
1、首先查看k8s集群的节点信息,如图:

2、首先设置k8s-master01不可调度,执行命令如图:

注意:正常情况下,不建议master节点可调度pod,主要用于管理
3、驱逐k8s-master01上的pod,忽略DaemonSet控制器下的pod,如图:
kubectl drain k8s-master01 --ignore-daemonsets

4、升级kubeadm,执行命令如下:
yum install -y kubeadm-1.24.5-0 --disableexcludes=kubernetes

5、查看升级计划,检查集群是否可被升级,执行如下命令:
kubeadm upgrade plan

从上图看出,组件的版本当前是1.23.5,不算CoreDNS和etcd
6、升级到版本1.24.5,不升级etcd,执行命令如下:
kubeadm upgrade apply v1.24.5 --etcd-upgrade=false -y

注意:如果你的集群是1.23.5,并且当前运行时为docker,那么执行升级命令会报错msg=”validate service connection: CRI v1 image API is not implemented for endpoint \”unix:///var/run/dockershim.sock\”: rpc error: code = Unimplemented desc = unknown service runtime.v1.ImageService” ,因为dockershim 只实现了 CRI 的部分接口,不支持镜像服务,因此要么将docker切换成containerd,要么使用cri-dockerd来替换dockershim,否则是无法升级成功的
7、升级kubelet和kubectl,执行命令如下:
yum install -y kubelet-1.24.5-0 kubectl-1.24.5-0 --disableexcludes=kubernetes
8、修改kubelet配置文件,去掉参数–network-plugin=cni,如下:
vi /var/lib/kubelet/kubeadm-flags.env #删除参数--network-plugin=cni
systemctl restart kubelet #重启kubelet
如果不去掉此参数,启动kubelet会报错Error: failed to parse kubelet flag: unknown flag: –network-plugin
9、取消节点不可调度状态,如下:
kubectl uncordon k8s-master01
10、查看节点信息,master已经升级成功,如图:

注意:如果有多个master节点,基本操作与第一个master相同,但是不能执行kubeadm upgrade apply了,应该替换为kubeadm upgrade node,此外,不需要执行 kubeadm upgrade plan
升级工作节点
1、在master节点执行命令禁止节点调度并驱逐上面的pod,如下:
kubectl cordon k8s-node01
kubectl drain k8s-node01 --ignore-daemonsets
2、登录k8s-node01,升级kubeadm,执行如下命令:
yum install -y kubeadm-1.24.5-0 --disableexcludes=kubernetes
3、执行如下命令,升级本地的kubelet配置,如下:
kubeadm upgrade node

4、升级kubelet和kubectl ,命令如下:
yum install -y kubelet-1.24.5-0 kubectl-1.24.5-0 --disableexcludes=kubernetes
5、修改kubelet的config.yml文件,去掉–network-plugin=cni参数,如下:
vim /var/lib/kubelet/kubeadm-flags.env #去掉--network-plugin=cni
参考:KUBELET_KUBEADM_ARGS="--container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8"
6、重启kubelet,执行命令如下:
systemctl daemon-reload
systemctl restart kubelet
注:如果kubelet启动报错Failed at step MEMORY spawning /usr/bin/kubelet: Cannot allocate memory,可检查/var/lib/kubelet/kubeadm-flags.env文件是否出现异常
7、在master节点,执行命令将节点设置为可调度,如下:
kubectl uncordon k8s-node01
最后查看节点版本状态,如图:

其余工作节点按照上述方法升级即可
kubeadm upgrade apply的主要作用如下:
- 检查你的集群是否处于可升级状态:API 服务器是可访问的、所有节点处于
Ready状态、控制面是健康的 - 强制执行版本偏差策略
- 确保控制面的镜像是可用的或可拉取到服务器上
- 升级控制面组件或回滚
- 应用新的
CoreDNS和kube-proxy清单,并强制创建所有必需的 RBAC 规则 - 如果组件配置要求版本升级,则生成替代配置与或使用用户提供的覆盖版本配置
- 如果旧文件在 180 天后过期,将创建 API 服务器的新证书和密钥文件并备份旧文件
kubeadm upgrade node 在其他控制平节点上执行以下操作:
- 从集群中获取 kubeadm
ClusterConfiguration - 备份 kube-apiserver 证书(可选)
- 升级控制平面组件的静态 Pod 清单
- 为本节点升级 kubelet 配置
kubeadm upgrade node 在工作节点上完成以下工作:
- 从集群取回 kubeadm
ClusterConfiguration - 为本节点升级 kubelet 配置
注意:集群升级完成后,k8s相关证书也会一起升级(kubeadm安装集群证书有效期为一年),其他版本升级也可以参考此文章或者参考官网:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/


