升级 kubeadm 部署的 k8s 集群

目录

一、环境

操作系统 CentOS Linux release 7.9.2009 (Core)
Kubernetes 部署工具 kubeadm
集群架构 一个主节点(Master Node)和两个工作节点(Worker Nodes)
部署环境 Vmware Workstation 16 Pro
网络插件 Flannel

二、注意事项

1、备份数据

升级前最好备份所有组件及数据,例如etcd

2、跨版本升级

不要跨两个大版本进行升级,可能会存在版本bug

Kubernetes 版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是补丁版本

  • 1.22.2 --> 1.22.16 可以

  • 1.22.2 --> 1.23.2 可以

  • 1.22.2 --> 1.25.2 不可以

  • 跨多个版本的可以逐个版本进行升级。

3、支持的版本偏差

3.1、kube-apiserver

高可用性(HA)集群中, 最新版和最老版的 kube-apiserver 实例版本偏差最多为一个次要版本。

例如:

  • 最新的 kube-apiserver 实例处于 1.31 版本
  • 其他 kube-apiserver 实例支持 1.311.30 版本

3.2、kubeklet

  • kubelet 版本不能比 kube-apiserver 版本新。
  • kubelet 可以比 kube-apiserver 低三个次要版本(如果 kubelet < 1.25,则只能比 kube-apiserver 低两个次要版本)。

例如:

  • kube-apiserver 处于 1.31 版本
  • kubelet 支持 1.311.301.291.28 版本

如果 HA 集群中的 kube-apiserver 实例之间存在版本偏差,这会缩小允许的 kubelet 版本范围。

例如:

  • kube-apiserver 实例处于 1.311.30 版本
  • kubelet 支持 1.301.291.28 版本(不支持 1.31 版本,因为这将比 kube-apiserver 1.30 版本的实例新)

3.3、kube-proxy

  • kube-proxy 不能比 kube-apiserver 新。
  • kube-proxy 最多可以比 kube-apiserver 旧三个小版本(kube-proxy < 1.25 最多只能比 kube-apiserver 旧两个小版本)。
  • kube-proxy 可能比它旁边运行的 kubelet 实例旧或新最多三个次要版本(kube-proxy < 1.25 最多只能是比它并行运行的 kubelet 实例旧或新的两个次要版本)。

例如:

  • kube-apiserver 的版本是 1.31
  • kube-proxy 支持的版本是 1.311.301.291.28

如果在 HA 集群中的 kube-apiserver 实例之间存在版本偏差, 所允许的 kube-proxy 版本范围会被缩小。

例如:

  • kube-apiserver 实例的版本是 1.311.30
  • kube-proxy 版本为 1.301.291.281.31 将不被支持, 因为该版本将比 1.30 的 kube-apiserver 实例更新)

3.4、kube-controller-manager、kube-scheduler 和 cloud-controller-manager

kube-controller-managerkube-schedulercloud-controller-manager 不能比与它们通信的 kube-apiserver 实例新。 它们应该与 kube-apiserver 次要版本相匹配,但可能最多旧一个次要版本(允许实时升级)。

例如:

  • kube-apiserver 处于 1.31 版本
  • kube-controller-managerkube-schedulercloud-controller-manager 支持 1.311.30 版本

如果 HA 集群中的 kube-apiserver 实例之间存在版本偏差, 并且这些组件可以与集群中的任何 kube-apiserver 实例通信(例如,通过负载均衡器),这会缩小这些组件所允许的版本范围。

例如:

  • kube-apiserver 实例处于 1.311.30 版本
  • kube-controller-managerkube-schedulercloud-controller-manager 与可以路由到任何 kube-apiserver 实例的负载均衡器通信
  • kube-controller-managerkube-schedulercloud-controller-manager 支持 1.30 版本(不支持 1.31 版本,因为它比 1.30 版本的 kube-apiserver 实例新)

3.5、kubectl

kubectlkube-apiserver 的一个次要版本(较旧或较新)中支持。

例如:

  • kube-apiserver 处于 1.31 版本
  • kubectl 支持 1.321.311.30 版本

如果 HA 集群中的 kube-apiserver 实例之间存在版本偏差,这会缩小支持的 kubectl 版本范围。

例如:

  • kube-apiserver 实例处于 1.311.30 版本
  • kubectl 支持 1.311.30 版本(其他版本将与 kube-apiserver 组件之一相差不止一个的次要版本)

4、升级流程

  1. 升级主控制平面节点
  2. 升级其他控制平面节点
  3. 升级工作节点

三、版本升级(补丁版本升级)

目标:v1.22.2 --> v1.22.16

1、查看当前版本

kubectl get nodes

2、确定要升级到的版本

当前我们的版本在1.22.2,我们需要升级到1.22.16(属于补丁版本升级)

