将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/

标签