升级 global 集群

本文介绍如何升级运行在 Immutable Infrastructure 上的 global 集群。升级操作会使用 Cluster API provider 管理的新 Alauda OS 镜像替换节点;不采用节点原地升级。

对于 Huawei DCS global 集群,请在选择目标 DCS Provider 软件包和 Alauda OS 镜像之前,查看 Alauda OS 和 Provider 兼容性

何时使用此路径

在以下情况下选择此升级路径:

  • global 集群最初安装在 Immutable Infrastructure 上。请参阅安装 global 集群
  • 您的基础设施属于以下已记录的 provider 之一:Huawei DCS、VMware vSphere、Huawei Cloud Stack,或在所安装的版本中包含 provider v1.0.0 或更高版本的 Bare Metal。

对于传统 OS global 集群,请改用 标准升级路径

两阶段升级概览

与业务集群一样,Immutable Infrastructure 上的 global 集群遵循两阶段升级流程。

  1. 阶段 1 — ACP Core 和 Distribution Version:准备构件和插件软件包,然后使用 CVO 将 global 层移动到目标 Distribution Version。此操作步骤由 ACP 产品文档负责;请参阅 升级前准备升级 global 集群
  2. 阶段 2 — Kubernetes 和 OS 镜像:使用包含目标 Kubernetes 版本的新 Alauda OS 镜像替换节点。本文重点介绍 global 集群的阶段 2。
阶段 1 兼容性

在开始阶段 2 之前,请验证每个业务集群都处于目标 Distribution Version 的兼容版本矩阵范围内。超出范围的业务集群必须先进行升级。

通用前提条件

  • global 集群已完成阶段 1(Distribution Version 升级)。
  • 已对 global 集群执行并验证 etcd 备份。
  • OS Support Matrix 中的目标行可用,并且其中的 Kubernetes 版本、CoreDNS 标签、etcd 标签和 Kube-OVN chart 已完成暂存,同时已暂存该版本发布的 Alauda OS 镜像。
  • 保留之前的 machine 模板和 bootstrap 模板,直到阶段 2 验证完成。
  • 制定包含控制平面滚动替换的维护窗口计划。
  • 对于跨越多个 Kubernetes minor 版本的跨版本升级,预先暂存中间版本的 Core 镜像和 OS 镜像。请参阅跨版本升级准备

操作步骤

安装后,管理 global 集群的 Cluster API 控制器将在 global 集群自身上运行。在本操作步骤中,使用 global kubeconfig 执行 kubectl 命令。

目标为 Kubernetes 1.35 时的必需操作

在 Kubernetes 1.35 中,kubelet 凭证验证可能会应用于节点上已存在的镜像。在升级到 Kubernetes 1.35 或更高版本的过程中,将 imagePullCredentialsVerificationPolicy: NeverVerify 添加到每个替换节点使用的 kubelet patch 中。在与 spec.version 相同的 KubeadmControlPlane 编辑中更新控制平面文件。对于 worker,使用更新后的 patch 创建新的 KubeadmConfigTemplate,并在与版本相同的编辑中切换 MachineDeployment.spec.template.spec.bootstrap.configRef.name。Kubernetes 1.34 或更早版本无需添加此参数。请参阅Kubernetes 1.35 所需的 kubelet patch

步骤 1 — 升级 Kube-OVN

从目标 OS Support Matrix 行中读取 kube-ovn (chart) 值,然后按照通用的特定 provider 版本的 Kube-OVN 操作步骤执行,并将 <cluster-name> 设置为 global

该操作步骤首先检查已安装的 provider 修订版本,然后选择受支持的新流程或旧流程,处理 v4.4 处的 Kube-OVN chart 名称边界,并验证 chart 名称、目标修订版本、已安装修订版本、阶段和条件。对于 provider 和 cni-kube-ovn AppRelease 检查,均使用 global kubeconfig。在所有通用验证标准通过之前,请勿开始控制平面替换。

步骤 2 — 更新 global 集群清单

更新 global 集群的 Cluster API 清单,使其引用新的 Alauda OS 镜像和 Kubernetes 版本。需要更新的清单字段因 provider 而异。

Huawei DCS
VMware vSphere
Huawei Cloud Stack
Bare Metal

对于 DCS,请创建新的 Immutable Infrastructure 模板,而不要编辑正在运行的机器已引用的模板。

更新控制平面资源:

  • 为目标镜像创建新的 DCSMachineTemplate,并将 spec.template.spec.vmTemplateName 设置为与目标 Kubernetes 版本匹配的 Alauda OS 模板。
  • 将保留的节点本地数据(包括 /var/cpaas)保留在 DCSIpHostnamePool.spec.pool[].persistentDisk 中。不要将保留的磁盘移回 DCSMachineTemplate
  • KubeadmControlPlane.spec.version 设置为目标 Kubernetes 版本。
  • 从同一 OS Support Matrix 行中设置 KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration 中的 CoreDNS 和 etcd 镜像标签。
  • 当目标为 Kubernetes 1.35 或更高版本时,在同一清单编辑中更新 KubeadmControlPlane.spec.kubeadmConfigSpec.files 中的控制平面 kubelet patch。
  • KubeadmControlPlane.spec.machineTemplate.infrastructureRef.name 指向新的 DCSMachineTemplate
  • 当集群使用池管理的持久磁盘时,保留 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0

