• 集群应使用静态的控制平面和 etcd Pod 或者外部 etcd。
  • 务必备份所有重要组件,例如存储在数据库中应用层面的状态。 kubeadm upgrade 不会影响你的工作负载,只会涉及 Kubernetes 内部的组件,但备份终究是好的。
  • 必须禁用交换分区

注意:以下命令以root身份或使用sudo

升级控制平面节点

控制平面节点上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制平面节点。该节点上必须拥有 /etc/kubernetes/admin.conf 文件。

你必须采用“滚动的”方式,一次只升级一个。这样能确保在升级过程中,始终有其他的 Master 节点在线并正常工作,从而保持集群控制平面的可用性。如果同时升级所有 Master,控制平面会完全不可用。

这个文件是 ​kubeadm初始化集群或加入节点时创建的集群管理配置文件​​,其中包含了访问集群 API Server 所需的管理员证书和密钥。

执行kubeadm upgrade

对于第一个控制平面节点:

1、升级kubeadm

apt-mark unhold kubeadm

apt-get update

apt-get install -y kubeadm='版本号'

apt-mark hold kubeadm

2、验证

kubeadm version

3、验证执行计划

kubeadm upgrade plan

此命令检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。

kubeadm upgrade 也会自动对 kubeadm 在节点上所管理的证书执行续约操作。 如果需要略过证书续约操作,可以使用标志 --certificate-renewal=false

4、执行升级

kubeadm upgrade apply v1.34.x

该命令结束,你会看到

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.34.x". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

4、手动升级CNI驱动插件

Kubernetes 的核心升级命令 kubeadm upgrade只负责升级 Kubernetes 本身的组件(如 kube-apiserver, kube-controller-manager, kubelet 等),而不会自动升级你的网络插件(CNI 驱动)。你需要根据你使用的特定网络插件(如 Calico、Cilium、Flannel 等)的官方文档,来手动执行其升级操作。​

对于其他控制节点:

与第一个控制平面节点相同,但是不使用kubeadm upgrade apply 而是使用

kubeadm upgrade node

此外,也不需要kubeadm upgrade plan 和更新CNI插件

腾空节点

将节点编辑为不可调度并驱逐所有负载

kubectl drain node名称 --ignore-daemonsets

升级kubelet和kubectl

1、升级

apt-mark unhold kubelet kubectl 

apt-mark update

apt-get install -y kubelet=‘版本号’ kubectl='版本号'

apt-mark hold kubelet kubectl 

2、重启服务

systemctl restart daemon-reload

systemctl restart kubelet

解除节点的保护

kubectl uncordon node名称

升级工作节点

工作节点上的升级过程应该一次执行一个节点,或者一次执行几个节点, 以不影响运行工作负载所需的最小容量。

注意:root身份或使用sudo

升级kubeadm

apt-mark unhold kubeadm

apt-get update

apt-get install -y kubeadm='版本号'

执行kubeadm upgrade

对于工作节点,下面的命令会升级本地的 kubelet 配置:

kubectl upgrade node

腾空节点

# 在控制平面节点上执行此命令
# 将 <node-to-drain> 替换为你正腾空的节点的名称
kubectl drain <node-to-drain> --ignore-daemonsets

升级kubectl和kubelet

apt-mark unhold kubectl kubelet

apt-get update

apt-get install -y kubectl='版本号' kubelet='版本号'

systemctl daemon-reload

systemctl restart kubelet

取消对节点的保护

kubectl uncordon 节点名称

升级问题

1、可以只升级控制平面节点,而不升级工作节点吗?

可以,官方支持​​控制平面版本​​ 比 ​​工作节点版本​​ ​​高两个 minor 版本​​。

2、可以只升级一个控制平面节点,而不升级其他控制平面节点吗?

在滚动升级的​​过程中​​,集群必然会处于一种​​混合版本状态​​。例如,两个节点是 v1.27,一个节点是 v1.28。这是设计上允许的。但这是临时的、必须完成的状态。绝对不能作为长期运行的状态。​

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