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
同上步骤只需更改版本号