2-2-kubernetes升级

熊 0 阅读 容器

假设k8s的版本格式为x.y.z,那么使用kubeadm最多只能升级到y+1版本,或者是当前y版本的最新版本。例如你k8s集群的版本为1.24.x,那么你最大版本只能下载1.25.x的kubeadm来升级版本。

1. 升级指南

1.1 升级控制平面节点

  • 升级kubeadm

  • 清空当前节点

  • 升级kubelet和kubectl

  • 解除当前节点的封锁

kubernetes-update-1

1.2 升级工作节点

  • 升级 kubeadm

  • 清空当前节点

  • 升级 kubelet 和 kubectl

  • 解除当前节点的封锁

kubernetes-update-2

以上是 , 在使用 kubeadm 部署的 Kubernetes 集群中进行升级通常需要执行的步骤。

1.3 总结

在执行升级前 , 请确保备份重要数据和配置 , 并在生产环境中进行升级前做好充分测试。

1.3.1 升级前的准备工作

  1. 备份重要数据和配置 在执行升级之前 , 确保备份所有重要的数据和配置文件 , 特别是 etcd 数据存储 , 以便在需要时进行恢复。

  2. 查看官方文档 查看 Kubernetes 官方文档 , 了解升级所需的新版本特定的步骤和注意事项。不同的 Kubernetes 版本升级可能有所不同。

1.3.2 升级步骤

  1. 备份和升级 etcd 数据存储 在开始升级之前 , 确保对 etcd 数据存储进行备份。这是非常关键的步骤 , 以防止数据丢失。升级过程中可能涉及 etcd 数据模式或存储的变化。

  2. 升级 Control Plane 节点

    • 首先 , 将 Master 节点上的 kube-apiserver、kube-controller-manager 和 kube-scheduler 组件升级到新版本。

    • 对每个 Control Plane 节点执行升级步骤 , 通常可以通过更改包管理器的源、安装软件包或二进制文件的更新来完成。

  3. 更新 kubelet 和 kubectl

    • 在所有节点上更新 kubelet 和 kubectl 版本。这可以通过包管理器进行更新 , 或者直接下载并安装新版本的二进制文件。

  4. Drain 节点和迁移 Pod

    • 对每个节点运行 kubectl drain 命令 , 确保节点上的 Pod 被优雅地驱逐并迁移到其他节点。

    • 然后 , 升级该节点 , 并确保它重新加入集群后重新接管其工作负载。

  5. 验证节点状态

    • 确保所有节点成功加入并处于可用状态。

    • 使用 kubectl get nodes 等命令检查节点状态 , 并确保没有出现异常情况。

  6. 更新 CNI 插件和其他组件

    • 如果您使用了网络插件(如 Calico、Flannel 等) , 确保更新插件版本以兼容新的 Kubernetes 版本。

    • 对其他附加的 Kubernetes 组件 , 如 CoreDNS、Ingress 控制器等 , 也需要进行相应的更新。

  7. 验证集群功能

    • 运行一系列功能测试 , 确保集群正常工作。测试集群的基本功能 , 如 Pod 创建、服务通信等。

  8. 监控和故障排除

    • 监控新版本的集群 , 确保所有工作负载正常运行 , 并持续监测可能出现的异常情况。

    • 如果出现任何问题 , 立即进行故障排除 , 并根据需要回滚到先前的稳定状态。

  9. 清理和整理

    • 删除不再需要的旧组件或版本 , 并清理集群中的遗留数据 , 以确保整个集群处于干净的状态。

以上是一个大致的升级流程 , 确保在升级前详细阅读并遵循 Kubernetes 官方文档中指定的步骤。每个版本的升级可能有所不同 , 因此请务必参考相应版本的升级指南。

1.4 从故障状态恢复

如果 kubeadm upgrade 失败并且没有回滚 , 例如由于执行期间节点意外关闭 , 你可以再次运行 kubeadm upgrade。 此命令是幂等的 , 并最终确保实际状态是你声明的期望状态。

要从故障状态恢复 , 你还可以运行 sudo kubeadm upgrade apply --force 而无需更改集群正在运行的版本。

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

  • kubeadm-backup-etcd-<date>-<time>

  • kubeadm-backup-manifests-<date>-<time>

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

