升级 kubeadm 部署的 k8s 集群

文章目录

  • 一、环境
  • 二、注意事项
  • 三、版本升级(补丁版本升级)
    • 1、查看当前版本
    • 2、确定要升级到的版本
    • [3、升级 master 节点](#3、升级 master 节点)
      • [3.1、升级 kubeadm](#3.1、升级 kubeadm)
      • [3.2、验证下载的 kubeadm 版本是否正确](#3.2、验证下载的 kubeadm 版本是否正确)
      • 3.3、验证升级计划
      • 3.4、根据提示,选择合适版本升级
      • [3.5、设置 master 节点进入维护状态](#3.5、设置 master 节点进入维护状态)
      • [3.6、升级 kubelet 和 kubectl](#3.6、升级 kubelet 和 kubectl)
      • [3.7、重载重启 kubelet](#3.7、重载重启 kubelet)
      • [3.8、解除对 master 节点的隔离状态](#3.8、解除对 master 节点的隔离状态)
      • [3.9、验证 master 节点升级情况](#3.9、验证 master 节点升级情况)
    • [4、升级 Worker 节点](#4、升级 Worker 节点)
      • [4.1、升级 kubeadm](#4.1、升级 kubeadm)
      • [4.2、升级 kubelet 的配置](#4.2、升级 kubelet 的配置)
      • [4.3、设置 worker 节点为维护状态](#4.3、设置 worker 节点为维护状态)
      • [4.4、升级 kubelet 和 kubectl](#4.4、升级 kubelet 和 kubectl)
      • [4.5、重载重启 kubelet](#4.5、重载重启 kubelet)
      • [4.6、解除对 worker 节点的隔离状态](#4.6、解除对 worker 节点的隔离状态)
    • 5、最终结果
  • 四、版本升级(次要版本升级)
    • 1、查看当前版本
    • [2、升级 master 节点](#2、升级 master 节点)
      • [2.1、升级 kubeadm](#2.1、升级 kubeadm)
        • [2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办](#2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办)
      • [2.2、验证下载的 kubeadm 版本是否正确](#2.2、验证下载的 kubeadm 版本是否正确)
      • 2.3、验证升级计划
      • 2.4、根据提示,选择合适版本升级
      • [2.5、设置 master 节点进入维护状态](#2.5、设置 master 节点进入维护状态)
      • [2.6、升级 kubelet 和 kubectl](#2.6、升级 kubelet 和 kubectl)
      • [2.7、重载重启 kubelet](#2.7、重载重启 kubelet)
      • [2.8、解除对 master 节点的隔离状态](#2.8、解除对 master 节点的隔离状态)
      • [2.9、验证 master 节点升级情况](#2.9、验证 master 节点升级情况)
    • [3、升级 Worker 节点](#3、升级 Worker 节点)
      • [3.1、升级 kubeadm](#3.1、升级 kubeadm)
      • [3.2、升级 kubelet 的配置](#3.2、升级 kubelet 的配置)
      • [3.3、设置 worker 节点为维护状态](#3.3、设置 worker 节点为维护状态)
      • [3.4、升级 kubelet 和 kubectl](#3.4、升级 kubelet 和 kubectl)
      • [3.5、重载重启 kubelet](#3.5、重载重启 kubelet)
      • [3.6、解除对 worker 节点的隔离状态](#3.6、解除对 worker 节点的隔离状态)
    • 4、验证
  • 五、工作原理
    • [1、kubeadm upgrade apply 做了以下工作:](#1、kubeadm upgrade apply 做了以下工作:)
    • [2、kubeadm upgrade node 在其他控制平节点上执行以下操作:](#2、kubeadm upgrade node 在其他控制平节点上执行以下操作:)
    • [3、kubeadm upgrade node 在工作节点上完成以下工作:](#3、kubeadm upgrade node 在工作节点上完成以下工作:)

一、环境

操作系统 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、查看当前版本

bash 复制代码
kubectl get nodes

2、确定要升级到的版本

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

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

bash 复制代码
yum list --showduplicates kubeadm --disableexcludes=kubernetes

3、升级 master 节点

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

3.1、升级 kubeadm

bash 复制代码
yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes

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

bash 复制代码
kubeadm version

3.3、验证升级计划

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

bash 复制代码
kubeadm upgrade plan

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

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

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

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

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

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

bash 复制代码
kubectl drain k8s-master1 --ignore-daemonsets

3.6、升级 kubelet 和 kubectl

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

bash 复制代码
yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

3.7、重载重启 kubelet

bash 复制代码
systemctl daemon-reload && systemctl restart kubelet

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

bash 复制代码
kubectl uncordon k8s-master1

3.9、验证 master 节点升级情况

已成功升级到 1.22.16 版本

bash 复制代码
kubectl get nodes

4、升级 Worker 节点

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

4.1、升级 kubeadm

bash 复制代码
yum install -y kubeadm-1.22.16-0 --disableexcludes=kubernetes

4.2、升级 kubelet 的配置

bash 复制代码
kubeadm upgrade node

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

bash 复制代码
kubectl drain k8s-node1 --ignore-daemonsets

4.4、升级 kubelet 和 kubectl

bash 复制代码
yum install -y kubelet-1.22.16-0 kubectl-1.22.16-0 --disableexcludes=kubernetes

4.5、重载重启 kubelet

bash 复制代码
systemctl daemon-reload && systemctl restart kubelet

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

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

bash 复制代码
kubectl uncordon k8s-node1

5、最终结果

done

bash 复制代码
kubectl get nodes

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

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

1、查看当前版本

bash 复制代码
kubectl get nodes

2、升级 master 节点

2.1、升级 kubeadm

bash 复制代码
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes
2.1.1、下载的 kubeadm 版本超过了当前集群可以升级的版本怎么办
  • 卸载当前版本的 kubeadm
  • 清理缓存
  • 重新安装指定 kubeadm 版本
bash 复制代码
yum remove kubeadm
yum clean all
yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes

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

bash 复制代码
kubeadm version

2.3、验证升级计划

bash 复制代码
kubeadm upgrade plan

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

bash 复制代码
kubeadm upgrade apply v1.23.16

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

bash 复制代码
kubectl drain k8s-master1 --ignore-daemonsets

2.6、升级 kubelet 和 kubectl

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

bash 复制代码
yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes

2.7、重载重启 kubelet

bash 复制代码
systemctl daemon-reload && systemctl restart kubelet

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

bash 复制代码
kubectl uncordon k8s-master1

2.9、验证 master 节点升级情况

bash 复制代码
kubectl get nodes

3、升级 Worker 节点

3.1、升级 kubeadm

ansible 的执行升级操作

bash 复制代码
ansible k8s-node -m shell -a 'yum install -y kubeadm-1.23.16-0 --disableexcludes=kubernetes'

3.2、升级 kubelet 的配置

bash 复制代码
ansible k8s-node -m shell -a 'kubeadm upgrade node'

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

bash 复制代码
kubectl drain k8s-node1 --ignore-daemonsets
kubectl drain k8s-node2 --ignore-daemonsets

3.4、升级 kubelet 和 kubectl

bash 复制代码
ansible k8s-node -m shell -a 'yum install -y kubelet-1.23.16-0 kubectl-1.23.16-0 --disableexcludes=kubernetes'

3.5、重载重启 kubelet

bash 复制代码
ansible k8s-node -m shell -a 'systemctl daemon-reload && systemctl restart kubelet'

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

bash 复制代码
kubectl uncordon k8s-node1
kubectl uncordon k8s-node2

4、验证

bash 复制代码
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 配置。
相关推荐
摸鱼也很难39 分钟前
Docker 镜像加速和配置的分享 && 云服务器搭建beef-xss
运维·docker·容器
woshilys1 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
疯狂飙车的蜗牛2 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
恩爸编程3 小时前
探索 Nginx:Web 世界的幕后英雄
运维·nginx·nginx反向代理·nginx是什么·nginx静态资源服务器·nginx服务器·nginx解决哪些问题
鸠摩智首席音效师4 小时前
Docker 中如何限制CPU和内存的使用 ?
docker·容器
Michaelwubo4 小时前
Docker dockerfile镜像编码 centos7
运维·docker·容器
好像是个likun4 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
暴富的Tdy7 小时前
【快速上手Docker 简单配置方法】
docker·容器·eureka
cominglately7 小时前
centos单机部署seata
linux·运维·centos
魏 无羡7 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos