k8s 集群的版本更新

kubernetes cluster upgrade

更新集群版本

这篇文章主要记录 k8s 集群的版本更新,版本更新是我们在维护集群中必然会遇到的一个问题。以下方式适用于使用 kubeadm 方式安装的集群。官方也有提供详细的更新教程,reference here

更新前的注意内容

官方文档中标注的在开始更新前的准备

  1. You need to have a kubeadm Kubernetes cluster running version 1.xx.0 or later.
  2. Swap must be disabled.
  3. The cluster should use a static control plane and etcd pods or external etcd.
  4. Make sure you read the release notes carefully.
  5. Make sure to back up any important components, such as app-level state stored in a database. kubeadm upgrade does not touch your workloads, only components internal to Kubernetes, but backups are always a best practice.

补充一些更新前的操作

  1. 集群中的 pod 要处于正常运行的状态,这是因为更新时会运行一个健康检查的 pod,集群如果出现异常 pod,会退出更新。
  2. 先将 kubeadm 更新到集群的下一个版本,方便更新前检查更新计划
  3. 更新集群前,做好数据备份和恢复工作,因为更新操作是不可逆的。
  4. 版本如果落后过多,更新时,最好一个版本接一个版本更新,而不要跨多个版本更新。
  5. 生产集群的工作节点更新时,记得先将工作节点节点驱逐再进行操作

更新集群版本

当所有准备都已经完成时,可以根据下面的操作进行。

Tips: 以下更新方式应用于单 master 节点更新,多 master 节点的更新可参考:here

  • 查看可用版本有哪些
1
2
3
4
sudo apt update

# 该命令可以查看 kubeadm 可用的版本有哪些
sudo apt-cache madison kubeadm
  • 将 kubeadm 更新到当前版本或者下一个版本的最后一个小版本中,否则在 kubeadm 的更新计划中还是需要先更新到最后一个版本
1
sudo apt-get install -y --allow-change-held-packages --allow-downgrades kubeadm=1.xx.xx-00
  • 更新完 kubeadm 后,可以查看相应的更新计划
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ sudo kubeadm upgrade plan

# 会有类似以下输出
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks.
[upgrade] Running cluster health checks
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.21.8
[upgrade/versions] kubeadm version: v1.22.5
I1230 17:11:03.706723    9208 version.go:255] remote version is much newer: v1.23.1; falling back to: stable-1.22
[upgrade/versions] Target version: v1.22.5
[upgrade/versions] Latest version in the v1.21 series: v1.21.8

Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       TARGET
kubelet     4 x v1.21.8   v1.22.5

Upgrade to the latest stable version:

COMPONENT                 CURRENT    TARGET
kube-apiserver            v1.21.8    v1.22.5
kube-controller-manager   v1.21.8    v1.22.5
kube-scheduler            v1.21.8    v1.22.5
kube-proxy                v1.21.8    v1.22.5
CoreDNS                   v1.8.0     v1.8.4
etcd                      3.4.13-0   3.5.0-0

You can now apply the upgrade by executing the following command:

        kubeadm upgrade apply v1.22.5

_____________________________________________________________________


The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.

API GROUP                 CURRENT VERSION   PREFERRED VERSION   MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io   v1alpha1          v1alpha1            no
kubelet.config.k8s.io     v1beta1           v1beta1             no
_____________________________________________________________________
  • 按照上述提示操作,静待升级完成即可。
1
2
3
4
5
6
7
8
$ sudo kubeadm upgrade apply v1.22.5

# 执行成功后,会有类似以下输出(以下粘贴中省略了一部分输出)

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

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
  • kubeadm 更新完成后,更新 kubelet 和 kubectl(worker 节点亦执行以下操作进行更新,注意版本保持一致)
1
sudo apt update && sudo apt-get install -y --allow-change-held-packages --allow-downgrades kubelet=1.22.5-00 kubectl=1.22.5-00 && sudo systemctl daemon-reload && sudo systemctl restart kubelet
Built with Hugo
Theme Stack designed by Jimmy