在 VMware vSphere 上升级集群

本文档说明在平台侧发行版升级完成后,如何在 VMware vSphere 上升级 Kubernetes 集群。文档中的流程重点介绍如何通过 Cluster API 资源更新控制平面和工作节点。

INFO

本页在完整 ACP 升级流程中的位置

本页仅涵盖升级中的 Kubernetes 步骤。完整的 ACP 升级流程——包括升级工件同步、通过 CVO 升级 ACP Core、Aligned 插件升级,以及从 Marketplace 升级 Agnostic 插件——已记录在 ACP 产品文档中。在开始本页的 Kubernetes 步骤之前,请先完成这些步骤:

当同一个集群运行在不可变操作系统上时,请使用本页,因为不可变 OS 上的 Kubernetes 步骤会通过新的 VM 模板替换节点,而不是就地升级二进制文件。

升级顺序

按以下顺序升级 VMware vSphere 集群:

  1. (前提条件) 先在管理集群上升级 ACP 平台。这会将 cluster-api-provider-vsphere 控制器及相关 CAPI 组件升级到可识别新 schema 的版本。只有在管理端控制器完成滚动更新并变为 Ready 后,才触发业务集群升级。
  2. 完成 升级集群 中描述的发行版版本升级。
  3. 验证控制平面健康且当前集群稳定。
  4. 升级控制平面的 Kubernetes 版本。
  5. 将工作节点升级到目标 Kubernetes 版本。

前提条件

开始之前,请确保满足以下条件:

  • 发行版版本升级已完成。
  • 控制平面健康且可访问。
  • 所有节点都处于 Ready 状态。
  • 目标 VM 模板已存在于 vSphere 环境中,且名称与 OS Support Matrix 行中的 Alauda OS Image Version 值相同。如果在应用新的 VSphereMachineTemplate 时模板不存在,升级将失败。
  • 对于跨越多个 Kubernetes 次版本的跨版本升级,已提前预置中间版本的 Core 镜像和 VM 模板。参见 跨版本升级准备
  • 目标 Kubernetes 版本与您的工作负载和插件兼容。
  • machine config pools 有足够容量以支持滚动更新。
  • 检查 Kubernetes 升级路径和版本偏移策略。
WARNING

磁盘保留模型

升级依赖 Cluster API 的滚动替换机制。每个集群有四类磁盘;只有由池管理的磁盘类会在删除后重新创建时保留。

磁盘类别声明位置升级时是否保留用途
系统磁盘(root volume)用于 spec.template.spec.template 的 VM 模板❌ 从不保留OS + kubelet/kubeadm/containerd。每次替换都会基于新模板重新构建。
模板本地磁盘VSphereMachineTemplate.spec.template.spec.*(模板中声明的附加磁盘)❌ 从不保留临时缓存。会随旧 VM 一起销毁。
池管理的持久磁盘VSphereMachineConfigPool.spec.slot[].persistentDisks✅ 从旧 VM 分离,并在新 VM 的相同 slot 上重新挂载平台状态,例如 /var/cpaas
外部 CSI 卷(vSphere CSI 等)工作负载 PVC / CSI driver✅ 与节点生命周期无关应用数据。

“保留”表示会重新挂载相同的磁盘标识——并不表示磁盘内容被时间回溯。升级窗口中写入池管理磁盘的任何数据,在升级完成后以及回滚后都会保留。

WARNING

模板不能原地修改

VSphereMachineTemplate.spec.template.spec 是不可变的。vSphere admission webhook 会拒绝任何更新,并返回消息 "VSphereMachineTemplate spec.template.spec field is immutable. Please create a new resource instead." 因此,本页中的每个升级步骤都会创建一个带新 metadata.nameVSphereMachineTemplate,应用该资源,然后将控制资源的 infrastructureRef.name patch 到新模板。请保留旧模板,直到新滚动更新健康为止,以便在需要时回滚。

INFO

Fleet Essentials UI 不支持 ACP 4.3 集群升级

