在 VMware vSphere 上升级集群
本文档说明在平台侧发行版升级完成后,如何在 VMware vSphere 上升级 Kubernetes 集群。文档中的流程重点介绍如何通过 Cluster API 资源更新控制平面和工作节点。
本页在完整 ACP 升级流程中的位置
本页仅涵盖升级中的 Kubernetes 步骤。完整的 ACP 升级流程——包括升级工件同步、通过 CVO 升级 ACP Core、Aligned 插件升级,以及从 Marketplace 升级 Agnostic 插件——已记录在 ACP 产品文档中。在开始本页的 Kubernetes 步骤之前,请先完成这些步骤:
当同一个集群运行在不可变操作系统上时,请使用本页,因为不可变 OS 上的 Kubernetes 步骤会通过新的 VM 模板替换节点,而不是就地升级二进制文件。
升级顺序
按以下顺序升级 VMware vSphere 集群:
- (前提条件) 先在管理集群上升级 ACP 平台。这会将
cluster-api-provider-vsphere控制器及相关 CAPI 组件升级到可识别新 schema 的版本。只有在管理端控制器完成滚动更新并变为 Ready 后,才触发业务集群升级。 - 完成 升级集群 中描述的发行版版本升级。
- 验证控制平面健康且当前集群稳定。
- 升级控制平面的 Kubernetes 版本。
- 将工作节点升级到目标 Kubernetes 版本。
前提条件
开始之前,请确保满足以下条件:
- 发行版版本升级已完成。
- 控制平面健康且可访问。
- 所有节点都处于
Ready状态。 - 目标 VM 模板已存在于 vSphere 环境中,且名称与 OS Support Matrix 行中的 Alauda OS Image Version 值相同。如果在应用新的
VSphereMachineTemplate时模板不存在,升级将失败。 - 对于跨越多个 Kubernetes 次版本的跨版本升级,已提前预置中间版本的 Core 镜像和 VM 模板。参见 跨版本升级准备。
- 目标 Kubernetes 版本与您的工作负载和插件兼容。
- machine config pools 有足够容量以支持滚动更新。
- 检查 Kubernetes 升级路径和版本偏移策略。
磁盘保留模型
升级依赖 Cluster API 的滚动替换机制。每个集群有四类磁盘;只有由池管理的磁盘类会在删除后重新创建时保留。
“保留”表示会重新挂载相同的磁盘标识——并不表示磁盘内容被时间回溯。升级窗口中写入池管理磁盘的任何数据,在升级完成后以及回滚后都会保留。
模板不能原地修改
VSphereMachineTemplate.spec.template.spec 是不可变的。vSphere admission webhook 会拒绝任何更新,并返回消息 "VSphereMachineTemplate spec.template.spec field is immutable. Please create a new resource instead." 因此,本页中的每个升级步骤都会创建一个带新 metadata.name 的 VSphereMachineTemplate,应用该资源,然后将控制资源的 infrastructureRef.name patch 到新模板。请保留旧模板,直到新滚动更新健康为止,以便在需要时回滚。
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 版本对应的行;该行提供下文步骤所需的所有值。
从该行读取的单元格与升级清单的映射关系如下:
CoreDNS 和 etcd 的镜像标签仅适用于控制平面,因为 clusterConfiguration 是 KubeadmControlPlane 字段。工作节点会从新的 VM 模板继承容器镜像版本;MachineDeployment 不携带自己的 dns/etcd 标签。Kube-OVN 注解位于 Cluster 资源上,而不是 KubeadmControlPlane 上,因为 vSphere provider 会独立于 Kubernetes 控制平面滚动更新来观察它。
操作步骤
创建目标 machine templates
在开始滚动升级之前,先为控制平面和工作节点创建新的 VSphereMachineTemplate 资源。
-
导出现有的控制平面模板
-
修改控制平面模板
编辑
new-cp-template.yaml:- 将
metadata.name设置为一个新的唯一名称(例如<cluster_name>-control-plane-v2) - 将
spec.template.spec.template更新为目标 VM 模板名称 - 如有需要,更新 CPU、内存或磁盘设置
- 删除由服务器生成的字段:
metadata.resourceVersion、metadata.uid、metadata.generation、metadata.creationTimestamp、metadata.managedFields、metadata.annotations["kubectl.kubernetes.io/last-applied-configuration"]和status - 保持
spec.template.spec.providerID为空。vSphere provider 会在 VM 创建后将providerID设置为该 VM 的 BIOS UUID;如果在模板中预先填充该字段,会破坏控制器的身份绑定。
- 将
-
导出并修改工作节点模板
编辑
new-worker-template.yaml:- 将
metadata.name设置为一个新的唯一名称(例如<cluster_name>-worker-v2) - 将
spec.template.spec.template更新为目标 VM 模板名称 - 如有需要,更新 CPU、内存或磁盘设置
- 删除上面列出的相同服务器生成字段
- 将
-
应用这两个新模板
升级控制平面
开始之前,请按照 来自 OS Support Matrix 的必需值 的说明,从目标 ACP 行中收集所有必需值。
-
使用目标 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名称
仅更新
spec.version并不够。CoreDNS 和 etcd 的镜像标签必须与 Kubernetes 版本一起移动,因为它们是基于同一发行版构建的;如果保留旧值,可能会导致 CoreDNS 和 etcd Pod 与新的 Kubernetes 次版本不匹配。 -
-
更新
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-OVNAppRelease。该注解通常在集群创建时设置。如果缺少该注解,下面的步骤虽然会成功写入版本注解,但不会协调 Kube-OVNAppRelease。继续之前请先验证:这个前置条件是 vSphere 特有的。DCS 和 Huawei Cloud Stack provider 则改用
DCSCluster/HCSCluster的spec.networkType字段,因此不需要该注解。Kube-OVN 是一个 Core 生命周期组件,但在不可变 OS 上,vSphere provider 会根据这个注解驱动其交付;当
spec.version变化时,该注解不会自动更新。vSphere provider 会在业务集群的
cpaas-system命名空间中协调一个名为cni-kube-ovn的 Kube-OVNAppRelease。请在业务集群上执行以下命令(而不是 bootstrap KIND 或global集群)来跟踪协调过程:正常顺序是
Upgrading → HealthChecking → Success。在小型集群上,完整转换通常会在大约一分钟内完成。各阶段含义如下:WARNING不要仅凭
installedRevision就宣布升级完成。该字段会在HealthChecking阶段切换到目标值,此时 Pod 还没有完成 Ready 验证。只有当phase为Success且installedRevision与目标值一致时,才认为 chart 已升级完成。AppReleaseAPI 还定义了Downloading、Installing、Syncing、DownloadFailed、DeployFailed和NotReady。前三者是临时状态,升级应会自行收敛。后三者表示发生故障,需要人工排查;请先执行kubectl describe apprelease cni-kube-ovn -n cpaas-system以查看每个条件的message字段。 -
监控控制平面滚动更新
升级工作节点
控制平面升级完成后,更新 MachineDeployment 以引用新的工作节点模板和目标 Kubernetes 版本。
常见变更包括:
spec.template.spec.version— 目标 Kubernetes 版本spec.template.spec.infrastructureRef.name— 新的VSphereMachineTemplate名称spec.template.spec.bootstrap.configRef.name— 如果引导设置需要变更,则更新为新的KubeadmConfigTemplate名称(参见 更新 Bootstrap 模板)
应用这些更改:
监控工作节点滚动更新:
回滚失败的升级
如果滚动更新失败——例如新 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.name、spec.version、spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag和spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag。 -
工作节点:patch 每个
MachineDeployment,恢复之前的spec.template.spec.infrastructureRef.name和spec.template.spec.version。 -
Kube-OVN:如果 kube-ovn 注解已更改,请恢复
Cluster资源上的旧值:
如果新的控制平面从未达到 etcd quorum,KubeadmControlPlane 控制器可能会拒绝回滚任何 machine,因为其预检检查会被不健康的 etcd 阻塞。请先恢复 etcd quorum(需要 operator 干预),然后再重试回滚。
验证
升级完成后,请确认以下结果:
KubeadmControlPlane达到目标版本和期望副本数。MachineDeployment达到目标版本和期望副本数。- 控制平面和工作节点恢复到
Ready状态。 - 业务集群中的 vSphere CPI DaemonSet 保持可用。
后续步骤
Kubernetes 升级完成后,请继续执行 在 VMware vSphere 上管理节点 中的常规节点操作。