预备知识点
kubernetes版本升级迭代非常快,每三个月更新一个版本,很多新的功能在新版本中快速迭代,为了与社区版本功能保持一致,升级kubernetes集群,社区已通过kubeadm工具统一升级集群,升级步骤简单易行。
升级工作的基本流程如下:
- 升级主控制平面节点
- 升级其他控制平面节点
- 升级工作节点
版本升级通常分为两类:
- 小版本升级
小版本升级如下1.14.1升级到1.14.2,小版本升级可以跨版本升级,如1.14.1升级到1.14.3.
- 跨版本升级
跨版本升级是指大版本升级,如1.14.x升级到1.15.x。
升级注意,不能跨版本升级
- 1.19.x → 1.20.y——是可以的(其中y > x)
- 1.19.x → 1.21.y——不可以【跨段了】(其中y > x)
- 1.21.x→ 1.21.y——也可以(只要其中y > x)
所以,如果需要跨大版本升级,必须多次逐步升级
升级步骤
确定升级到哪个版本
使用操作系统的包管理器找到最新的补丁版本
# 在列表中查找最新的 1.29 版本 # 它看起来应该是 1.29.x-*,其中 x 是最新的补丁版本 sudo apt update sudo apt-cache madison kubeadm
把升级节点设置为维护状态
将节点标记为不可调度并驱逐所有负载,准备节点的维护:
# 将 <node-to-drain> 替换为你要腾空的控制面节点名称 kubectl drain <node-to-drain> --ignore-daemonsets
<node-to-drain>为节点名称,可以通过kubectl get node
查看
执行上述的命令后输出结果如下图:
升级控制平面节点
控制面节点上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制面节点。该节点上必须拥有/etc/kubernetes/admin.conf
文件。
- 升级
kubeadm
# 用最新的补丁版本号替换 1.29.x-* 中的 x sudo apt-mark unhold kubeadm && \ sudo apt-get update && sudo apt-get install -y kubeadm='1.29.x-*' && \ sudo apt-mark hold kubeadm
以下从1.29.0升级到1.29.2为例,执行上述的命令输出的结果如下图:
- 验证下载操作正常,并且 kubeadm 版本正确:
kubeadm version
执行上述的命令输出的结果如下图:
- 验证升级计划:
sudo kubeadm upgrade plan
执行上述的命令输出的结果如下
- 选择要升级到的目标版本,运行合适的命令。例如:
sudo kubeadm upgrade apply v1.29.2
当执行上述命令返回如下的结果,证明升级成功
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.29.2". Enjoy! [upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
升级kubelet和kubectl
在升级kubelet和kubectl时,需求将节点标记为不可调度并驱逐所有负载
# 用最新的补丁版本替换 1.29.x-* 中的 x sudo apt-mark unhold kubelet kubectl && \ sudo apt-get update && sudo apt-get install -y kubelet='1.29.2-*' kubectl='1.29.2-*' && \ sudo apt-mark hold kubelet kubectl
执行上述命令后输出结果如下图:
升级完成后,执行如下命令重启kubelet服务。
sudo systemctl daemon-reload sudo systemctl restart kubelet
通过下图的结果,可以看到控制节点的版本已经从v1.29.0升级到v1.29.2。
解除节点保护
当前节点还是在维护状态,不要忘记通过执行kubectl uncordon controlplane
解除节点的保护。到此,整个控制平面的升级已经完成了。
CKA真题
设置配置环境:
[candidate@node-1] $ kubectl config use-context mk8s
Task
现有的 Kubernetes 集群正在运行版本 1.29.0。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.29.1。
确保在升级之前 drain master 节点,并在升级后 uncordon master 节点。
可以使用以下命令,通过 ssh 连接到 master 节点:
ssh master01
可以使用以下命令,在该 master 节点上获取更高权限:
sudo -i
另外,在主节点上升级 kubelet 和 kubectl。
请不要升级工作节点,etcd,container 管理器,CNI 插件, DNS 服务或任何其他插件。
做题解答
- 考试时执行,切换集群。
kubectl config use-context mk8s
- 查看节点信息
controlplane $ kubectl get node NAME STATUS ROLES AGE VERSION controlplane Ready control-plane 23d v1.29.0 node01 Ready <none> 23d v1.29.0
- 将升级节点标记为不可调度并驱逐所有负载,准备升级升级:
controlplane $ kubectl cordon controlplane node/controlplane cordoned controlplane $ kubectl drain controlplane --ignore-daemonsets node/controlplane already cordoned Warning: ignoring DaemonSet-managed Pods: kube-system/canal-kn5fq, kube-system/kube-proxy-f8kcp evicting pod local-path-storage/local-path-provisioner-5d854bc5c4-tszl5 evicting pod kube-system/calico-kube-controllers-9d57d8f49-wlth4 pod/calico-kube-controllers-9d57d8f49-wlth4 evicted pod/local-path-provisioner-5d854bc5c4-tszl5 evicted node/controlplane drained
- 升级控制平面
# 在考试环境中 ssh 到 master 节点,并切换到 root 下 # ssh master01 # sudo -i controlplane $ apt-get update # 找到题目要求升级到的指定版本 controlplane $ apt-cache madison kubeadm | grep 1.29.1 kubeadm | 1.29.1-1.1 | https://pkgs.k8s.io/core:/stable:/v1.29/deb Packages controlplane $ apt-get install kubeadm=1.29.1-1.1 # 验证下载操作正常,并且 kubeadm 版本正确: controlplane $ kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.1", GitCommit:"bc401b91f2782410b3fb3f9acf43a995c4de90d2", GitTreeState:"clean", BuildDate:"2024-01-17T15:49:02Z", GoVersion:"go1.21.6", Compiler:"gc", Platform:"linux/amd64"} #验证升级计划 controlplane $ kubeadm upgrade plan #排除etcd,升级其他的 controlplane $ kubeadm upgrade apply v1.29.1 --etcd-upgrade=false #升级 kubelet 和 kubectl controlplane $ apt-get install kubelet=1.29.1-1.1 kubectl=1.29.1-1.1 controlplane $ systemctl restart kubelet.service # 考试环境中退出 root,退回到 student@master01 # 解除节点的保护 controlplane $ kubectl uncordon controlplane # 检查 master1 是否为 Ready controlplane $ kubectl get node NAME STATUS ROLES AGE VERSION controlplane Ready control-plane 23d v1.29.1 node01 Ready <none> 23d v1.29.0