查看当前版本

1kubectl get nodes -owide
1NAME         STATUS   ROLES    AGE    VERSION
2k8s-master   Ready    <none>   548d   v1.20.8
3k8s-node1    Ready    <none>   548d   v1.20.8
4k8s-node2    Ready    <none>   548d   v1.20.8

k8s不支持跨多个版本升级,因此需要先升级到1.21

安装kubeadm-1.21.4

1yum -y install kubeadm-1.21.4 kubectl-1.21.4 kubelet-1.21.4

创建升级计划

1kubeadm upgrade plan 1.21.4 --ignore-preflight-errors=ControlPlaneNodesReady,swap

由于没有label标识master节点,需要加上--ignore-preflight-errors=ControlPlaneNodesReady或者执行

1kubectl label node k8s-master node-role.kubernetes.io/master=''
 1[upgrade/config] Making sure the configuration is correct:
 2[upgrade/config] Reading configuration from the cluster...
 3[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
 4[preflight] Running pre-flight checks.
 5[upgrade] Running cluster health checks
 6	[WARNING ControlPlaneNodesReady]: failed to find any nodes with a control-plane role
 7[upgrade] Fetching available versions to upgrade to
 8[upgrade/versions] Cluster version: v1.20.8
 9[upgrade/versions] kubeadm version: v1.21.4
10[upgrade/versions] Target version: 1.21.4
11[upgrade/versions] Latest version in the v1.20 series: 1.21.4
12
13Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
14COMPONENT   CURRENT       TARGET
15kubelet     3 x v1.20.8   1.21.4
16
17Upgrade to the latest version in the v1.20 series:
18
19COMPONENT                 CURRENT    TARGET
20kube-apiserver            v1.20.8    1.21.4
21kube-controller-manager   v1.20.8    1.21.4
22kube-scheduler            v1.20.8    1.21.4
23kube-proxy                v1.20.8    1.21.4
24CoreDNS                   1.7.0      v1.8.0
25etcd                      3.4.13-0   3.4.13-0
26
27You can now apply the upgrade by executing the following command:
28
29	kubeadm upgrade apply 1.21.4
30
31_____________________________________________________________________
32
33
34The table below shows the current state of component configs as understood by this version of kubeadm.
35Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
36resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
37upgrade to is denoted in the "PREFERRED VERSION" column.
38
39API GROUP                 CURRENT VERSION   PREFERRED VERSION   MANUAL UPGRADE REQUIRED
40kubeproxy.config.k8s.io   v1alpha1          v1alpha1            no
41kubelet.config.k8s.io     v1beta1           v1beta1             no
42_____________________________________________________________________
43

检查没有问题之后,开始准备镜像

1kubeadm config images list
1k8s.gcr.io/kube-apiserver:v1.21.4
2k8s.gcr.io/kube-controller-manager:v1.21.4
3k8s.gcr.io/kube-scheduler:v1.21.4
4k8s.gcr.io/kube-proxy:v1.21.4
5k8s.gcr.io/pause:3.4.1
6k8s.gcr.io/etcd:3.4.13-0
7k8s.gcr.io/coredns/coredns:v1.8.0

镜像可以从过来的镜像站上获取,或者科学上网获取

导出原配置进行修改

1kubeadm config view > kubeadm-config-upgrade-v1.21.4.yaml
 1vim kubeadm-config-upgrade-v1.21.4.yaml
 2...
 3dns:
 4  imageRepository: k8s.gcr.io  # 可以修改为国内的镜像仓库地址
 5  imageTag: v1.8.0
 6  type: CoreDNS
 7etcd:
 8  local:
 9    imageRepository: k8s.gcr.io # 可以修改为国内镜像仓库地址
10    dataDir: /var/lib/etcd
11    imageTag: 3.4.13-0
12imageRepository: k8s.gcr.io # 可以修改为国内镜像仓库
13kind: ClusterConfiguration
14kubernetesVersion: v1.21.4 # 指定升级后的版本
15...

预升级,检查有无错误

1kubeadm upgrade apply 1.21.4 --config kubeadm-config-upgrade-v1.21.4.yaml --ignore-preflight-errors=ControlPlaneNodesReady,swap --dry-run

当输出[dryrun] Finished dryrunning successfully!,说明配置没有问题,可以升级了

1kubeadm upgrade apply 1.21.4 --config kubeadm-config-upgrade-v1.21.4.yaml --ignore-preflight-errors=ControlPlaneNodesReady,swap

等待升级完成。

1...
2[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.21.4". Enjoy!
3
4[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

升级node

1kubeadm upgrade node

注意需要重启kubelet服务看到的才是新的版本,重启kubelet服务

1systemctl daemon-reload
2systemctl restart kubelet

检查版本

1kubectl get nodes
2NAME         STATUS   ROLES    AGE    VERSION
3k8s-master   Ready    <none>   548d   v1.21.4
4k8s-node1    Ready    <none>   548d   v1.21.4
5k8s-node2    Ready    <none>   548d   v1.21.4

升级到1.22

接下来升级到1.22

方法和上面的一样

1yum -y install kubeadm-1.22.0 kubectl-1.22.0 kubelet-1.22.0
2kubeadm upgrade plan 1.22.0

获取镜像

1kubeadm config images list
1k8s.gcr.io/kube-apiserver:v1.22.0
2k8s.gcr.io/kube-controller-manager:v1.22.0
3k8s.gcr.io/kube-scheduler:v1.22.0
4k8s.gcr.io/kube-proxy:v1.22.0
5k8s.gcr.io/pause:3.5
6k8s.gcr.io/etcd:3.5.0-0
7k8s.gcr.io/coredns/coredns:v1.8.4

升级

1kubeadm upgrade apply 1.22.0 --dry-run
2kubeadm upgrade apply 1.22.0
3kubeadm upgrade node

重启kubelet

1systemctl daemon-reload
2systemctl restart kubelet

观察升级结果

1kubectl get nodes
2NAME         STATUS   ROLES           AGE    VERSION
3k8s-master   Ready    control-plane   548d   v1.22.0
4k8s-node1    Ready    <none>          548d   v1.22.0
5k8s-node2    Ready    <none>          548d   v1.22.0