Kubernetes跨版本升级-1.19到1.23

1. 前言

Kubernetes是不可以进行跨版本升级的,只能一个版本一个版本的升级,本文从1.19版本升级到1.23版本。 主要参考官网文档:升级 kubeadm 集群 | Kubernetes

在升级过程中可能会影响到系统正常使用,建议抽一段相对空闲的时间升级,尽可能将升级的影响成都降到最低。

在升级前最好将重要的配置文件做一个备份,尤其是控制节点的配置文件、kubelet的配置文件,同时建议将etcd数据库也做备份。

升级结束后要检查配置文件,将升级中修改的一些重要参数改回去,例如监控需要网络放开,需要将监控指标的网络改为开放,否则系统服务监控到部分对象状态。

kubernetes版本的升级也可能会影响到已经部署的服务,原因是升级后原来的某些版本可能被丢弃了,需要重新部署,所以升级一定要慎重。

升级后,证书的有效期是从当前升级时间开始算起,如果应用中使用到kubernetes证书的,请知晓。

本次之所以只升级到1.23,原因是1.24开始完全抛弃了docker-shim,可能会对系统影响比较大,暂不向上升级。

2. 从1.19升级到1.20

2.1 master节点升级

如果是多个master节点,每个节点逐一升级,确保一个控制节点升级完成后再升级下一个,保障系统的高可用始终有两个是健康的。

2.1.1 使用yum list 查看可升级版本

yum list --showduplicates kubeadm --disableexcludes=kubernetes
# find the latest 1.20 version in the list
# it should look like 1.20.x-0, where x is the latest patch

2.1.2准备镜像

kubernetes自己的服务直接按照版本号走,但是etcd和coredns与kubernetes版本是匹配关系,最好通过下面命令查看一下,kubeadm config images list --kubernetes-version=1.22.16-0

例如下面结果:

[root@centos73 ~]#kubeadm  config images list --kubernetes-version=v1.23.16
W0825 11:08:57.133212   16717 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.21.13
k8s.gcr.io/kube-controller-manager:v1.21.13
k8s.gcr.io/kube-scheduler:v1.21.13
k8s.gcr.io/kube-proxy:v1.21.13
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0

拉取镜像:

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers  \
--kubernetes-version v1.21.13

2.1.3 下载安装kubeadm

下载:

# replace x in 1.23.16-0 with the latest patch version
​
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

验证:

kubeadm version

排空master节点: 通过将节点标记为不可调度并驱逐工作负载来准备节点进行维护,将pod优雅的中止

kubectl drain centos75 --ignore-daemonsets --delete-emptydir-data

如果在驱逐的时候遇到下面的错误,大多数可能是因为helm安装导致的,如果服务不是核心应用,可以临时将副本数调整为0,升级结束后再调回来

error when evicting pods/"prometheus-k8s-1" -n "kuboard" (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

验证升级计划:

kubeadm upgrade plan

选择要升级的版本:

sudo kubeadm upgrade apply v1.23.16

在这里插入图片描述更新Kubeadm: 同时更新apiserver 、controller-manager、scheduler、proxy、etcd、coredns

sudo kubeadm upgrade node

2.1.4 下载安装kubelet & kubectl

安装:

yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes

如果涉及pause镜像的变更,更新完后需要修改/var/lib/kubelet/kubeadm-flags.env文件中的pause镜像标签

同时如果在安装过程中更新了CNI依赖,需要注意。1.1.1以及1.2.0版本的kubernetes-cni没有flannel插件,如果用的网络是flannel,需要手工安装一个kubernetes-cni的0.8.7的版本,

重启:

systemctl daemon-reload && systemctl restart kubelet

2.1.5 取消对节点的保护

通过将节点标记为可调度,让节点重新上线

kubectl uncordon centos75

2.2 升级node节点

node节点也需要逐一升级,一个节点升级后再升级下一个,保障有较多的资源可供容器使用。

2.2.1 排空node节点

在master上执行:

kubectl drain centos78 --ignore-daemonsets --delete-emptydir-data

2.2.2 下载kubeadm

在node节点上执行:

yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

更新Kubeadm:

sudo kubeadm upgrade node

2.2.3 升级node节点上的kubelet & kubectl

在node节点上执行:

yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes

如果涉及pause镜像的变更,更新完后需要修改/var/lib/kubelet/kubeadm-flags.env文件中的pause镜像标签

重启:

systemctl daemon-reload  && systemctl restart kubelet

2.2.4 取消对节点的保护

在master节点上运行: 通过将节点标记为可调度,让节点重新上线

kubectl uncordon centos78

2.3 验证

kubectl get nodes

3. 从1.20升级到1.21

同上步骤只需更改版本号

4. 从1.21升级到1.22

同上步骤只需更改版本号

5.从1.22升级到1.23

同上步骤只需更改版本号

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值