2-2-kubernetes升级
假设k8s的版本格式为x.y.z,那么使用kubeadm最多只能升级到y+1版本,或者是当前y版本的最新版本。例如你k8s集群的版本为1.24.x,那么你最大版本只能下载1.25.x的kubeadm来升级版本。
1. 升级指南
1.1 升级控制平面节点
升级
kubeadm清空当前节点
升级
kubelet和kubectl解除当前节点的封锁

1.2 升级工作节点
升级
kubeadm清空当前节点
升级
kubelet和kubectl解除当前节点的封锁

以上是 , 在使用 kubeadm 部署的 Kubernetes 集群中进行升级通常需要执行的步骤。
1.3 总结
在执行升级前 , 请确保备份重要数据和配置 , 并在生产环境中进行升级前做好充分测试。
1.3.1 升级前的准备工作
备份重要数据和配置 在执行升级之前 , 确保备份所有重要的数据和配置文件 , 特别是
etcd数据存储 , 以便在需要时进行恢复。查看官方文档 查看
Kubernetes官方文档 , 了解升级所需的新版本特定的步骤和注意事项。不同的Kubernetes版本升级可能有所不同。
1.3.2 升级步骤
备份和升级 etcd 数据存储 在开始升级之前 , 确保对
etcd数据存储进行备份。这是非常关键的步骤 , 以防止数据丢失。升级过程中可能涉及etcd数据模式或存储的变化。升级
Control Plane节点首先 , 将
Master节点上的kube-apiserver、kube-controller-manager和kube-scheduler组件升级到新版本。对每个
Control Plane节点执行升级步骤 , 通常可以通过更改包管理器的源、安装软件包或二进制文件的更新来完成。
更新
kubelet和kubectl在所有节点上更新
kubelet和kubectl版本。这可以通过包管理器进行更新 , 或者直接下载并安装新版本的二进制文件。
Drain节点和迁移Pod对每个节点运行
kubectl drain命令 , 确保节点上的 Pod 被优雅地驱逐并迁移到其他节点。然后 , 升级该节点 , 并确保它重新加入集群后重新接管其工作负载。
验证节点状态
确保所有节点成功加入并处于可用状态。
使用
kubectl get nodes等命令检查节点状态 , 并确保没有出现异常情况。
更新
CNI插件和其他组件如果您使用了网络插件(如
Calico、Flannel等) , 确保更新插件版本以兼容新的Kubernetes版本。对其他附加的
Kubernetes组件 , 如CoreDNS、Ingress控制器等 , 也需要进行相应的更新。
验证集群功能
运行一系列功能测试 , 确保集群正常工作。测试集群的基本功能 , 如 Pod 创建、服务通信等。
监控和故障排除
监控新版本的集群 , 确保所有工作负载正常运行 , 并持续监测可能出现的异常情况。
如果出现任何问题 , 立即进行故障排除 , 并根据需要回滚到先前的稳定状态。
清理和整理
删除不再需要的旧组件或版本 , 并清理集群中的遗留数据 , 以确保整个集群处于干净的状态。
以上是一个大致的升级流程 , 确保在升级前详细阅读并遵循 Kubernetes 官方文档中指定的步骤。每个版本的升级可能有所不同 , 因此请务必参考相应版本的升级指南。
1.4 从故障状态恢复
如果 kubeadm upgrade 失败并且没有回滚 , 例如由于执行期间节点意外关闭 , 你可以再次运行 kubeadm upgrade。 此命令是幂等的 , 并最终确保实际状态是你声明的期望状态。
要从故障状态恢复 , 你还可以运行 sudo kubeadm upgrade apply --force 而无需更改集群正在运行的版本。
在升级期间 , kubeadm 向 /etc/kubernetes/tmp 目录下的如下备份文件夹写入数据:
kubeadm-backup-etcd-<date>-<time>kubeadm-backup-manifests-<date>-<time>
kubeadm-backup-etcd 包含当前控制面节点本地 etcd 成员数据的备份。 如果 etcd 升级失败并且自动回滚也无法修复 , 则可以将此文件夹中的内容复制到 /var/lib/etcd 进行手工修复。如果使用的是外部的 etcd , 则此备份文件夹为空。
kubeadm-backup-manifests 包含当前控制面节点的静态 Pod 清单文件的备份版本。 如果升级失败并且无法自动回滚 , 则此文件夹中的内容可以复制到 /etc/kubernetes/manifests 目录实现手工恢复。 如果由于某些原因 , 在升级前后某个组件的清单未发生变化 , 则 kubeadm 也不会为之生成备份版本。
1.5 工作原理
kubeadm upgrade apply 做了以下工作:
检查你的集群是否处于可升级状态:
API服务器是可访问的所有节点处于
Ready状态控制面是健康的
强制执行版本偏差策略。
确保控制面的镜像是可用的或可拉取到服务器上。
如果组件配置要求版本升级 , 则生成替代配置与/或使用用户提供的覆盖版本配置。
升级控制面组件或回滚(如果其中任何一个组件无法启动)。
应用新的
CoreDNS和kube-proxy清单 , 并强制创建所有必需的RBAC规则。如果旧文件在
180天后过期 , 将创建API服务器的新证书和密钥文件并备份旧文件。
kubeadm upgrade node 在其他控制平节点上执行以下操作:
从集群中获取
kubeadmClusterConfiguration。(可选操作)备份
kube-apiserver证书。升级控制平面组件的静态
Pod清单。为本节点升级
kubelet配置
kubeadm upgrade node 在工作节点上完成以下工作:
从集群取回
kubeadmClusterConfiguration。为本节点升级
kubelet配置。
2 小版本升级集群
升级k8s 集群必须 先升级kubeadm 版本到目的k8s版本 , 也就是说kubeadm 是k8s 升级 的 ”准升证”。
2.4.1 升级Master节点
在 k8s 的所有 master 进行升级 , 将管理端服务 kube-controller-manager、kube-apiserver、 kube-scheduler、kube-proxy 。
2.4.1.1 第一个主节点升级
验证当前
k8s前版本root@kubeadm-master1:~# kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.3", GitCommit:"6813625b7cd706db5bc7388921be03071e1a492d", GitTreeState:"clean", BuildDate:"2024-03-15T00:06:16Z", GoVersion:"go1.21.8", Compiler:"gc", Platform:"linux/amd64"}各
master安装指定新版本kubeadmroot@kubeadm-master1:~# apt-cache madison kubeadm kubeadm | 1.29.4-2.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb Packages kubeadm | 1.29.3-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb Packages kubeadm | 1.29.2-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb Packages kubeadm | 1.29.1-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb Packages kubeadm | 1.29.0-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb Packages root@kubeadm-master1:~# apt-get install kubeadm=1.29.4-2.1 root@kubeadm-master1:~# kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.4", GitCommit:"55019c83b0fd51ef4ced8c29eec2c4847f896e74", GitTreeState:"clean", BuildDate:"2024-04-16T15:05:51Z", GoVersion:"go1.21.9", Compiler:"gc", Platform:"linux/amd64"} 升级命令使用帮助手册
root@kubeadm-master1:~# kubeadm upgrade --help Upgrade your cluster smoothly to a newer version with this command Usage: kubeadm upgrade [flags] kubeadm upgrade [command] Available Commands: apply 将您的Kubernetes集群升级到指定的版本 diff 显示将应用于现有静态pod清单的差异。同样可以使用kubeadm upgrade apply --dry-run实现同样效果 node 集群中节点的升级命令 plan 检查可升级到的版本 , 并验证当前群集是否可升级。要跳过internet检查 , 请输入可选的[version]参数显示升级计划
root@kubeadm-master1:~# kubeadm upgrade plan [upgrade/config] Making sure the configuration is correct: [upgrade/config] Reading configuration from the cluster... [upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [preflight] Running pre-flight checks. [upgrade] Running cluster health checks [upgrade] Fetching available versions to upgrade to [upgrade/versions] Cluster version: v1.29.3 [upgrade/versions] kubeadm version: v1.29.4 I0504 13:02:33.926567 766291 version.go:256] remote version is much newer: v1.30.0; falling back to: stable-1.29 [upgrade/versions] Target version: v1.29.4 [upgrade/versions] Latest version in the v1.29 series: v1.29.4 Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply': COMPONENT CURRENT TARGET kubelet 6 x v1.29.3 v1.29.4 Upgrade to the latest version in the v1.29 series: COMPONENT CURRENT TARGET kube-apiserver v1.29.3 v1.29.4 kube-controller-manager v1.29.3 v1.29.4 kube-scheduler v1.29.3 v1.29.4 kube-proxy v1.29.3 v1.29.4 CoreDNS v1.11.1 v1.11.1 etcd 3.5.12-0 3.5.12-0 You can now apply the upgrade by executing the following command: kubeadm upgrade apply v1.29.4 _____________________________________________________________________ The table below shows the current state of component configs as understood by this version of kubeadm. Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually upgrade to is denoted in the "PREFERRED VERSION" column. API GROUP CURRENT VERSION PREFERRED VERSION MANUAL UPGRADE REQUIRED kubeproxy.config.k8s.io v1alpha1 v1alpha1 no kubelet.config.k8s.io v1beta1 v1beta1 no _____________________________________________________________________ 开始升级。升级时使用升级计划中的命令
kubeadm upgrade apply v1.29.4root@kubeadm-master1:~# kubeadm upgrade apply v1.29.4