更新 worker 节点资源:

  • 使用目标 vmTemplateName 创建新的 worker DCSMachineTemplate
  • 将每个 MachineDeployment.spec.template.spec.version 设置为目标 Kubernetes 版本。
  • 当目标为 Kubernetes 1.35 或更高版本时,使用所需的 kubelet patch 创建新的 worker KubeadmConfigTemplate,并将 MachineDeployment.spec.template.spec.bootstrap.configRef.name 指向它。
  • 将每个 MachineDeployment.spec.template.spec.infrastructureRef.name 指向新的 worker DCSMachineTemplate
  • 当 worker 池使用池管理的持久磁盘时,保留每个 MachineDeployment.spec.strategy.rollingUpdate.maxSurge: 0

池管理的持久磁盘声明在 IP 池上,而不是 machine 模板上:

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSIpHostnamePool
metadata:
  name: <global-pool-name>
  namespace: cpaas-system
spec:
  pool:
    - ip: <node-ip>
      hostname: <node-hostname>
      persistentDisk:
        - slot: 0
          quantityGB: 40
          datastoreName: <datastore-name>
          path: /var/cpaas
          format: xfs
          mountOptions:
            - defaults

仅当 DCS 环境要求显式的精简配置值时,才使用 isThin。如果省略,provider 不会发送 isThin,DCS 将使用平台默认值。新持久卷将创建为独立的持久普通卷。

使用 IP 池状态确认,在滚动替换期间,保留的磁盘已从旧 VM 分离并挂载到替换 VM。

步骤 3 — 应用更新后的清单

将更新后的清单应用到 global 集群。

kubectl --kubeconfig <global-kubeconfig> apply -f <updated-manifest>

Cluster API provider 开始使用新镜像替换控制平面和 worker 节点。当设置了 maxSurge: 0 时,每个旧节点都会先被排空并删除,然后其替换节点才能重新使用相同的固定身份、IP 地址或保留的磁盘。

步骤 4 — 监控滚动替换

监控滚动替换,直到所有控制平面和 worker 节点都已完成替换。

kubectl --kubeconfig <global-kubeconfig> get machines -A -o wide
kubectl --kubeconfig <global-kubeconfig> get kubeadmcontrolplane -A

当每个 Machine 报告新的 Kubernetes 版本和 Phase: Running,且 KubeadmControlPlane 针对新版本报告 Ready: True 时,升级即完成。

验证

滚动替换完成后,验证升级后的 global 集群是否健康。

kubectl --kubeconfig <global-kubeconfig> get nodes -o wide
kubectl --kubeconfig <global-kubeconfig> get clusterversionshadow -o yaml
kubectl --kubeconfig <global-kubeconfig> get pods -n cpaas-system

所有节点都必须报告新的 Kubernetes 版本,ClusterVersionShadow 必须反映目标 Distribution Version,核心平台 Pod 必须处于 Running 状态。

恢复注意事项

不要将 Kubernetes 次要版本降级视为普通回滚。应根据发布阶段选择恢复路径:

  1. 尚未创建目标版本控制平面的 Machine:恢复之前的 Kube-OVN 状态和之前的清单值。在引入新的控制平面数据格式之前取消目标版本发布。
  2. 仅更改了机器模板或 OS 镜像,Kubernetes 次要版本未发生变化:将控制资源指回之前的模板,并让 Cluster API 执行另一次替换发布。保持 Kubernetes 次要版本不变。
  3. 目标 Kubernetes 次要版本上的控制平面 Machine 已加入集群:不要将 Kubernetes、CoreDNS 或 etcd 修补回之前的次要版本。停止进一步发布,并在目标次要版本上向前修复;或者通过已验证的升级前 etcd 备份或 Global DR 操作恢复 global 集群。

如果已创建目标次要版本的控制平面 Machine,但它从未加入集群,请先恢复健康的 etcd 仲裁,并在更改清单之前确定是否可以安全地移除失败的替换节点。

Huawei DCS
VMware vSphere
Huawei Cloud Stack
Bare Metal

对于使用池管理持久磁盘的 DCS 集群,请在回滚前确认磁盘状态:

首先,在删除或重新创建机器之前检查 DCSIpHostnamePool.status.persistentDiskStatus。不要删除 DCSIpHostnamePool.spec.pool[].persistentDisk 中列出的保留 DCS 卷。

对于阶段 1,请使用阶段 1 恢复期间还原 Kube-OVN中的 DCS 规则;具体操作取决于已安装的 provider 版本。在同一次要版本替换恢复期间返回之前的机器模板时,请保留 maxSurge: 0。如果目标次要版本的控制平面机器已加入,请保留目标基线,并使用向前恢复或备份还原。

后续步骤

  • 将业务集群升级到相同的 Distribution Version:请参阅升级集群
  • 查看随新镜像发布的机器配置变更:请参阅机器配置