在 VMware vSphere 上升级集群
本文档说明如何在平台侧分发升级完成后,升级 VMware vSphere 上的 Kubernetes 集群。本文档中的工作流重点是通过 Cluster API 资源更新控制平面和 worker 节点。
本页在完整 ACP 升级流程中的位置
本页仅覆盖升级中的 Kubernetes 步骤。完整的 ACP 升级流程——包括升级工件同步、通过 CVO 进行 ACP Core 升级、Aligned plugin 升级,以及从 Marketplace 升级 Agnostic plugin——记录在 ACP 产品文档中。在开始本页的 Kubernetes 步骤之前,请先完成这些步骤:
如果同一集群运行在不可变操作系统上,请使用本页,因为不可变 OS 上的 Kubernetes 步骤会从新的 VM 模板替换节点,而不是就地升级二进制文件。
升级顺序
按以下顺序升级 VMware vSphere 集群:
- (前提条件) 先在 management 集群上升级 ACP 平台。这会将
cluster-api-provider-vsphere控制器以及相关的 CAPI 组件升级到能够理解新 schema 的版本。仅在 management 侧控制器完成滚动并变为 Ready 之后,再触发 workload 集群升级。 - 完成 升级集群 中描述的分发版本升级。
- 验证控制平面健康且当前集群稳定。
- 将 Kube-OVN 升级到目标 ACP 版本所需的 chart 版本,并等待
AppRelease变为Success。 - 升级控制平面的 Kubernetes 版本。
- 将 worker 节点升级到目标 Kubernetes 版本。
前提条件
开始之前,请确保满足以下条件:
- 分发版本升级已完成。
- 控制平面健康且可访问。
- 所有节点都处于
Ready状态。 - 已使用受支持的 ACP 备份操作步骤创建并验证了当前 etcd 备份。
- vSphere 环境中存在目标 VM 模板,其名称与 OS Support Matrix 行中的 Alauda OS Image Version 值相同。如果在应用新的
VSphereMachineTemplate时该模板不存在,升级将失败。 - 对于跨越多个 Kubernetes minor 版本的跨版本升级,已预先准备好中间版本的 Core 镜像和 VM 模板。参见 跨版本升级准备。
- 目标 Kubernetes 版本与您的 workloads 和 add-ons 兼容。
- machine config pools 有足够容量以支持滚动更新。
- 如果您依赖 pool 管理的持久磁盘,请保持
KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0,并保持每个MachineDeployment.spec.strategy.rollingUpdate.maxSurge: 0,这样替换后的实例可以复用相同的槽位和磁盘标识。 - 检查 Kubernetes 升级路径和版本偏差策略。
磁盘保留模型
升级依赖 Cluster API 的滚动替换机制。每个集群都有四类磁盘;只有 pool 管理的磁盘在删除后重新创建时会被保留。
“保留”表示重新挂载的是同一磁盘标识——并不表示磁盘内容被时光回溯。升级窗口期间写入 pool 管理磁盘的任何内容,在升级后和回滚后都会保留。
模板不能就地修改
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 边界
Fleet Essentials 1.0.4 及更高版本可以通过 CVO 请求 ACP 4.3 及更高版本的 Distribution Version 升级。它不会执行本页所述的 vSphere Kubernetes 和 Alauda OS 替换。请先使用 ACP 工作流完成 Phase 1,然后使用下方的 YAML 操作步骤完成 Phase 2。
来自 OS Support Matrix 的必需值
ACP 版本、其 VM 模板、Kubernetes 版本、匹配的 CoreDNS、etcd 和 Kube-OVN 版本之间的权威映射位于 OS Support Matrix 中。在开始之前,请先找到与目标 ACP 版本对应的行;该行提供下文步骤所需的所有值。
您从该行读取的单元格与升级 manifest 的映射关系如下:
CoreDNS 和 etcd 的 image tag 仅用于控制平面,因为 clusterConfiguration 是 KubeadmControlPlane 字段。worker 节点从新的 VM 模板继承容器镜像版本;MachineDeployment 不携带其自己的 dns/etcd tag。Kube-OVN 注解位于 Cluster 资源上,而不是位于 KubeadmControlPlane 上,因为 vSphere provider 会独立于 Kubernetes 控制平面滚动来观察它。
操作步骤
在控制平面之前升级 Kube-OVN
请按照 在控制平面之前升级 Kube-OVN 中的说明,选择与已安装 provider 版本匹配的 VMware vSphere 操作步骤。共享操作步骤包括 vSphere 特定的网络注解检查、Kube-OVN v4.4 处的 chart 名称迁移、旧 provider 边界,以及所需的 AppRelease 健康检查。
对于目标为 Kube-OVN v4.4+ 的情况,请先将 vSphere provider 升级到 v1.0.16 或更高版本。不要使用更早的 provider 手动 patch chart source,因为其 controller 可能会将旧的 chart 名称回写覆盖更改。
创建目标机器模板
在开始滚动升级之前,请先为控制平面和 worker 创建新的 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;在模板中预先填充该值会破坏 controller 的身份绑定。
- 将
-
导出并修改 worker 模板
编辑
new-worker-template.yaml:- 将
metadata.name设置为一个新的唯一名称(例如,<cluster_name>-worker-v2) - 将
spec.template.spec.template更新为目标 VM 模板名称 - 如有需要,更新 CPU、内存或磁盘设置
- 删除上面列出的相同服务器生成字段
- 将
-
应用这两个新模板
升级控制平面
开始之前,请先完成共享的 在控制平面之前升级 Kube-OVN 操作步骤,并确认 cni-kube-ovn AppRelease 的版本已达到目标 revision 且 phase=Success。然后按照 来自 OS Support Matrix 的必需值 中的说明,从目标 ACP 行中收集所有必需的控制平面值。
-
使用目标 Kubernetes 值 patch
KubeadmControlPlane一次性编辑
KubeadmControlPlane资源,以保持spec.version、CoreDNS image tag、etcd image tag 和基础设施模板引用与同一个 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名称 -
当目标版本为 Kubernetes 1.35 或更高版本时,请在同一次编辑中更新
spec.kubeadmConfigSpec.files中的/etc/kubernetes/patches/kubeletconfiguration0+strategic.json,具体请参见 Kubernetes 1.35 所需的 kubelet patch
仅更新
spec.version并不够。CoreDNS 和 etcd 的 image tag 必须与 Kubernetes 版本一起迁移,因为它们是基于同一 release 构建的;如果保留为之前的值,可能会导致 CoreDNS 和 etcd pod 与新的 Kubernetes minor 版本不匹配。 -
-
监控控制平面滚动更新
升级 worker 节点
控制平面升级完成后,更新 MachineDeployment,使其引用新的 worker 模板和目标 Kubernetes 版本。
常见更改包括:
spec.template.spec.version— 目标 Kubernetes 版本spec.template.spec.infrastructureRef.name— 新的VSphereMachineTemplate名称spec.template.spec.bootstrap.configRef.name— 新的KubeadmConfigTemplate名称。这在 Kubernetes 1.35 或更高版本中是必需的,这样 worker 才能接收 所需的 kubelet patch;对于更早的版本,仅在其他 bootstrap 设置也必须更改时才修改它。参见 更新 Bootstrap 模板。
应用更改:
以下命令包含 Kubernetes 1.35 或更高版本所需的 bootstrap 引用。对于没有 bootstrap 变更的较早目标版本,请省略 bootstrap 对象。
监控 worker 滚动更新:
从失败的 Phase 2 升级中恢复
不要将 Kubernetes minor 降级视为普通回滚。请根据滚动更新阶段选择恢复路径:
- 尚未创建任何目标版本控制平面的
Machine:恢复之前的 Kube-OVN 注解,以及之前的KubeadmControlPlane和MachineDeploymentmanifest 值。这会在引入新的控制平面数据格式之前取消目标滚动更新。 - 仅机器模板或 OS 镜像发生了变化,而 Kubernetes minor 未发生变化:将控制资源指回之前的模板。Cluster API 会再次执行替换滚动更新。保持 Kubernetes minor 不变。
- 目标 Kubernetes minor 上的控制平面
Machine已加入集群:不要将 Kubernetes、CoreDNS 或 etcd patch 回之前的 minor。停止后续滚动更新,在目标 minor 上修复前进,或者使用受支持的 ACP 恢复操作步骤从已验证的升级前备份中恢复集群。
如果已创建目标 minor 的控制平面 Machine 但从未加入,请先恢复健康的 etcd quorum,并判断失败的替换是否可以安全删除。不要假设仅更改版本字段就足够。
在任何恢复过程中,请牢记以下基础设施事实:
- 旧 VM 已经不存在。 它们在升级过程中已被销毁。模板恢复会构建一组新的替换机器;它不会恢复原始 VM。
- 旧的
VSphereMachineTemplate资源必须仍然存在。 在新的滚动更新健康之前,不要删除旧模板。如果您已经删除了它,请先从版本控制或备份中重新创建,再尝试相同 minor 的模板恢复。 - pool 管理的磁盘标识会被保留,但数据状态不会。 在
VSphereMachineConfigPool.spec.configs[].persistentDisks[]中声明的磁盘会在相同槽位重新挂载到替换机器,但升级窗口期间写入的数据仍会保留在这些磁盘上。
对于 stage 1,请使用 在 Stage-1 恢复期间恢复 Kube-OVN 中的 vSphere 规则。当前和旧版 vSphere provider 都会根据注解进行恢复,但共享规则会保留 chart 版本与 provider 版本之间的边界。请等待恢复后的 AppRelease 通过共享验证后,再更改控制平面 manifest。
当 etcd 不健康时,KubeadmControlPlane controller 可能会阻止替换。请先恢复 quorum,再重试任何安全的替换操作。
验证
升级完成后,请确认以下结果:
KubeadmControlPlane达到目标版本和期望的副本数。MachineDeployment达到目标版本和期望的副本数。- 控制平面和 worker 节点恢复到
Ready状态。 - vSphere CPI daemonset 在 workload 集群中保持可用。
后续步骤
Kubernetes 升级完成后,请继续执行 在 VMware vSphere 上管理节点 中的常规节点操作。