每个版本升级都有对应的文档,以1.23升级到1.24为例。
1.24.6版本后,k8s不再依赖于docker。需要先切换到使用containerd。
可以查看栏目的k8s安装文档。
确定要升级到哪个版本
使用操作系统的包管理器找到最新的补丁版本 Kubernetes 1.24:
yum list --showduplicates kubeadm --disableexcludes=kubernetes
#在列表中查找最新的 1.24 版本
#它看起来应该是 1.24.x-0,其中 x 是最新的补丁版本
升级控制平面节点
控制面节点上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制面节点。该节点上必须拥有 /etc/kubernetes/admin.conf 文件,即是主控制节点。
升级 kubeadm
升级kubeadm过程中会有短暂的集群无法访问的情况,部分pod会重启,如filebeat、dashboard。
对于第一个控制面节点
- 升级 kubeadm:
# 用最新的补丁版本号替换 1.24.x-0 中的 x
yum install -y kubeadm-1.24.10-0 --disableexcludes=kubernetes
验证下载操作正常,并且 kubeadm 版本正确:
验证升级计划:
kubeadm upgrade plan
运行升级的命令。例如:
kubeadm upgrade apply v1.24.10
flannel 网络插件可以不用升级。
升级其它控制节点kubeadm
#yum install -y kubeadm-1.24.10-0 --disableexcludes=kubernetes
#kubeadm upgrade node
查看是否成功
kubeadm version
腾空控制节点
通过将某个控制节点标记为不可调度并腾空节点为节点作升级准备:
# 将 <node-to-drain> 替换为你要腾空的控制面节点名称
kubectl drain <node-to-drain> --ignore-daemonsets
此操作不会影响集群的使用
升级控制节点的 kubelet 和 kubectl
# 用最新的补丁版本号替换 1.24.x-00 中的 x
yum install -y kubelet-1.24.10-0 kubectl-1.24.10-0 --disableexcludes=kubernetes
重启 kubelet:
systemctl daemon-reload
systemctl restart kubelet
解除节点的保护
通过将节点标记为可调度,让其重新上线:
# 将 <node-to-drain> 替换为你的节点名称
kubectl uncordon <node-to-drain>
升级工作节点
工作节点上的升级过程应该一次执行一个节点,或者一次执行几个节点, 以不影响运行工作负载所需的最小容量。
升级步骤与升级控制节点差不多。
升级 kubeadm
# 将 1.26.x-0 中的 x 替换为最新的补丁版本
yum install -y kubeadm-1.26.x-0 --disableexcludes=kubernetes
执行 “kubeadm upgrade”
对于工作节点,下面的命令会升级本地的 kubelet 配置:
sudo kubeadm upgrade node
腾空节点
将节点标记为不可调度并驱逐所有负载,准备节点的维护:
# 将 <node-to-drain> 替换为你正腾空的节点的名称
kubectl drain <node-to-drain> --ignore-daemonsets
升级 kubelet 和 kubectl
升级 kubelet 和 kubectl:
# 将 1.26.x-0 中的 x 替换为最新的补丁版本
yum install -y kubelet-1.26.x-0 kubectl-1.26.x-0 --disableexcludes=kubernetes
重启 kubelet:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
取消对节点的保护
通过将节点标记为可调度,让节点重新上线:
# 将 <node-to-uncordon> 替换为你的节点名称
kubectl uncordon <node-to-uncordon>
验证集群的状态
在所有节点上升级 kubelet 后,通过从 kubectl 可以访问集群的任何位置运行以下命令, 验证所有节点是否再次可用:
kubectl get nodes
STATUS 应显示所有节点为 Ready 状态,并且版本号已经被更新。