kubeadm-backup-manifests 包含当前控制面节点的静态 Pod 清单文件的备份版本。 如果升级失败并且无法自动回滚 , 则此文件夹中的内容可以复制到 /etc/kubernetes/manifests 目录实现手工恢复。 如果由于某些原因 , 在升级前后某个组件的清单未发生变化 , 则 kubeadm 也不会为之生成备份版本。

1.5 工作原理

kubeadm upgrade apply 做了以下工作:

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

    • API 服务器是可访问的

    • 所有节点处于 Ready 状态

    • 控制面是健康的

  • 强制执行版本偏差策略。

  • 确保控制面的镜像是可用的或可拉取到服务器上。

  • 如果组件配置要求版本升级 , 则生成替代配置与/或使用用户提供的覆盖版本配置。

  • 升级控制面组件或回滚(如果其中任何一个组件无法启动)。

  • 应用新的 CoreDNS 和 kube-proxy 清单 , 并强制创建所有必需的 RBAC 规则。

  • 如果旧文件在 180 天后过期 , 将创建 API 服务器的新证书和密钥文件并备份旧文件。

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

  • 从集群中获取 kubeadm ClusterConfiguration。

  • (可选操作)备份 kube-apiserver 证书。

  • 升级控制平面组件的静态 Pod 清单。

  • 为本节点升级 kubelet 配置

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

  • 从集群取回 kubeadm ClusterConfiguration。

  • 为本节点升级 kubelet 配置。

2 小版本升级集群

升级k8s 集群必须 先升级kubeadm 版本到目的k8s版本 , 也就是说kubeadm 是k8s 升级 的 ”准升证”。

2.4.1 升级Master节点

在 k8s 的所有 master 进行升级 , 将管理端服务 kube-controller-manager、kube-apiserver、 kube-scheduler、kube-proxy 。

