Kubernetes集群实践(十五)如何升级K8s的worker节点

本文主要介绍使用kubeadm管理的集群如何升级worker节点。

关键词:k8s,worker

背景

当前本地测试集群kubernetes版本不一致,为了避免出现差错,因此需要将版本对齐。

主要工作流程如下:

  1. 升级主控制平面节点
  2. 升级其他控制平面节点
  3. 升级工作节点

注意:

在Kubernetes中,升级集群时,通常建议按照指定的版本升级路径进行,而跳过次版本号的升级是不被支持的。这意味着,如果你的集群当前是1.28.x版本,想要升级到1.29.x版本,你需要先升级到1.29.x的前一个次版本,然后再升级到1.29.x。

举个例子,假设你的集群当前是1.28.4版本,你想要升级到1.29.2版本。根据版本偏差策略,你需要按照以下步骤进行升级:

  1. 升级到1.29.0版本:首先,你需要使用适当的工具(例如kubeadm)将集群升级到1.29.0版本。这可能涉及到更新Kubernetes二进制文件、配置文件和相关组件。具体的升级步骤可以参考Kubernetes官方文档或相关升级指南。
  2. 升级到1.29.2版本:一旦你的集群已经成功升级到1.29.0版本,你可以继续将其升级到1.29.2版本。这个升级过程可能与前一个次版本的升级类似,通常涉及更新二进制文件、配置文件和组件。

操作步骤

升级第一个控制平面节点

1
2
3
4
5
6
7
# debian/Ubuntu
# 用最新的补丁版本号替换 1.29.x-* 中的 x
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm='1.29.x-*' && \
apt-mark hold kubeadm
# Redhat/Centos
yum install -y kubeadm-'1.29.x-*' --disableexcludes=kubernetes

验证版本

1
kubeadm version

验证升级计划

1
kubeadm upgrade plan

kubeadm upgrade会自动的将TLS证书续约, 如果需要略过证书续约操作,可以使用标志 --certificate-renewal=false

选择要升级到的目标版本,运行合适的命令。

1
kubeadm upgrade apply v1.29.x

更新CNI驱动插件

升级其他控制平面节点

1
kubeadm upgrade node

升级kubectl和kubelet

腾空节点

1
2
# 将 <node-to-drain> 替换为你要腾空的控制面节点名称
kubectl drain <node-to-drain> --ignore-daemonsets

升级操作

1
2
3
4
5
6
7
# debian/Ubuntu
# 用最新的补丁版本号替换 1.29.x-* 中的 x
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubelet='1.29.x-*' kubectl='1.29.x-*' && \
apt-mark hold kubeadm
# Redhat/Centos
yum install -y kubelet-'1.29.x-*' kubectl='1.29.x-*' --disableexcludes=kubernetes

重启 kubelet

1
2
sudo systemctl daemon-reload
sudo systemctl restart kubelet

恢复调度

1
2
# 将 <node-to-uncordon> 替换为你的节点名称
kubectl uncordon <node-to-uncordon>

升级工作节点

升级kubeadm

1
2
3
4
5
6
7
# debian/Ubuntu
# 用最新的补丁版本号替换 1.29.x-* 中的 x
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm='1.29.x-*' && \
apt-mark hold kubeadm
# Redhat/Centos
yum install -y kubeadm-'1.29.x-*' --disableexcludes=kubernetes

执行kubeadm upgrade

1
kubeadm upgrade node

腾空节点

1
2
# 将 <node-to-drain> 替换为你要腾空的控制面节点名称
kubectl drain <node-to-drain> --ignore-daemonsets

升级kubectl/kubelet

1
2
3
4
5
6
7
# debian/Ubuntu
# 用最新的补丁版本号替换 1.29.x-* 中的 x
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubelet='1.29.x-*' kubectl='1.29.x-*' && \
apt-mark hold kubeadm
# Redhat/Centos
yum install -y kubelet-'1.29.x-*' kubectl='1.29.x-*' --disableexcludes=kubernetes

重启 kubelet

1
2
sudo systemctl daemon-reload
sudo systemctl restart kubelet

恢复调度

1
2
# 将 <node-to-uncordon> 替换为你的节点名称
kubectl uncordon <node-to-uncordon>