【K8s】升级节点
- 集群应使用静态的控制平面和 etcd Pod 或者外部 etcd。
- 务必备份所有重要组件,例如存储在数据库中应用层面的状态。
kubeadm upgrade
不会影响你的工作负载,只会涉及 Kubernetes 内部的组件,但备份终究是好的。 - 必须禁用交换分区。
注意:以下命令以root身份或使用sudo
升级控制平面节点
控制平面节点上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制平面节点。该节点上必须拥有 /etc/kubernetes/admin.conf
文件。
你必须采用“滚动的”方式,一次只升级一个。这样能确保在升级过程中,始终有其他的 Master 节点在线并正常工作,从而保持集群控制平面的可用性。如果同时升级所有 Master,控制平面会完全不可用。
这个文件是
kubeadm
初始化集群或加入节点时创建的集群管理配置文件,其中包含了访问集群 API Server 所需的管理员证书和密钥。
执行kubeadm upgrade
对于第一个控制平面节点:
1、升级kubeadm
apt-mark unhold kubeadmapt-get updateapt-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 updateapt-get install -y kubelet=‘版本号’ kubectl='版本号'apt-mark hold kubelet kubectl
2、重启服务
systemctl restart daemon-reloadsystemctl restart kubelet
解除节点的保护
kubectl uncordon node名称
升级工作节点
工作节点上的升级过程应该一次执行一个节点,或者一次执行几个节点, 以不影响运行工作负载所需的最小容量。
注意:root身份或使用sudo
升级kubeadm
apt-mark unhold kubeadmapt-get updateapt-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 kubeletapt-get updateapt-get install -y kubectl='版本号' kubelet='版本号'systemctl daemon-reloadsystemctl restart kubelet
取消对节点的保护
kubectl uncordon 节点名称
升级问题
1、可以只升级控制平面节点,而不升级工作节点吗?
可以,官方支持控制平面版本 比 工作节点版本 高两个 minor 版本。
2、可以只升级一个控制平面节点,而不升级其他控制平面节点吗?
在滚动升级的过程中,集群必然会处于一种混合版本状态。例如,两个节点是 v1.27,一个节点是 v1.28。这是设计上允许的。但这是临时的、必须完成的状态。绝对不能作为长期运行的状态。