vSphere 集群当前不提供 Fleet Essentials UI 升级路径。请使用下文记录的 YAML 操作步骤,或者使用 ACP Core 平台内置的两步升级流程——参见 为业务集群请求升级

来自 OS Support Matrix 的必需值

ACP 版本、对应 VM 模板、Kubernetes 版本、匹配的 CoreDNS、etcd 和 Kube-OVN 版本之间的权威映射位于 OS Support Matrix 中。在开始之前,请先找到与目标 ACP 版本对应的行;该行提供下文步骤所需的所有值。

从该行读取的单元格与升级清单的映射关系如下:

OS Support Matrix 列用于设置落点
Alauda OS Image VersionVSphereMachineTemplate.spec.template.spec.template(目标 VM 模板名称)控制平面和工作节点的 VSphereMachineTemplate
Kubernetes VersionKubeadmControlPlane.spec.versionMachineDeployment.spec.template.spec.version控制平面和工作节点
corednsKubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag仅控制平面
etcdKubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag仅控制平面
kube-ovn (chart)Cluster.metadata.annotations["cpaas.io/kube-ovn-version"]集群级别;vSphere provider 会根据此注解协调 Kube-OVN AppRelease。这是 acp/chart-cpaas-kube-ovn chart 版本(例如 v4.3.3),而不是 Kube-OVN 组件版本。

CoreDNS 和 etcd 的镜像标签仅适用于控制平面,因为 clusterConfigurationKubeadmControlPlane 字段。工作节点会从新的 VM 模板继承容器镜像版本;MachineDeployment 不携带自己的 dns/etcd 标签。Kube-OVN 注解位于 Cluster 资源上,而不是 KubeadmControlPlane 上,因为 vSphere provider 会独立于 Kubernetes 控制平面滚动更新来观察它。

操作步骤

创建目标 machine templates