验证镜像

排空节点
#停止调度,影响最小 , 只会将node调为SchedulingDisabled 之后再发创建pod , 不会被调度到该节点旧有的pod不会受到影响 , 仍正常对外提供服务 root@kubeadm-master1:~# kubectl cordon kubeadm-master1.cbear.top node/kubeadm-master1.cbear.top cordoned #驱逐节点, 首先 , 驱逐node上的pod , 其他节点重新创建接着 , 将节点调为 SchedulingDisabled root@kubeadm-master1:~# kubectl drain kubeadm-master1.cbear.top node/kubeadm-master1.cbear.top already cordoned error: unable to drain node "kubeadm-master1.cbear.top" due to error:cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl, continuing command... There are pending nodes to be drained: kubeadm-master1.cbear.top cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl #在尝试对 Kubernetes 节点进行 drain 操作时 , 如果节点上存在由 DaemonSet 控制的 Pods , 比如 kube-flannel 或 kube-proxy , Kubernetes 将不允许你排出(drain)这些 Pods , 因为这会干扰集群的正常运行。kube-proxy 是 Kubernetes 网络的核心组件 , 而 kube-flannel 通常用作覆盖网络。 错误信息表明 , 当你尝试排出节点 kubeadm-master1.cbear.top 时 , 系统无法删除由 DaemonSet 管理的 Pods。如果你确实需要排出这个节点 , 你可以使用 --ignore-daemonsets 标志来强制执行排出操作 , 但这通常不推荐 , 因为它可能导致网络问题或覆盖网络中断。 root@kubeadm-master1:~# kubectl drain kubeadm-master1.cbear.top --ignore-daemonsets node/kubeadm-master1.cbear.top already cordoned Warning: ignoring DaemonSet-managed Pods: kube-flannel/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl node/kubeadm-master1.cbear.top drained 升级
kubectl和kubeletroot@kubeadm-master1:~# apt install kubectl=1.29.4-2.1 kubelet=1.29.4-2.1重启
kubelet服务root@kubeadm-master1:~# systemctl daemon-reload root@kubeadm-master1:~# systemctl restart kubelet 取消调度保护
root@kubeadm-master1:~# kubectl uncordon kubeadm-master1.cbear.top node/kubeadm-master1.cbear.top uncordoned检查
kubectl版本root@kubeadm-master1:~# kubectl get node NAME STATUS ROLES AGE VERSION kubeadm-master1.cbear.top Ready control-plane 25h v1.29.4 kubeadm-master2.cbear.top Ready control-plane 24h v1.29.3 kubeadm-master3.cbear.top Ready control-plane 24h v1.29.3 node01.cbear.top Ready <none> 24h v1.29.3 node02.cbear.top Ready <none> 24h v1.29.3 node03.cbear.top Ready <none> 24h v1.29.3这里第一个主节点已经升级完成
2.4.1.2 其余主节点升级
其他主节点安装对应软件包
root@kubeadm-master2:~# apt-get install kubeadm=1.29.4-2.1 root@kubeadm-master3:~# apt-get install kubeadm=1.29.4-2.1调整其他两个主节点
kubeadm配置, 这个命令会下载并安装最新的Kubernetes静态Pod镜像 , 并更新节点的配置。root@kubeadm-master2:~# kubeadm upgrade node root@kubeadm-master3:~# kubeadm upgrade nodekubeadm upgrade node是一个用于升级Kubernetes集群中单个节点的命令。这个命令会更新集群中的kubelet和kubeadm版本 , 以及节点的配置。从Kubernetes v1.23开始 ,kubeadm upgrade node不再接受--kubelet-version参数 , 因为kubelet现在会自动升级到与kubeadm兼容的版本。这里不是使用sudo kubeadm upgrade apply命令。此外 , 不需要执行kubeadm upgrade plan和更新CNI驱动插件的操作。两个主节点中开启调度保护
root@kubeadm-master2:~# kubectl cordon kubeadm-master2.cbear.top node/kubeadm-master2.cbear.top cordoned root@kubeadm-master3:~# kubectl cordon kubeadm-master3.cbear.top node/kubeadm-master3.cbear.top cordoned root@kubeadm-master2:~# kubectl drain kubeadm-master2.cbear.top --ignore-daemonsets node/kubeadm-master2.cbear.top already cordoned Warning: ignoring DaemonSet-managed Pods: kube-flanne/kube-flannel1-ds-t624w, kube-system/kube-proxy-zpbxl node/kubeadm-master2.cbear.top drained root@kubeadm-master3:~# kubectl drain kubeadm-master3.cbear.top --ignore-daemonsets node/kubeadm-master3.cbear.top already cordoned Warning: ignoring DaemonSet-managed Pods: kube-flanne/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl node/kubeadm-master2.cbear.top drained两个主节点中下载对应软件包
root@kubeadm-master2:~# apt install kubectl=1.29.4-2.1 kubelet=1.29.4-2.1 root@kubeadm-master3:~# apt install kubectl=1.29.4-2.1 kubelet=1.29.4-2.1重启
kubelet服务root@kubeadm-master2:~# systemctl daemon-reload root@kubeadm-master2:~# systemctl restart kubelet root@kubeadm-master3:~# systemctl daemon-reload root@kubeadm-master3:~# systemctl restart kubelet取消调度保护
root@kubeadm-master2:~# kubectl uncordon kubeadm-master2.cbear.top node/kubeadm-master2.cbear.top uncordoned root@kubeadm-master3:~# kubectl uncordon kubeadm-master3.cbear.top node/kubeadm-master3.cbear.top uncordoned检查升级之后的版本信息
root@kubeadm-master3:~# kubectl get node NAME STATUS ROLES AGE VERSION kubeadm-master1.cbear.top Ready control-plane 25h v1.29.4 kubeadm-master2.cbear.top Ready control-plane 24h v1.29.4 kubeadm-master3.cbear.top Ready control-plane 24h v1.29.4 node01.cbear.top Ready <none> 24h v1.29.3 node02.cbear.top Ready <none> 24h v1.29.3 node03.cbear.top Ready <none> 24h v1.29.3
2.4.2 升级 k8s work 节点
所有的work节点均可进行如下操作
在
work节点中下载kubeadmroot@node01:~# apt-get install kubeadm=1.29.4-2.1升级
work节点配置root@node01:~# kubeadm upgrade node [upgrade] Reading configuration from the cluster... [upgrade] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [preflight] Running pre-flight checks [preflight] Skipping prepull. Not a control plane node. [upgrade] Skipping phase. Not a control plane node. [upgrade] Backing up kubelet config file to /etc/kubernetes/tmp/kubeadm-kubelet-config2679114713/config.yaml [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [upgrade] The configuration for this node was successfully updated! [upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.通过
kubectl将节点置于维护模式。(需要在控制节点上操作 , 或者在工作机上操作)root@kubeadm-master1:~# kubectl drain --ignore-daemonsets --delete-emptydir-data node01.cbear.top下载对应的软件包
root@no01:~#apt install kubelet=1.29.4-2.1重启
kubelet服务root@node01:~# systemctl daemon-reload root@node01:~# systemctl restart kubelet关闭维护模式
root@kubeadm-master1:~# kubectl uncordon node01.cbear.top node/node01.cbear.top uncordoned验证整个集群状态
root@kubeadm-master1:~# kubectl get node NAME STATUS ROLES AGE VERSION kubeadm-master1.cbear.top Ready control-plane 27h v1.29.4 kubeadm-master2.cbear.top Ready control-plane 25h v1.29.4 kubeadm-master3.cbear.top Ready control-plane 25h v1.29.4 node01.cbear.top Ready <none> 25h v1.29.4 node02.cbear.top Ready <none> 25h v1.29.4 node03.cbear.top Ready <none> 25h v1.29.4 root@kubeadm-master1:~# kubeadm certs check-expiration [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf May 04, 2025 16:58 UTC 364d ca no apiserver May 04, 2025 13:10 UTC 364d ca no apiserver-etcd-client May 04, 2025 13:10 UTC 364d etcd-ca no apiserver-kubelet-client May 04, 2025 13:10 UTC 364d ca no controller-manager.conf May 04, 2025 13:11 UTC 364d ca no etcd-healthcheck-client May 03, 2025 15:35 UTC 363d etcd-ca no etcd-peer May 03, 2025 15:35 UTC 363d etcd-ca no etcd-server May 03, 2025 15:35 UTC 363d etcd-ca no front-proxy-client May 04, 2025 13:10 UTC 364d front-proxy-ca no scheduler.conf May 04, 2025 13:11 UTC 364d ca no super-admin.conf May 04, 2025 16:58 UTC 364d ca no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca May 01, 2034 15:35 UTC 9y no etcd-ca May 01, 2034 15:35 UTC 9y no front-proxy-ca May 01, 2034 15:35 UTC 9y no
3. 大版本升级集群
Kubernetes的升级是非常容易的。之所以写升级到1.24版本 , 是因为从这个版本开始不再支持dockershim。尽管Kubernetes早就提醒不再支持dockershim , 但本着能用一天就不折腾的原则 , 依然到现在。
3.1 升级控制节点
普通的升级过程比较简单 , 只需要遵从以下步骤即可。
备份
如果你的
Kubernetes运行在虚拟机上 , 那可以通过快照等方式进行备份。升级控制节点
如果你有一个节点 , 那比较容易;如果有多个节点 , 则需要逐个升级。
升级
kubeadmyum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes kubeadm version查看升级计划
kubeadm upgrade plan执行完的结果中会有一句:
You can now apply the upgrade by exeting the following command: kubeadm upgrade apply v1.24.17执行升级
kubeadm upgrade apply v1.24.17在执行的结果中如果有以下文字 , 则代表升级成功。
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.24.17". Enjoy!升级
kubeletsystemctl stop kubelet yum -y install kubelet-1.24.17-0 --disableexcludes=kubernetes systemctl start kubelet升级CNI
如果网络插件也需要升级 , 则在此步骤中根据所选网络插件的说明进行升级。
切换
dockershim到containerd先将节点排除。在以下命令中 , 假设当前操作的机器节点名称为
CTRLNODE1。kubectl drain CTRLNODE1 --ignore-daemonsets --delete-emptydir-data yum install -y kubectl-1.24.17-0 kubernetes=cni-1.1.1.0 --disableexcludes=kubernetes移除
dockershim。systemctl disable docker --now yum -y remove docker-ce docker-ce-cli安装
containerdyum -y install containerd mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml systemctl enable --now containerd配置
kubelet使用containerd。sed -i 's/--network-plugin=cni/--container-runtime=remote\ --container-runtime-endpoint=unix\:\/\/\/run\/containerd\/containerd.sock/g' /var/lib/kubelet/kubeadm-flags.env修改配置。
kubectl edit no CTRLNODE1在编辑器中 , 将
kubeadm.alpha.kubernetes.io/cri-socket的值由/var/run/dockershim.sock修改为unix:///run/containerd/containerd.sock。重启
kubelet使配置生效。systemctl daemon-reload systemctl restart kubelet将节点恢复健康状态。
kubectl uncordon CTRLNODE1如此反复将所有控制节点升级完毕。
3.2 升级工作节点
升级工作节点也需要逐个升级。
升级
kubeadmyum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes kubeadm upgrade node通过
kubectl将节点置于维护模式。(需要在控制节点上操作 , 或者在工作机上操作)export WORKERNODE=WORKNODE1 kubectl drain ${WORKERNODE} --ignore-daemonsets --delete-emptydir-data升级
kubeletyum -y install kubelet-1.24.17.0 --disableexcludes=kubernetes移除
dockershim, 安装containerdsystemctl stop kubelet systemctl disable docker --now yum -y remove docker-ce docker-ce-cli yum -y install containerd mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml systemctl enable containerd --now修改配置
替换配置项。
sed -i 's/--network-plugin=cni/--container-runtime=remote\ --container-runtime-endpoint=unix\:\/\/\/run\/containerd\/containerd.sock/g' /var/lib/kubelet/kubeadm-flags.env修改配置。
kubectl edit no ${WORKER_NODE}在编辑器中 , 将
kubeadm.alpha.kubernetes.io/cri-socket的值由/var/run/dockershim.sock修改为unix:///run/containerd/containerd.sock。重启
kubeletsystemctl daemon-reload systemctl restart kubelet将节点恢复健康状态
kubectl uncordon ${WORKER_NODE}
反复执行以上步骤将其他工作节点升级。
3.3 查看状态
全部升级完毕后 , 需要检查集群节点状态。
kubectl get node若全部节点显示Ready状态 , 则代表升级完成。
3.4 检查所有应用
升级完毕后 , 还需检查所有应用和服务是否正常。对于普通应用基本无影响 , 但是对于CI/CD中需要构造Docker镜像的场景 , 则需要修改CI/CD过程以兼容containerd。
参考链接
图解 Kubernetes 集群升级步骤 , 轻松实现无痛迁移 (qq.com)
Kubernetes集群升级(kubeadm版) - Layzer - 博客园 (cnblogs.com)
如何将Kubernetes从1.23升级到1.24? (qq.com)