Linux环境下如何升级kubectl对应的Kubernetes服务端版本
Kubernetes v1.18 服务端升级到v1.24操作方案
核心规则前置:Kubernetes 禁止跨多个次版本跳跃升级,kubeadm 仅支持从当前版本升级到相邻的下一个次版本(n→n+1),你当前服务端版本为v1.18.2,必须严格按照 1.18 → 1.19 → 1.20 → 1.21 → 1.22 → 1.23 → 1.24 的路径逐版本升级,无法直接从1.18升到1.24。
升级前准备
- 全集群备份:在所有控制节点执行etcd快照备份,这是升级失败后回滚的核心依据,同时备份各节点
/etc/kubernetes/目录下的静态Pod配置、kubelet配置文件。 - 集群状态校验:执行
kubectl get nodes确认所有节点状态为Ready,执行kubectl get pods -A确认系统组件、业务Pod无持续异常重启。 - 版本匹配准备:你当前安装的kubeadm为v1.24版本,版本过高无法适配1.18集群的升级流程,每次升级单个次版本前,需要先将kubeadm、后续要升级的kubelet/kubectl包替换为对应目标次版本的最新补丁版本,禁止用高版本kubeadm升级低版本集群。
- 确认所有节点Swap分区已永久关闭,避免kubelet升级后启动异常。
单版本通用升级流程(每升级一个次版本重复一次该流程,直到升级到v1.24)
1. 升级控制平面
- 第一个控制节点操作:
- 安装对应目标版本的kubeadm包,执行
kubeadm version确认版本和目标升级版本一致。 - 执行
kubeadm upgrade plan做预检查,确认所有检查项无报错,输出的可升级版本包含目标版本。 - 执行
kubeadm upgrade apply v<目标版本号>,等待命令执行完成,期间控制平面组件会滚动重启。
- 安装对应目标版本的kubeadm包,执行
- 其余控制节点操作:
同样安装对应版本的kubeadm后,直接执行kubeadm upgrade node即可,不需要执行apply命令。 - 所有控制节点升级完控制平面组件后,将节点上的kubelet、kubectl包升级到对应目标版本,执行
systemctl daemon-reload && systemctl restart kubelet重启kubelet,通过kubectl get nodes确认节点版本更新、状态为Ready。
2. 逐台升级工作节点
禁止同时升级所有工作节点,避免业务大面积中断
- 将当前待升级节点标记为不可调度,驱逐节点上的业务Pod:
kubectl cordon <节点名> && kubectl drain <节点名> --ignore-daemonsets - 登录该节点,安装对应目标版本的kubeadm,执行
kubeadm upgrade node完成节点配置升级。 - 将节点上的kubelet、kubectl升级到对应目标版本,重启kubelet服务。
- 执行
kubectl get nodes确认该节点版本更新、状态回到Ready后,执行kubectl uncordon <节点名>恢复节点调度,等待业务Pod正常调度回该节点后,再升级下一台工作节点。
关键注意事项
- 每完成一个次版本的全集群升级(所有控制节点、工作节点均升级到当前目标版本,集群状态完全健康),再启动下一个次版本的升级流程,不要在集群存在多版本混合状态时强行跨版本升级。
- v1.24版本已彻底移除dockershim,如果你当前集群使用Docker作为容器运行时,在升级到v1.24之前必须完成容器运行时切换(例如切换到containerd),否则升级后kubelet会无法正常启动。
- 升级过程中如果遇到组件启动失败,优先通过
journalctl -u kubelet、对应组件的静态Pod日志排查根因,不要跳过错误强行执行后续升级步骤。 - 每个版本升级前确认对应版本的废弃API列表,提前修改集群中使用了已废弃API的资源配置,避免升级后业务资源无法正常创建。
内容的提问来源于stack exchange,提问作者Richard Rublev
相关产品推荐
相关产品推荐

