目录

k8s 1.17 升级到 1.18

环境信息

当前版本:v1.17.5

目标版本:1.18.15

升级方式:kubeadm

推荐升级的版本为当前版本+1如1.16 升级到1.171.17 升级到1.18

查看当前yum 源里是否有模板版本,如果没有的话需要更新yum 源。

1
2
3
4
5
6
7
8
9
yum list --showduplicates kubeadm --disableexcludes=kubernetes
···
kubeadm.x86_64                                                                       1.18.13-0                                                                        kubernetes 
kubeadm.x86_64                                                                       1.18.14-0                                                                        kubernetes 
kubeadm.x86_64                                                                       1.18.15-0                                                                        kubernetes 
kubeadm.x86_64                                                                       1.19.0-0                                                                         kubernetes 
kubeadm.x86_64                                                                       1.19.1-0                                                                         kubernetes 
kubeadm.x86_64                                                                       1.19.2-0                                                                         kubernetes
···

升级master节点

准备升级所需镜像

查看所需镜像,将这些镜像拉取下来传到私有仓库里,可使用kubeadm config images list 查看所需镜像版本(会列出当前kubeadm版本所需镜像,如果不确定需要拉取哪些镜像,可以升级到对应版本的kubeadm运行查看所需镜像)。

1
2
3
4
5
6
7
k8s.gcr.io/kube-apiserver:v1.18.15
k8s.gcr.io/kube-controller-manager:v1.18.15
k8s.gcr.io/kube-scheduler:v1.18.15
k8s.gcr.io/kube-proxy:v1.18.15
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

我目前是从registry.cn-hangzhou.aliyuncs.com/google_containers 这个仓库拉取镜像。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
pullReg=registry.cn-hangzhou.aliyuncs.com/google_containers
pushReg=reg.xxx.cn/k8s.gcr.io
for i in $(echo -n 'k8s.gcr.io/kube-apiserver:v1.18.15
k8s.gcr.io/kube-controller-manager:v1.18.15
k8s.gcr.io/kube-scheduler:v1.18.15
k8s.gcr.io/kube-proxy:v1.18.15
k8s.gcr.io/pause:3.2
k8s.gcr.io/coredns:1.6.7');do app=$(echo $i|awk -F 'k8s.gcr.io/' '{print $2}') && \
docker pull ${pullReg}/${app} && \
docker tag ${pullReg}/${app} ${pushReg}/${app} && \
docker push ${pushReg}/${app}; done

开始升级master节点

首先升级kubeadm

1
yum -y install kubeadm-1.18.15-0 kubectl-1.18.15

查看升级计划

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@vlnx107024 ~]# kubeadm upgrade plan
···
External components that should be upgraded manually before you upgrade the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT   AVAILABLE
Etcd        3.4.9     3.4.3-0

Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       AVAILABLE
Kubelet     5 x v1.17.7   v1.18.15

Upgrade to the latest version in the v1.17 series:

COMPONENT            CURRENT   AVAILABLE
API Server           v1.17.7   v1.18.15
Controller Manager   v1.17.7   v1.18.15
Scheduler            v1.17.7   v1.18.15
Kube Proxy           v1.17.7   v1.18.15
CoreDNS              1.6.5     1.6.7

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

  kubeadm upgrade apply v1.18.15

因为这个k8s集群是使用集群外的etcd 方式,所以版本比较新,如果版本低于AVAILABLE 的版本,需要先升级etcd

开始升级第一个节点:

1
kubeadm upgrade apply -y 1.18.15 --config=/root/kubeadm-config.yml --ignore-preflight-errors=all --force

kubeadm upgrade apply 参数:

  • --allow-experimental-upgrades : 显示不稳定版本,允许升级到alpha/beta或rc版本。
  • --certificate-renewal : 默认为true,执行升级期间更新证书
  • --config : kubeadm配置文件路径,如果没有更新配置文件可以不添加
  • --force : 强制升级,非交互模式
  • --ignore-preflight-errors : 为all 时忽略检查中的所有错误
  • --print-config : 是否打印升级中使用的配置文件
  • -y, --yes : 非交互模式。

查看更新节点的apiserver controler manager kube-schdule 状态及版本是否正常

1
kubectl -n kube-system  get po

更新成功后重启kubelet

1
systemctl restart kubelet

查看集群内当前节点的版本,为1,18,15 就是正常了

1
kubectl get nodes

随后依次更新另外两个master节点

1
kubeadm    upgrade apply -y 1.18.15   --ignore-preflight-errors=all    --force

升级node节点

node节点升级操作就更简单了

首先同样是安装包

1
yum -y install kubeadm-1.18.15-0 kubectl-1.18.15

最好是清空当前节点,不过由于我是升级测试环境就省略这一步,升级完节点由于结构体有变化,hash值变更会重启当前节点所有的pod进行更新。

1
kubectl drain --delete-local-data --force --ignore-daemonsets --grace-period=0  ${currentNodeName}

开始更新

1
kubeadm upgrade node

重启kubelet

1
systemctl restart kubelet

检查节点状态

1
kubectl get nodes

没问题后重复此步骤,依次升级剩余节点即可。

参考资料

https://v1-18.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-upgrade/