在开始滚动升级之前,先为控制平面和工作节点创建新的 VSphereMachineTemplate 资源。

  1. 导出现有的控制平面模板

    kubectl get vspheremachinetemplate <cluster_name>-control-plane -n <namespace> -o yaml > new-cp-template.yaml
  2. 修改控制平面模板

    编辑 new-cp-template.yaml

    • metadata.name 设置为一个新的唯一名称(例如 <cluster_name>-control-plane-v2
    • spec.template.spec.template 更新为目标 VM 模板名称
    • 如有需要,更新 CPU、内存或磁盘设置
    • 删除由服务器生成的字段:metadata.resourceVersionmetadata.uidmetadata.generationmetadata.creationTimestampmetadata.managedFieldsmetadata.annotations["kubectl.kubernetes.io/last-applied-configuration"]status
    • 保持 spec.template.spec.providerID 为空。vSphere provider 会在 VM 创建后将 providerID 设置为该 VM 的 BIOS UUID;如果在模板中预先填充该字段,会破坏控制器的身份绑定。
  3. 导出并修改工作节点模板

    kubectl get vspheremachinetemplate <cluster_name>-worker -n <namespace> -o yaml > new-worker-template.yaml

    编辑 new-worker-template.yaml

    • metadata.name 设置为一个新的唯一名称(例如 <cluster_name>-worker-v2
    • spec.template.spec.template 更新为目标 VM 模板名称
    • 如有需要,更新 CPU、内存或磁盘设置
    • 删除上面列出的相同服务器生成字段
  4. 应用这两个新模板

    kubectl apply -f new-cp-template.yaml
    kubectl apply -f new-worker-template.yaml

升级控制平面

开始之前,请按照 来自 OS Support Matrix 的必需值 的说明,从目标 ACP 行中收集所有必需值。

  1. 使用目标 Kubernetes 值 patch KubeadmControlPlane

    在一次编辑中更新 KubeadmControlPlane 资源,以保持 spec.version、CoreDNS 镜像标签、etcd 镜像标签以及基础设施模板引用与同一个 VM 模板一致:

    • spec.version ← OS Support Matrix 行中的 Kubernetes Version

    • spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag ← 同一行中的 coredns

    • spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag ← 同一行中的 etcd

    • spec.machineTemplate.infrastructureRef.name ← 上面创建的新 VSphereMachineTemplate 名称

      kubectl edit kubeadmcontrolplane <cluster_name> -n <namespace>

    仅更新 spec.version 并不够。CoreDNS 和 etcd 的镜像标签必须与 Kubernetes 版本一起移动,因为它们是基于同一发行版构建的;如果保留旧值,可能会导致 CoreDNS 和 etcd Pod 与新的 Kubernetes 次版本不匹配。

  2. 更新 Cluster 资源上的 Kube-OVN 版本注解

    如果 OS Support Matrix 中目标 ACP 行显示的 kube-ovn (chart) 值与当前集群不同,请 patch Cluster 资源上的注解,以便 vSphere provider 协调新的 Kube-OVN AppRelease。

    INFO

    前提条件 — Kube-OVN 协调门控注解(仅适用于 vSphere)

    在 vSphere 上,provider 只有在 Cluster 资源带有注解 cpaas.io/network-type: kube-ovn 时,才会协调 Kube-OVN AppRelease。该注解通常在集群创建时设置。如果缺少该注解,下面的步骤虽然会成功写入版本注解,但不会协调 Kube-OVN AppRelease。继续之前请先验证:

    kubectl get cluster <cluster_name> -n <namespace> \
      -o jsonpath='{.metadata.annotations.cpaas\.io/network-type}{"\n"}'
    # Expected output: kube-ovn

    这个前置条件是 vSphere 特有的。DCS 和 Huawei Cloud Stack provider 则改用 DCSCluster / HCSClusterspec.networkType 字段,因此不需要该注解。

    kubectl annotate cluster <cluster_name> -n <namespace> \
      cpaas.io/kube-ovn-version=<kube-ovn-version-from-matrix> --overwrite

    Kube-OVN 是一个 Core 生命周期组件,但在不可变 OS 上,vSphere provider 会根据这个注解驱动其交付;当 spec.version 变化时,该注解不会自动更新。

    vSphere provider 会在业务集群的 cpaas-system 命名空间中协调一个名为 cni-kube-ovn 的 Kube-OVN AppRelease。请在业务集群上执行以下命令(而不是 bootstrap KIND 或 global 集群)来跟踪协调过程:

    # Overall AppRelease state — Sync and Health columns must reach a Success-equivalent reason
    kubectl get apprelease cni-kube-ovn -n cpaas-system
    
    # Installed revision and chart phase
    kubectl get apprelease cni-kube-ovn -n cpaas-system \
      -o jsonpath='Installed: {.status.charts.*.installedRevision}{"\n"}Phase: {.status.charts.*.phase}{"\n"}'

    正常顺序是 Upgrading → HealthChecking → Success。在小型集群上,完整转换通常会在大约一分钟内完成。各阶段含义如下:

    阶段含义installedRevision
    UpgradingHelm release 升级进行中。Sync 条件为 Unknown(Syncing)仍然是上一版本
    HealthCheckingHelm release 已应用;控制器正在验证 Kube-OVN Pod。Sync 条件为 True(Synced)已经是目标版本
    Success所有三个条件(ValidateSyncHealth)均为 True目标版本
    WARNING

    不要仅凭 installedRevision 就宣布升级完成。该字段会在 HealthChecking 阶段切换到目标值,此时 Pod 还没有完成 Ready 验证。只有当 phaseSuccess installedRevision 与目标值一致时,才认为 chart 已升级完成。

    AppRelease API 还定义了 DownloadingInstallingSyncingDownloadFailedDeployFailedNotReady。前三者是临时状态,升级应会自行收敛。后三者表示发生故障,需要人工排查;请先执行 kubectl describe apprelease cni-kube-ovn -n cpaas-system 以查看每个条件的 message 字段。

  3. 监控控制平面滚动更新

    kubectl -n <namespace> get kubeadmcontrolplane <cluster_name> -w
    kubectl -n <namespace> get machine -l cluster.x-k8s.io/control-plane

升级工作节点

控制平面升级完成后,更新 MachineDeployment 以引用新的工作节点模板和目标 Kubernetes 版本。

常见变更包括:

  • spec.template.spec.version — 目标 Kubernetes 版本
  • spec.template.spec.infrastructureRef.name — 新的 VSphereMachineTemplate 名称
  • spec.template.spec.bootstrap.configRef.name — 如果引导设置需要变更,则更新为新的 KubeadmConfigTemplate 名称(参见 更新 Bootstrap 模板

应用这些更改:

kubectl patch machinedeployment <cluster_name>-md-0 -n <namespace> \
  --type='merge' -p='{
    "spec": {
      "template": {
        "spec": {
          "version": "<target_kubernetes_version>",
          "infrastructureRef": {
            "name": "<new-worker-template-name>"
          }
        }
      }
    }
  }'

监控工作节点滚动更新:

kubectl -n <namespace> get machinedeployment <cluster_name>-md-0 -w
kubectl -n <namespace> get machine
kubectl --kubeconfig=/tmp/<cluster_name>.kubeconfig get nodes -o wide

回滚失败的升级

如果滚动更新失败——例如新 VM 无法启动、节点未能变为 Ready,或者新的 Kubernetes 次版本暴露出兼容性问题——请将模板引用和 Kubernetes 版本字段恢复到之前的值。Cluster API 会将这次恢复视为新的 spec 漂移,并逐个将 v2 machine 回滚到之前的模板。

回滚前需要牢记三点:

  • 旧 VM 已经不存在。 它们在升级过程中已被销毁。回滚会使用旧模板构建一组新的替换 machine;不会恢复原来的 VM。
  • 旧的 VSphereMachineTemplate 资源必须仍然存在。 在新滚动更新健康之前,不要删除旧模板。如果您已经删除它,请先从版本控制或备份中恢复,再执行回滚。
  • 池管理的磁盘标识会保留,但数据状态不会。VSphereMachineConfigPool.spec.slot[].persistentDisks 中声明的磁盘会重新挂载到回滚后的 machine 的相同 slot 上,但升级窗口中写入这些磁盘的数据(例如新的 Kubernetes 次版本格式中的 etcd 条目)会保留。如果新格式无法被旧的 Kubernetes 次版本读取,回滚仍可能失败,并需要手动恢复 etcd。

操作步骤:

  • 控制平面:patch KubeadmControlPlane,恢复之前的 spec.machineTemplate.infrastructureRef.namespec.versionspec.kubeadmConfigSpec.clusterConfiguration.dns.imageTagspec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag

  • 工作节点:patch 每个 MachineDeployment,恢复之前的 spec.template.spec.infrastructureRef.namespec.template.spec.version

  • Kube-OVN:如果 kube-ovn 注解已更改,请恢复 Cluster 资源上的旧值:

    kubectl annotate cluster <cluster_name> -n <namespace> \
      cpaas.io/kube-ovn-version=<previous-kube-ovn-version> --overwrite

如果新的控制平面从未达到 etcd quorum,KubeadmControlPlane 控制器可能会拒绝回滚任何 machine,因为其预检检查会被不健康的 etcd 阻塞。请先恢复 etcd quorum(需要 operator 干预),然后再重试回滚。

验证

升级完成后,请确认以下结果:

  • KubeadmControlPlane 达到目标版本和期望副本数。
  • MachineDeployment 达到目标版本和期望副本数。
  • 控制平面和工作节点恢复到 Ready 状态。
  • 业务集群中的 vSphere CPI DaemonSet 保持可用。

后续步骤

Kubernetes 升级完成后,请继续执行 在 VMware vSphere 上管理节点 中的常规节点操作。