查询版本,会列出当前所有的正式版本

yum list --showduplicates kubeadm --disableexcludes=kubernetes

3、升级 master 节点

控制面上的升级过程应该每次处理一个节点。 首先选择一个要先行升级的控制面节点。该节点上必须拥有 /etc/kubernetes/admin.conf 文件。 即管理员使用的 kubeconfig 证书文件

3.1、升级 kubeadm

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

3.2、验证下载的 kubeadm 版本是否正确

kubeadm version

3.3、验证升级计划

检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。

kubeadm upgrade plan

在打印信息中可以看到,升级集群每个组件对应的当前版本和升级后的版本。而且升级的组件只包括kube-apiserver,kube-controller-manager,kube-scheduler,kube-proxy,CoreDNS,etcd。

不包括kubectl,kubelet,docker和网络组件flannel等

3.4、根据提示,选择合适版本升级

kubeadm upgrade apply v1.22.16
过程中会交互式的询问你是否继续升级
输入 y 确认继续后进入到镜像预拉取阶段,可以提前输入 kubeadm config images pull 拉取必须镜像减少升级时间
成功出现 SUCCESS! 即可

3.5、设置 master 节点进入维护状态

通过将 master 节点标记为不可调度并腾空节点为 master 节点作升级准备

kubectl drain k8s-master1 --ignore-daemonsets

3.6、升级 kubelet 和 kubectl

同样的,把 kubelet 和 kubectl 都升级到 1.22.16 版本

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

3.7、重载重启 kubelet

systemctl daemon-reload && systemctl restart kubelet

3.8、解除对 master 节点的隔离状态

kubectl uncordon k8s-master1

3.9、验证 master 节点升级情况

已成功升级到 1.22.16 版本

kubectl get nodes

4、升级 Worker 节点

工作节点上的升级过程最好一次执行一个节点,一次执行几个节点也行

4.1、升级 kubeadm

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

4.2、升级 kubelet 的配置

kubeadm upgrade node

4.3、设置 worker 节点为维护状态

kubectl drain k8s-node1 --ignore-daemonsets

4.4、升级 kubelet 和 kubectl

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

4.5、重载重启 kubelet

systemctl daemon-reload && systemctl restart kubelet

4.6、解除对 worker 节点的隔离状态

剩下的节点也是重复 4、升级 Worker 节点 的操作即可

kubectl uncordon k8s-node1

5、最终结果

done

kubectl get nodes

四、版本升级(次要版本升级)

目标:v1.22.16 --> v1.23.16

1、查看当前版本

kubectl get nodes

2、升级 master 节点

2.1、升级 kubeadm

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

2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办

  • 卸载当前版本的 kubeadm
  • 清理缓存
  • 重新安装指定 kubeadm 版本
yum remove kubeadm
yum clean all
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

2.2、验证下载的 kubeadm 版本是否正确

kubeadm version

2.3、验证升级计划

kubeadm upgrade plan

2.4、根据提示,选择合适版本升级

kubeadm upgrade apply v1.23.16

2.5、设置 master 节点进入维护状态

kubectl drain k8s-master1 --ignore-daemonsets

2.6、升级 kubelet 和 kubectl

同样的,把 kubelet 和 kubectl 都升级到 1.23.16 版本

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

2.7、重载重启 kubelet

systemctl daemon-reload && systemctl restart kubelet

2.8、解除对 master 节点的隔离状态

kubectl uncordon k8s-master1

2.9、验证 master 节点升级情况

kubectl get nodes

3、升级 Worker 节点

3.1、升级 kubeadm

ansible 的执行升级操作

ansible k8s-node -m shell -a 'yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes'

3.2、升级 kubelet 的配置

ansible k8s-node -m shell -a 'kubeadm upgrade node'

3.3、设置 worker 节点为维护状态

kubectl drain k8s-node1 --ignore-daemonsets
kubectl drain k8s-node2 --ignore-daemonsets

3.4、升级 kubelet 和 kubectl

ansible k8s-node -m shell -a 'yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes'

3.5、重载重启 kubelet

ansible k8s-node -m shell -a 'systemctl daemon-reload && systemctl restart kubelet'

3.6、解除对 worker 节点的隔离状态

kubectl uncordon k8s-node1
kubectl uncordon k8s-node2

4、验证

kubectl get nodes

五、工作原理

1、kubeadm upgrade apply 做了以下工作:

kubeadm upgrade apply 做了以下工作:

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

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

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

3、kubeadm upgrade node 在工作节点上完成以下工作:

  • 从集群取回 kubeadm ClusterConfiguration
  • 为本节点升级 kubelet 配置。

热门相关:   甜性涩爱   彷徨之刃   借种   童时爱上你粤