kubernetes的版本升级(kubeadm方式,亲测)

本文介绍了如何将 kubeadm 创建的 Kubernetes 集群从 1.16.x 版本升级到 1.17.x 版本,以及从版本 1.17.x 升级到 1.17.y ,其中 y > x。
高版本升级工作流如下:升级主控制平面节点---升级其他控制平面节点---升级工作节点。

工作原理

1.针对第一个升级的master节点

kubeadm upgrade apply 做了以下工作:

1)检查你的集群是否处于可升级状态:

         API 服务器是可访问的
        所有节点处于 Ready 状态
        控制面是健康的
2)强制执行版本偏差策略。
3)确保控制面的镜像是可用的或可拉取到服务器上。
4)如果组件配置要求版本升级,则生成替代配置与/或使用用户提供的覆盖版本配置。
5)升级控制面组件或回滚(如果其中任何一个组件无法启动)。
6)应用新的 CoreDNS 和 kube-proxy 清单,并强制创建所有必需的 RBAC 规则。
7)如果旧文件在 180 天后过期,将创建 API 服务器的新证书和密钥文件并备份旧文件。

2.针对其他master节点

kubeadm upgrade node 在其他控制平节点上执行以下操作

1)从集群中获取 kubeadm ClusterConfiguration 。
2)(可选操作)备份 kube-apiserver 证书。
3)升级控制平面组件的静态 Pod 清单。
4)为本节点升级 kubelet 配置

3.针对worker节点

kubeadm upgrade node 在工作节点上完成以下工作:
1)从集群取回 kubeadm ClusterConfiguration 。
2)为本节点升级 kubelet 配置。

具体步骤

一.升级主控制节点

1.准备升级
禁用SWAP,集群应使用静态的控制平面和 etcd pod 或者 外部 etcd,务必备份所有重要组件,升级后,因为容器 spec 哈希值已更改,所以所有容器都会重新启动,
您只能从一个次版本升级到下一个次版本,或者同样次版本的补丁版。也就是说,升级时无法跳过版本。 例如,您只能从 1.y 升级到 1.y+1,而不能从 from 1.y 升级到 1.y+2

2.检查要升级的稳定版本1.17
yum list --showduplicates kubeadm --disableexcludes=kubernete
3.用最新的修补程序版本替换 1.17.x-0 中的 x
yum install -y kubeadm-1.17.x-0 --disableexcludes=kubernetes
4.验证 kubeadm 版本:
kubeadm version
5.腾空控制平面节点:
kubectl drain $CP_NODE --ignore-daemonsets
6.检查集群是否可以升级,并获取到升级的版本
kubeadm upgrade plan
7.选择要升级到的版本,然后运行相应的命令
kubeadm upgrade apply v1.17.x
将 x 替换为您为此升级选择的修补程序版本。

8.设置不可调度
kubectl uncordon $CP_NODE
9.升级控制平面节点上的 kubelet 和 kubectl 
yum install -y kubelet-1.17.x-0 kubectl-1.17.x-0 --disableexcludes=kubernetes
10.重启 kubelet
systemctl restart kubelet

二.升级其他控制节点

1.腾空控制平面节点:
kubectl drain $CP_NODE --ignore-daemonsets
2.检查集群是否可以升级,并升级到对应版本
kubeadm upgrade node experimental-control-plane

三.升级计算worker节点

工作节点上的升级过程应该一次执行一个节点,或者一次执行几个节点,以不影响运行工作负载所需的最小容量

1.升级kubeadm

yum install -y kubeadm-1.17.x-0 --disableexcludes=kubernetes
2.验证 kubeadm 版本:
kubeadm version
3.通过将节点标记为不可调度并逐出工作负载,为维护做好准备。运行:
kubectl drain $NODE --ignore-daemonsets
4.升级 kubelet 配置:
kubeadm upgrade node config --kubelet-version v1.17.x
5.升级 kubelet 与 kubectl
yum install -y kubelet-1.17.x-0 kubectl-1.17.x-0 --disableexcludes=kubernetes
6.重启 kubelet
systemctl restart kubelet
7.取消对节点的保护
8.通过将节点标记为可调度,让节点重新上线:
kubectl uncordon $NODE

四.验证集群的状态
1.在所有节点上升级 kubelet 后,通过从 kubectl 可以访问集群的任何位置运行以下命令,验证所有节点是否再次可用:
kubectl get nodes
五.从故障状态恢复
如果 kubeadm upgrade 失败并且没有回滚,例如由于执行期间意外关闭,您可以再次运行 kubeadm upgrade。 
此命令是幂等的,并最终确保实际状态是您声明的所需状态。 要从故障状态恢复,您还可以运行 kubeadm upgrade --force 而不去更改集群正在运行的版本

在升级期间,kubeadm 向 /etc/kubernetes/tmp 目录下的如下备份文件夹写入数据:
1.kubeadm-backup-etcd--

kubeadm-backup-etcd 包含当前控制面节点本地 etcd 成员数据的备份。 如果 etcd 升级失败并且自动回滚也无法修复,则可以将此文件夹中的内容复制到 /var/lib/etcd 进行手工修复。如果使用的是外部的 etcd,则此备份文件夹为空。
2.kubeadm-backup-manifests--

kubeadm-backup-manifests 包含当前控制面节点的静态 Pod 清单文件的备份版本。 如果升级失败并且无法自动回滚,则此文件夹中的内容可以复制到 /etc/kubernetes/manifests 目录实现手工恢复

你可能感兴趣的:(k8s,kubernetes)