2.4.1.1 第一个主节点升级

  • 验证当前k8s前版本

    root@kubeadm-master1:~# kubeadm version
    kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.3", GitCommit:"6813625b7cd706db5bc7388921be03071e1a492d", GitTreeState:"clean", BuildDate:"2024-03-15T00:06:16Z", GoVersion:"go1.21.8", Compiler:"gc", Platform:"linux/amd64"}
  • 各 master 安装指定新版本kubeadm

    root@kubeadm-master1:~# apt-cache madison kubeadm
       kubeadm | 1.29.4-2.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb  Packages
       kubeadm | 1.29.3-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb  Packages
       kubeadm | 1.29.2-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb  Packages
       kubeadm | 1.29.1-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb  Packages
       kubeadm | 1.29.0-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb  Packages
    root@kubeadm-master1:~# apt-get install kubeadm=1.29.4-2.1
    ​
    root@kubeadm-master1:~# kubeadm version
    kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.4", GitCommit:"55019c83b0fd51ef4ced8c29eec2c4847f896e74", GitTreeState:"clean", BuildDate:"2024-04-16T15:05:51Z", GoVersion:"go1.21.9", Compiler:"gc", Platform:"linux/amd64"}
    ​

  • 升级命令使用帮助手册

    root@kubeadm-master1:~# kubeadm upgrade --help
    Upgrade your cluster smoothly to a newer version with this command
    ​
    Usage:
      kubeadm upgrade [flags]
      kubeadm upgrade [command]
    ​
    Available Commands:
      apply       将您的Kubernetes集群升级到指定的版本
      diff        显示将应用于现有静态pod清单的差异。同样可以使用kubeadm upgrade apply --dry-run实现同样效果
      node        集群中节点的升级命令
      plan        检查可升级到的版本 , 并验证当前群集是否可升级。要跳过internet检查 , 请输入可选的[version]参数
  • 显示升级计划

    root@kubeadm-master1:~# kubeadm upgrade plan
    [upgrade/config] Making sure the configuration is correct:
    [upgrade/config] Reading configuration from the cluster...
    [upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
    [preflight] Running pre-flight checks.
    [upgrade] Running cluster health checks
    [upgrade] Fetching available versions to upgrade to
    [upgrade/versions] Cluster version: v1.29.3
    [upgrade/versions] kubeadm version: v1.29.4
    I0504 13:02:33.926567  766291 version.go:256] remote version is much newer: v1.30.0; falling back to: stable-1.29
    [upgrade/versions] Target version: v1.29.4
    [upgrade/versions] Latest version in the v1.29 series: v1.29.4
    ​
    Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
    COMPONENT   CURRENT       TARGET
    kubelet     6 x v1.29.3   v1.29.4
    ​
    Upgrade to the latest version in the v1.29 series:
    ​
    COMPONENT                 CURRENT    TARGET
    kube-apiserver            v1.29.3    v1.29.4
    kube-controller-manager   v1.29.3    v1.29.4
    kube-scheduler            v1.29.3    v1.29.4
    kube-proxy                v1.29.3    v1.29.4
    CoreDNS                   v1.11.1    v1.11.1
    etcd                      3.5.12-0   3.5.12-0
    ​
    You can now apply the upgrade by executing the following command:
    ​
        kubeadm upgrade apply v1.29.4
    ​
    _____________________________________________________________________
    ​
    ​
    The table below shows the current state of component configs as understood by this version of kubeadm.
    Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
    resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
    upgrade to is denoted in the "PREFERRED VERSION" column.
    ​
    API GROUP                 CURRENT VERSION   PREFERRED VERSION   MANUAL UPGRADE REQUIRED
    kubeproxy.config.k8s.io   v1alpha1          v1alpha1            no
    kubelet.config.k8s.io     v1beta1           v1beta1             no
    _____________________________________________________________________
    ​
    ​
  • 开始升级。升级时使用升级计划中的命令kubeadm upgrade apply v1.29.4

    root@kubeadm-master1:~# kubeadm upgrade apply v1.29.4
    image-20240504212232080
    image-20240504212344334

  • 验证镜像

    image-20240504212732687
  • 排空节点

    #停止调度,影响最小 , 只会将node调为SchedulingDisabled 之后再发创建pod , 不会被调度到该节点旧有的pod不会受到影响 , 仍正常对外提供服务
    root@kubeadm-master1:~# kubectl cordon kubeadm-master1.cbear.top
    node/kubeadm-master1.cbear.top cordoned
    ​
    #驱逐节点, 首先 , 驱逐node上的pod , 其他节点重新创建接着 , 将节点调为 SchedulingDisabled 
    root@kubeadm-master1:~# kubectl drain kubeadm-master1.cbear.top
    node/kubeadm-master1.cbear.top already cordoned
    error: unable to drain node "kubeadm-master1.cbear.top" due to error:cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl, continuing command...
    There are pending nodes to be drained:
     kubeadm-master1.cbear.top
    cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl
    #在尝试对 Kubernetes 节点进行 drain 操作时 , 如果节点上存在由 DaemonSet 控制的 Pods , 比如 kube-flannel 或 kube-proxy , Kubernetes 将不允许你排出(drain)这些 Pods , 因为这会干扰集群的正常运行。kube-proxy 是 Kubernetes 网络的核心组件 , 而 kube-flannel 通常用作覆盖网络。
    错误信息表明 , 当你尝试排出节点 kubeadm-master1.cbear.top 时 , 系统无法删除由 DaemonSet 管理的 Pods。如果你确实需要排出这个节点 , 你可以使用 --ignore-daemonsets 标志来强制执行排出操作 , 但这通常不推荐 , 因为它可能导致网络问题或覆盖网络中断。
    ​
    root@kubeadm-master1:~# kubectl drain kubeadm-master1.cbear.top --ignore-daemonsets
    node/kubeadm-master1.cbear.top already cordoned
    Warning: ignoring DaemonSet-managed Pods: kube-flannel/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl
    node/kubeadm-master1.cbear.top drained
    ​

  • 升级kubectl和kubelet

    root@kubeadm-master1:~# apt install kubectl=1.29.4-2.1 kubelet=1.29.4-2.1
  • 重启kubelet服务

    root@kubeadm-master1:~# systemctl daemon-reload 
    root@kubeadm-master1:~# systemctl restart kubelet
    ​
  • 取消调度保护

    root@kubeadm-master1:~# kubectl uncordon kubeadm-master1.cbear.top
    node/kubeadm-master1.cbear.top uncordoned

  • 检查kubectl版本

    root@kubeadm-master1:~# kubectl get node
    NAME                        STATUS   ROLES           AGE   VERSION
    kubeadm-master1.cbear.top   Ready    control-plane   25h   v1.29.4
    kubeadm-master2.cbear.top   Ready    control-plane   24h   v1.29.3
    kubeadm-master3.cbear.top   Ready    control-plane   24h   v1.29.3
    node01.cbear.top            Ready    <none>          24h   v1.29.3
    node02.cbear.top            Ready    <none>          24h   v1.29.3
    node03.cbear.top            Ready    <none>          24h   v1.29.3

    这里第一个主节点已经升级完成

