Kubernetes 不支持跨多个版本升级!因此要1.18-1.19-1.20-1.21-1.22-1.23 这种逐步升级,当跨越多个版本时升级较为繁琐。
一、概述
1、升级注意事项
- 下述说明了在升级过程中何时腾空每个节点。如果你正在对任何
kubelet
进行小版本升级, 你需要先腾空待升级的节点(或多个节点)。对于控制面节点,其上可能运行着CoreDNS Pods
或者其它非常重要的负载。更多信息见腾空节点。 - 升级后,因为容器规约的哈希值已更改,所有容器都会被重新启动。
- 要验证 kubelet 服务在升级后是否成功重启,可以执行
systemctl status kubelet
或journalctl -xeu kubelet
查看服务日志。
2、版本偏差策略
name | apiserver | kubelet |
---|---|---|
apiserver | ±1 | |
kubelet | -2 | |
kube-controller-manager, kube-scheduler | -1 | |
kube-proxy | -2 | 与kubelet节点相同 |
kubectl | ±1 |
3、当前集群环境
主机 | 系统 | IP |
---|---|---|
loc-master35 | CentOS 7.6 | 10.10.1.35 |
loc-node36 | CentOS 7.6 | 10.10.1.36 |
loc-node37 | CentOS 7.6 | 10.10.1.37 |
4、宏观升级流程
- 升级主控制平面节点
- 升级其他控制平面节点
- 升级工作节点
二、升级控制平面节点
1、确认升级版本
# yum list --showduplicates kubeadm --disableexcludes=kubernetes
......
ubeadm.x86_64 1.17.16-0 kubernetes
kubeadm.x86_64 1.17.17-0 kubernetes
......
kubeadm.x86_64 1.18.20-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
kubeadm.x86_64 1.19.3-0 kubernetes
kubeadm.x86_64 1.19.4-0 kubernetes
kubeadm.x86_64 1.19.5-0 kubernetes
kubeadm.x86_64 1.19.6-0 kubernetes
kubeadm.x86_64 1.19.7-0 kubernetes
kubeadm.x86_64 1.19.8-0 kubernetes
kubeadm.x86_64 1.19.9-0 kubernetes
kubeadm.x86_64 1.19.10-0 kubernetes
kubeadm.x86_64 1.19.11-0 kubernetes
kubeadm.x86_64 1.19.12-0 kubernetes
kubeadm.x86_64 1.19.13-0 kubernetes
kubeadm.x86_64 1.19.14-0 kubernetes
kubeadm.x86_64 1.19.15-0 kubernetes
......
kubeadm.x86_64 1.24.0-0 kubernetes
2、升级控制平面节点
我们先升级第一个主控制节点,然后再升级其他控制节点,最后在升级其他工作节点。
2.1 kubeadm upgrade
- 升级
kubeadm
# yum install kubeadm-1.19.12-0 --disableexcludes=kubernetes
- 验证升级计划
# kubeadm upgrade plan # 检查集群是否可以升级
......
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT CURRENT AVAILABLE
kubelet 3 x v1.18.0 v1.19.16
Upgrade to the latest stable version:
COMPONENT CURRENT AVAILABLE
kube-apiserver v1.18.0 v1.19.16
kube-controller-manager v1.18.0 v1.19.16
kube-scheduler v1.18.0 v1.19.16
kube-proxy v1.18.0 v1.19.16
CoreDNS 1.6.7 1.7.0
etcd 3.4.3-0 3.4.13-0
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.19.16
Note: Before you can perform this upgrade, you have to update kubeadm to v1.19.16.
......
_____________________________________________________________________
- 选择升级到的版本
# kubeadm upgrade apply 1.19.12
......
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.19.12". Enjoy!
kubeadm upgrade
会自动对 kubeadm
在节点上所管理的证书执行续约操作。 如果需要略过证书续约操作,可以使用标志 --certificate-renewal=false。
# kubeadm upgrade apply 1.19.12 --certificate-renewal=false
2.2 腾空节点
kubectl drain
命令将节点标记为不可调度并驱逐所有负载
# kubectl drain loc-master35 --ignore-daemonsets
2.3 升级 kubelet 和 kubectl
# yum install kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes -y
# 重启 kubelet
# systemctl daemon-reload
# systemctl restart kubelet
2.4 取消对节点的保护
# kubectl uncordon loc-master35
node/loc-master35 uncordoned
3、 升级其他控制平面
假设有其他 master
的话,我们还需要对这些 master
进行升级
# yum install kubeadm-1.19.12-0 kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes
#
# kubeadm upgrade node # 这一点与主不一样
# kubectl drain loc-master-xx --ignore-daemonsets
# systemctl daemon-reload
# systemctl restart kubelet
# kubectl uncordon loc-master-xx
三、升级工作节点
1、升级 kubeadm
# yum install kubeadm-1.19.12-0 --disableexcludes=kubernetes
2、kubeadm upgrade
# kubeadm upgrade node
3、腾空节点
kubectl drain
命令将节点标记为不可调度并驱逐所有负载
# kubectl drain loc-node36 --ignore-daemonsets
4、升级 kubelet 和 kubectl
# yum install kubelet-1.19.12-0 kubectl-1.19.12-0 --disableexcludes=kubernetes -y
# 重启 kubelet
# systemctl daemon-reload
# systemctl restart kubelet
5、取消对节点的保护
# kubectl uncordon loc-node36
node/loc-node36uncordoned
四、升级后检验
- 查看节点状态
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
loc-master35 Ready master 33d v1.19.12 10.10.1.35 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.6.3
loc-node36 Ready <none> 33d v1.19.12 10.10.1.36 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.6.3
loc-node37 Ready <none> 33d v1.19.12 10.10.1.37 <none> CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.6.3
- 查看插件是否正常
# kubectl logs -f kube-controller-manager-loc-master35 -n kube-system
- 查看
kubelet
日志输出
# journalctl -f -u kubelet
...
五、工作原理
1、kubeadm upgrade apply
kubeadm upgrade apply 做了以下工作:
- 检查你的集群是否处于可升级状态:
-
- API 服务器是可访问的
-
- 所有节点处于 Ready 状态
-
- 控制面是健康的
- 强制执行版本偏差策略。
- 确保控制面的镜像是可用的或可拉取到服务器上。
- 如果组件配置要求版本升级,则生成替代配置与/或使用用户提供的覆盖版本配置。
- 升级控制面组件或回滚(如果其中任何一个组件无法启动)。
- 应用新的 CoreDNS 和 kube-proxy 清单,并强制创建所有必需的 RBAC 规则。
- 如果旧文件在 180 天后过期,将创建 API 服务器的新证书和密钥文件并备份旧文件。
2、kubeadm upgrade node
kubeadm upgrade node
在其他控制平节点上执行以下操作:
- 从集群中获取 kubeadm ClusterConfiguration。
- (可选操作)备份 kube-apiserver 证书。
- 升级控制平面组件的静态 Pod 清单。
- 为本节点升级 kubelet 配置
kubeadm upgrade node
在工作节点上完成以下工作:
- 从集群取回 kubeadm ClusterConfiguration。
- 为本节点升级 kubelet 配置。
Reference:
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
https://kubernetes.io/releases/version-skew-policy/