2.4.1.2 其余主节点升级

  • 其他主节点安装对应软件包

    root@kubeadm-master2:~#  apt-get install kubeadm=1.29.4-2.1
    root@kubeadm-master3:~#  apt-get install kubeadm=1.29.4-2.1
  • 调整其他两个主节点kubeadm配置, 这个命令会下载并安装最新的 Kubernetes 静态 Pod 镜像 , 并更新节点的配置。

    root@kubeadm-master2:~# kubeadm upgrade node
    root@kubeadm-master3:~# kubeadm upgrade node

    kubeadm upgrade node 是一个用于升级 Kubernetes 集群中单个节点的命令。这个命令会更新集群中的 kubelet 和 kubeadm 版本 , 以及节点的配置。从 Kubernetes v1.23 开始 , kubeadm upgrade node 不再接受 --kubelet-version 参数 , 因为 kubelet 现在会自动升级到与 kubeadm 兼容的版本。这里不是使用sudo kubeadm upgrade apply命令。此外 , 不需要执行 kubeadm upgrade plan 和更新 CNI 驱动插件的操作。

  • 两个主节点中开启调度保护

    root@kubeadm-master2:~# kubectl cordon kubeadm-master2.cbear.top
    node/kubeadm-master2.cbear.top cordoned
    root@kubeadm-master3:~# kubectl cordon kubeadm-master3.cbear.top
    node/kubeadm-master3.cbear.top cordoned 
    
    
    root@kubeadm-master2:~# kubectl drain kubeadm-master2.cbear.top --ignore-daemonsets
    node/kubeadm-master2.cbear.top already cordoned
    Warning: ignoring DaemonSet-managed Pods: kube-flanne/kube-flannel1-ds-t624w, kube-system/kube-proxy-zpbxl
    node/kubeadm-master2.cbear.top drained
    root@kubeadm-master3:~# kubectl drain kubeadm-master3.cbear.top --ignore-daemonsets
    node/kubeadm-master3.cbear.top already cordoned
    Warning: ignoring DaemonSet-managed Pods: kube-flanne/kube-flannel-ds-t624w, kube-system/kube-proxy-zpbxl
    node/kubeadm-master2.cbear.top drained
  • 两个主节点中下载对应软件包

    root@kubeadm-master2:~# apt install kubectl=1.29.4-2.1 kubelet=1.29.4-2.1
    root@kubeadm-master3:~# apt install kubectl=1.29.4-2.1 kubelet=1.29.4-2.1
  • 重启kubelet服务

    root@kubeadm-master2:~# systemctl daemon-reload 
    root@kubeadm-master2:~# systemctl restart kubelet
    
    root@kubeadm-master3:~# systemctl daemon-reload 
    root@kubeadm-master3:~# systemctl restart kubelet
  • 取消调度保护

    root@kubeadm-master2:~# kubectl uncordon kubeadm-master2.cbear.top
    node/kubeadm-master2.cbear.top uncordoned
    root@kubeadm-master3:~# kubectl uncordon kubeadm-master3.cbear.top
    node/kubeadm-master3.cbear.top uncordoned
  • 检查升级之后的版本信息

    root@kubeadm-master3:~# kubectl get node
    NAME                        STATUS   ROLES           AGE   VERSION
    kubeadm-master1.cbear.top   Ready    control-plane   25h   v1.29.4
    kubeadm-master2.cbear.top   Ready    control-plane   24h   v1.29.4
    kubeadm-master3.cbear.top   Ready    control-plane   24h   v1.29.4
    node01.cbear.top            Ready    <none>          24h   v1.29.3
    node02.cbear.top            Ready    <none>          24h   v1.29.3
    node03.cbear.top            Ready    <none>          24h   v1.29.3

2.4.2 升级 k8s work 节点

所有的work节点均可进行如下操作

  • 在work节点中下载kubeadm

    root@node01:~# apt-get install kubeadm=1.29.4-2.1
  • 升级work节点配置

    root@node01:~# kubeadm upgrade node
    [upgrade] Reading configuration from the cluster...
    [upgrade] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
    [preflight] Running pre-flight checks
    [preflight] Skipping prepull. Not a control plane node.
    [upgrade] Skipping phase. Not a control plane node.
    [upgrade] Backing up kubelet config file to /etc/kubernetes/tmp/kubeadm-kubelet-config2679114713/config.yaml
    [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    [upgrade] The configuration for this node was successfully updated!
    [upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.
  • 通过kubectl将节点置于维护模式。(需要在控制节点上操作 , 或者在工作机上操作)

    root@kubeadm-master1:~# kubectl drain  --ignore-daemonsets --delete-emptydir-data node01.cbear.top 
  • 下载对应的软件包

    root@no01:~#apt install  kubelet=1.29.4-2.1
  • 重启kubelet服务

    root@node01:~# systemctl daemon-reload
    root@node01:~# systemctl restart kubelet
  • 关闭维护模式

    root@kubeadm-master1:~# kubectl uncordon  node01.cbear.top  
    node/node01.cbear.top uncordoned
  • 验证整个集群状态

    root@kubeadm-master1:~# kubectl get node
    NAME                        STATUS   ROLES           AGE   VERSION
    kubeadm-master1.cbear.top   Ready    control-plane   27h   v1.29.4
    kubeadm-master2.cbear.top   Ready    control-plane   25h   v1.29.4
    kubeadm-master3.cbear.top   Ready    control-plane   25h   v1.29.4
    node01.cbear.top            Ready    <none>          25h   v1.29.4
    node02.cbear.top            Ready    <none>          25h   v1.29.4
    node03.cbear.top            Ready    <none>          25h   v1.29.4
    
    root@kubeadm-master1:~# kubeadm certs check-expiration
    [check-expiration] Reading configuration from the cluster...
    [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
    
    CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
    admin.conf                 May 04, 2025 16:58 UTC   364d            ca                      no      
    apiserver                  May 04, 2025 13:10 UTC   364d            ca                      no      
    apiserver-etcd-client      May 04, 2025 13:10 UTC   364d            etcd-ca                 no      
    apiserver-kubelet-client   May 04, 2025 13:10 UTC   364d            ca                      no      
    controller-manager.conf    May 04, 2025 13:11 UTC   364d            ca                      no      
    etcd-healthcheck-client    May 03, 2025 15:35 UTC   363d            etcd-ca                 no      
    etcd-peer                  May 03, 2025 15:35 UTC   363d            etcd-ca                 no      
    etcd-server                May 03, 2025 15:35 UTC   363d            etcd-ca                 no      
    front-proxy-client         May 04, 2025 13:10 UTC   364d            front-proxy-ca          no      
    scheduler.conf             May 04, 2025 13:11 UTC   364d            ca                      no      
    super-admin.conf           May 04, 2025 16:58 UTC   364d            ca                      no      
    
    CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
    ca                      May 01, 2034 15:35 UTC   9y              no      
    etcd-ca                 May 01, 2034 15:35 UTC   9y              no      
    front-proxy-ca          May 01, 2034 15:35 UTC   9y              no      

3. 大版本升级集群

Kubernetes的升级是非常容易的。之所以写升级到1.24版本 , 是因为从这个版本开始不再支持dockershim。尽管Kubernetes早就提醒不再支持dockershim , 但本着能用一天就不折腾的原则 , 依然到现在。

3.1 升级控制节点

普通的升级过程比较简单 , 只需要遵从以下步骤即可。

  1. 备份

    如果你的Kubernetes运行在虚拟机上 , 那可以通过快照等方式进行备份。

  2. 升级控制节点

    如果你有一个节点 , 那比较容易;如果有多个节点 , 则需要逐个升级。

    • 升级kubeadm

      yum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes
      kubeadm version
    • 查看升级计划

      kubeadm upgrade plan

      执行完的结果中会有一句:

      You can now apply the upgrade by exeting the following command:
      kubeadm upgrade apply v1.24.17
    • 执行升级

      kubeadm upgrade apply v1.24.17

      在执行的结果中如果有以下文字 , 则代表升级成功。

      [upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.24.17". Enjoy!
    • 升级kubelet

      systemctl stop kubelet
      yum -y install kubelet-1.24.17-0 --disableexcludes=kubernetes
      systemctl start kubelet
    • 升级CNI

      如果网络插件也需要升级 , 则在此步骤中根据所选网络插件的说明进行升级。

    • 切换dockershim到containerd

      先将节点排除。在以下命令中 , 假设当前操作的机器节点名称为CTRLNODE1。

      kubectl drain CTRLNODE1 --ignore-daemonsets --delete-emptydir-data
      yum install -y kubectl-1.24.17-0 kubernetes=cni-1.1.1.0 --disableexcludes=kubernetes
    • 移除dockershim。

      systemctl disable docker --now
      yum -y remove docker-ce docker-ce-cli

      安装containerd

      yum -y install containerd
      mkdir -p /etc/containerd
      containerd config default | tee /etc/containerd/config.toml
      systemctl enable --now containerd

      配置kubelet使用containerd。

      sed -i 's/--network-plugin=cni/--container-runtime=remote\ --container-runtime-endpoint=unix\:\/\/\/run\/containerd\/containerd.sock/g' /var/lib/kubelet/kubeadm-flags.env

      修改配置。

      kubectl edit no CTRLNODE1

      在编辑器中 , 将kubeadm.alpha.kubernetes.io/cri-socket的值由/var/run/dockershim.sock修改为unix:///run/containerd/containerd.sock。

      重启kubelet使配置生效。

      systemctl daemon-reload 
      systemctl restart kubelet

      将节点恢复健康状态。

      kubectl uncordon CTRLNODE1

      如此反复将所有控制节点升级完毕。

3.2 升级工作节点

升级工作节点也需要逐个升级。

  1. 升级kubeadm

    yum install -y kubeadm-1.24.17-0 --disableexcludes=kubernetes
    kubeadm upgrade node
  2. 通过kubectl将节点置于维护模式。(需要在控制节点上操作 , 或者在工作机上操作)

    export WORKERNODE=WORKNODE1
    kubectl drain ${WORKERNODE} --ignore-daemonsets --delete-emptydir-data
  3. 升级kubelet

    yum -y install kubelet-1.24.17.0 --disableexcludes=kubernetes
  4. 移除dockershim , 安装containerd

    systemctl stop kubelet
    systemctl disable docker --now
    yum -y remove docker-ce docker-ce-cli
    yum -y install containerd
    mkdir -p /etc/containerd
    containerd config default | tee /etc/containerd/config.toml
    systemctl enable containerd --now
  5. 修改配置

    替换配置项。

    sed -i 's/--network-plugin=cni/--container-runtime=remote\ --container-runtime-endpoint=unix\:\/\/\/run\/containerd\/containerd.sock/g' /var/lib/kubelet/kubeadm-flags.env

    修改配置。

    kubectl edit no ${WORKER_NODE}

    在编辑器中 , 将kubeadm.alpha.kubernetes.io/cri-socket的值由/var/run/dockershim.sock修改为unix:///run/containerd/containerd.sock。

  6. 重启kubelet

    systemctl daemon-reload
    systemctl restart kubelet
  7. 将节点恢复健康状态

    kubectl uncordon ${WORKER_NODE}

反复执行以上步骤将其他工作节点升级。

3.3 查看状态

全部升级完毕后 , 需要检查集群节点状态。

kubectl get node

若全部节点显示Ready状态 , 则代表升级完成。

3.4 检查所有应用

升级完毕后 , 还需检查所有应用和服务是否正常。对于普通应用基本无影响 , 但是对于CI/CD中需要构造Docker镜像的场景 , 则需要修改CI/CD过程以兼容containerd。


参考链接

图解 Kubernetes 集群升级步骤 , 轻松实现无痛迁移 (qq.com)

Kubernetes集群升级(kubeadm版) - Layzer - 博客园 (cnblogs.com)

如何将Kubernetes从1.23升级到1.24? (qq.com)