在 VMware vSphere 上升级 Kubernetes

本文介绍如何在平台侧发行版升级完成后,升级 VMware vSphere 上的 Kubernetes 集群。本文档所述的工作流重点是通过 Cluster API 资源更新控制平面和工作节点。发布规则请参阅提供商要求。

INFO

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

本页仅介绍 Kubernetes 升级步骤。完整的 ACP 升级流程包括升级制品同步、通过 CVO 升级 ACP Core、升级 Aligned 插件,以及从 Marketplace 升级 Agnostic 插件,相关说明见以下页面。请先完成这些步骤,再开始本页介绍的 Kubernetes 升级步骤:

如果同一集群运行在 Alauda OS 上,请使用本页,因为该环境中的 Kubernetes 升级步骤会通过新的 VM 模板替换节点,而不是原地升级二进制文件。

升级顺序

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

  1. (前提条件) 首先升级管理集群上的 ACP 平台。这样可将 cluster-api-provider-vsphere 控制器及相关 CAPI 组件升级到能够识别新架构的版本。提供商会更新其 CRD,并自行将现有资源迁移到新的字段布局,无需手动修改 YAML。请参阅升级提供商。只有在管理侧控制器完成发布并变为 Ready 后,才触发业务集群升级。
  2. 完成升级发行版版本中所述的发行版版本升级。
  3. 确认现有的 KubeadmControlPlane 和 MachineDeployment 清单符合发布规则。不符合规则的 KubeadmControlPlane 可能会阻止升级时的首次编辑,不符合规则的 MachineDeployment 则会导致发布停滞。请参阅检查清单是否符合准入规则。
  4. 确认控制平面运行正常,且当前集群稳定。
  5. 将 Kube-OVN 升级到目标 ACP 版本所需的 chart 版本,并等待 AppRelease 达到 Success。
  6. 升级控制平面的 Kubernetes 版本。
  7. 将工作节点升级到目标 Kubernetes 版本。

前提条件

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

  • 已完成发行版版本升级。
  • 控制平面运行正常且可访问。
  • 所有节点均处于 Ready 状态。
  • 已按照受支持的 ACP 备份操作步骤创建并验证最新的 etcd 备份。
  • vSphere 环境中已存在由面向目标 ACP 版本发布的 Alauda OS 镜像构建的 VM 模板。如果应用新的 VSphereMachineTemplate 时模板不存在,升级将失败。
  • 对于跨越多个 Kubernetes 次要版本的跨版本升级,请预先暂存中间版本的 Core 镜像和 VM 模板。请参阅跨版本升级准备。
  • 目标 Kubernetes 版本与工作负载及附加组件兼容。
  • 机器配置池有足够的容量执行滚动更新。
  • KubeadmControlPlane 将 spec.rolloutStrategy.rollingUpdate.maxSurge: 0 和 spec.replicas 设置为 3 或更高值,并且每个 MachineDeployment 都设置了 spec.strategy.rollingUpdate.maxSurge: 0。这些值可让替换操作复用相同的槽位和磁盘标识。在开始之前,请使用检查清单是否符合准入规则进行验证。
  • 管理集群不是灾难恢复备用集群。针对备用集群时,提供商会跳过非 global 对象,并每 30 秒重新排队一次,因此发布看起来会像是尚未启动,而不是失败。请参阅备用管理集群。
  • 你知道此集群的 KubeadmControlPlane 名称。请从 Cluster.spec.controlPlaneRef.name 中读取;在 VMware vSphere 上创建集群中的清单将其命名为 <cluster_name>-kcp。
  • 如果集群使用自建 VIP(controlPlaneLoadBalancer.type: internal),则 VSphereCluster.status.conditions[SelfBuiltLoadBalancerReady] 为 True,并且新 VM 模板满足 Alive 内核前提条件(ip_vs 模块系列可加载,且允许使用 net.ipv4.vs.conntrack=1)。替换后的控制平面节点基于该模板构建,提供商不会注入或验证这些设置。
  • 查看 Kubernetes 升级路径和版本偏差策略。
WARNING

发布规则可能会拒绝对现有集群的首次编辑

KubeadmControlPlane 规则同样适用于 UPDATE 和 CREATE,因此现有集群可能包含不再被接受的值:

  • KubeadmControlPlane 的 rolloutStrategy.rollingUpdate.maxSurge 未设置 — Cluster API 默认值为 1;
  • KubeadmControlPlane 设置了 replicas: 1。

拒绝会发生在版本升级操作本身,因此升级会在任何内容被替换之前停止。请在单独的较早编辑中修正 maxSurge;请参阅检查清单是否符合准入规则。只有一个控制平面节点(replicas: 1)的集群无法升级。

未设置 strategy.rollingUpdate.maxSurge: 0 的 MachineDeployment 不会被拒绝,但其发布会停滞:当 maxSurge 默认值为 1 时,发布需要一个满负载池中没有的额外槽位。请在同一较早编辑中修正。

WARNING

磁盘保留模型

每个集群有五种磁盘类别;只有由池管理的持久类磁盘和外部 CSI 卷会在删除并重建后保留。

磁盘类别声明位置升级后是否保留?用途
系统磁盘(根卷)用于 spec.template.spec.template 的 VM 模板❌ 永不保留OS + kubelet/kubeadm/containerd。每次替换时都会从新模板重新构建。
模板本地磁盘VSphereMachineTemplate.spec.template.spec.*(模板中声明的其他磁盘)❌ 永不保留临时缓存。旧 VM 删除时一并销毁。
池管理的临时磁盘VSphereMachineConfigPool.spec.configs[].ephemeralDisks[]❌ 永不保留 — VMDK 会随 VM 一起删除,并为替换节点创建新的空磁盘可重建的节点本地数据,不应放在系统磁盘上,包括标准的 /var/lib/kubelet、/var/lib/containerd 和 /var/lib/etcd 磁盘。
池管理的持久磁盘VSphereMachineConfigPool.spec.configs[].persistentDisks[]✅ 从旧 VM 分离,并在相同槽位重新连接到新 VM平台状态,例如 /var/cpaas。
外部 CSI 卷(vSphere CSI 等)工作负载 PVC / CSI 驱动程序✅ 与节点生命周期无关原生应用数据。

与池管理的持久磁盘不同,临时磁盘不参与回收,也不会占用槽位释放,因此不会延迟发布。请参阅选择持久磁盘或临时磁盘。

磁盘所属类别在集群创建时即已确定。 ephemeralDisks[] 是 provider v1.0.17 中新增的。使用较早版本的 provider 创建的集群会将 /var/cpaas、/var/lib/containerd 和 /var/lib/etcd 声明为持久磁盘,并在 etcd 磁盘上设置 wipeFilesystem: true;升级不会改变这一点,因为 provider 不会迁移磁盘。升级时不要重新调整池的磁盘列表 — 标准的持久磁盘与临时磁盘拆分仅适用于新创建的集群。

“保留”表示重新连接的是同一磁盘标识 — 并不意味着磁盘内容会回到过去。升级期间写入池管理磁盘的任何内容都会在升级后保留,回滚后也会保留。

WARNING

每次更改都创建新模板

本页中的每个升级步骤都会创建一个具有新 metadata.name 的新 VSphereMachineTemplate,应用该模板,然后将控制资源的 infrastructureRef.name 更新为新模板。不要编辑现有模板。请保留旧模板,直到新发布运行正常,以备需要回滚。

INFO

Fleet Essentials 适用范围

Fleet Essentials 1.0.4 及更高版本可通过 CVO 请求 ACP 4.3 及更高版本的 Distribution Version 升级。它不会执行本页所述的 vSphere Kubernetes 和 Alauda OS 替换。请先使用升级发行版版本完成阶段 1,然后使用以下 YAML 操作步骤执行阶段 2。

WARNING

已升级的集群无法使用自建 VIP

自建 VIP 仅适用于在 ACP v4.4 或更高版本上使用 provider v1.0.17 或更高版本创建的集群。使用较早版本的 provider 创建的集群在 provider 升级后仍会保留其外部负载均衡器,且无法切换到自建 VIP:provider 会在第一个控制平面节点启动时注入 VIP,运行中的控制平面无法进行原地迁移。请参阅控制平面端点模式。

端点本身不会迁移,升级也不是更改端点的时机。控制平面端点 — 模式以及 VIP 或负载均衡器地址 — 在部署集群时选定,此后便固定不变;集群运行期间或升级过程中均无法调整。现有集群无需执行任何操作,也不会发生任何变化:spec.controlPlaneLoadBalancer 仍保持未设置,这正是外部负载均衡器的状态,而现在写入该字段会被拒绝。此字段为可选字段正是出于这个原因 — 在自建 VIP 出现之前创建的集群,其端点配置在升级过程中会保持不变。请参阅升级提供商。

OS Support Matrix 中的必需值

ACP 版本、Kubernetes 版本以及对应的 CoreDNS、etcd 和 Kube-OVN 版本之间的权威映射位于 OS Support Matrix。开始之前,请找到与目标 ACP 版本对应的行;该行提供了以下操作步骤所需的组件值。

VM 模板名称不在矩阵中。它是使用针对目标 ACP 版本发布的 Alauda OS 镜像在 vSphere 中创建模板时所用的名称 — 请参阅下载 Alauda OS — VSphereMachineTemplate.spec.template.spec.template 必须在控制平面和工作节点模板中都设为该名称。

该行中各列的值在升级清单中的对应关系如下:

OS Support Matrix 列用于设置对应位置
Kubernetes VersionKubeadmControlPlane.spec.version 和 MachineDeployment.spec.template.spec.version控制平面和工作节点
corednsKubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag仅控制平面。只需设置标签 — provider 会自行设置 dns.imageRepository,该值根据标签中的 -v<acp> 后缀生成,并将 CoreDNS 和 kube-proxy 跳过注解添加到你的 KubeadmControlPlane 中。请参阅清单中由 Provider 管理的字段
etcdKubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag仅控制平面
kube-ovn (chart)Cluster.metadata.annotations["cpaas.io/kube-ovn-version"] 和由 provider 管理的 cni-kube-ovn AppRelease更改 KubeadmControlPlane 之前,请先完成通用的特定于 provider 版本的 Kube-OVN 操作步骤。provider 版本和目标 chart 版本共同决定 chart 名称及支持的协调流程。

CoreDNS 和 etcd 镜像标签仅用于控制平面,因为 clusterConfiguration 是 KubeadmControlPlane 字段。工作节点从新的 VM 模板继承容器镜像版本;MachineDeployment 不包含自己的 dns/etcd 标签。Kube-OVN 注解位于 Cluster 资源上,而不是 KubeadmControlPlane 上。

操作步骤

根据准入规则检查清单

更改任何内容之前,请先读取当前值:

kubectl -n <namespace> get kubeadmcontrolplane <cluster_name>-kcp \
  -o jsonpath='replicas={.spec.replicas} maxSurge={.spec.rolloutStrategy.rollingUpdate.maxSurge}{"\n"}'

kubectl -n <namespace> get machinedeployment -o custom-columns='NAME:.metadata.name,TYPE:.spec.strategy.type,SURGE:.spec.strategy.rollingUpdate.maxSurge,UNAVAIL:.spec.strategy.rollingUpdate.maxUnavailable'

maxSurge 值为空表示该字段未设置;未设置时将采用 Cluster API 默认值 1,而该值不适用于由池支持的控制器。MachineDeployment 示例使用 maxUnavailable: 1。请在提升版本之前更正这些值:

# replicas is 3 or more: correct maxSurge.
kubectl -n <namespace> patch kubeadmcontrolplane <cluster_name>-kcp --type='merge' \
  -p='{"spec":{"rolloutStrategy":{"type":"RollingUpdate","rollingUpdate":{"maxSurge":0}}}}'

kubectl -n <namespace> patch machinedeployment <cluster_name>-md-0 --type='merge' \
  -p='{"spec":{"strategy":{"type":"RollingUpdate","rollingUpdate":{"maxSurge":0,"maxUnavailable":1}}}}'

如果 replicas 小于 3,则无法升级集群。

使用 strategy.type: OnDelete 的 MachineDeployment 无需设置 surge,因为 OnDelete 已采用先删除再替换机器的方式。

开始之前,请确认池运行正常:

kubectl -n <namespace> get vspheremachineconfigpool
kubectl -n <namespace> get vspheremachineconfigpool <cluster_name>-cp-pool \
  -o jsonpath='{range .status.conditions[*]}{.type}={.status} ({.reason}){"\n"}{end}'

预期结果为 Ready=True、MembersValid=True、MembersUnique=True 和 PersistentDisksReady=True。在已完全分配的池中,SlotAvailable 合理地显示为 False;它不属于 Ready 摘要的一部分。

在控制平面之前升级 Kube-OVN

按照在控制平面之前升级 Kube-OVN操作步骤进行,并选择与已安装的 provider 版本匹配的 VMware vSphere 选项卡:仍使用 v1.0.15 或更早版本的集群应遵循旧版选项卡;若目标为 Kube-OVN v4.4 或更高版本,则必须先将 provider 升级到 v1.0.16 或更高版本。通用操作步骤包含 vSphere 专用的网络注解检查、Kube-OVN v4.4 中的 chart 名称迁移,以及所需的 AppRelease 健康检查。请勿手动修补 chart 源;provider 会根据注解协调该配置。

创建目标机器模板

开始滚动升级之前,请为控制平面和工作节点创建新的 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.resourceVersion、metadata.uid、metadata.generation、metadata.creationTimestamp、metadata.managedFields、metadata.annotations["kubectl.kubernetes.io/last-applied-configuration"] 和 status
    • 保持 spec.template.spec.providerID 未设置。VM 创建后,vSphere provider 会将 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

升级控制平面

开始之前,请完成通用的在控制平面之前升级 Kube-OVN操作步骤,并使用 phase=Success 验证 cni-kube-ovn AppRelease 已处于目标修订版本。然后,按照OS Support Matrix 中的必需值所述,从 OS Support Matrix 中目标 ACP 对应的行收集所有必需的控制平面值。

  1. 使用目标 Kubernetes 值修补 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 名称

    • 如果目标为 Kubernetes 1.35 或更高版本,请按照 Kubernetes 1.35 所需的 kubelet 补丁所述,在本次编辑中更新 spec.kubeadmConfigSpec.files 中的 /etc/kubernetes/patches/kubeletconfiguration0+strategic.json

      kubectl edit kubeadmcontrolplane <cluster_name>-kcp -n <namespace>

    仅更新 spec.version 并不足够。CoreDNS 和 etcd 镜像标签必须与 Kubernetes 版本一同更新,因为它们基于同一版本构建;如果仍使用旧值,CoreDNS 和 etcd pod 的版本可能与新的 Kubernetes 次版本不匹配。

    INFO

    provider 完成协调后,预期会在刚才编辑的对象上看到 CoreDNS 和 kube-proxy 跳过注解,以及由控制器设置的 dns.imageRepository。请勿删除这些内容,也不要重新应用不包含这些内容的已存储清单。业务集群的 kube-proxy DaemonSet 和 CoreDNS Deployment 仓库会分别协调,并且仅在此滚动升级完成后进行协调,因此这些资源出现延迟是预期情况。请参阅清单中由 Provider 管理的字段。

    在自建 VIP 集群上,Alive 会在整个滚动升级期间保留 VIP。引导 VIP 仅注入原始 kubeadm init 节点;替换后的控制平面节点通过 VIP 加入,且不会获得该 VIP。随着控制平面成员发生变化,provider 会根据当前控制平面节点地址更新 Alive 后端列表。请保持 maxSurge: 0 — VIP 和 etcd 仲裁都依赖逐个替换节点。

  2. 监控控制平面滚动升级

    kubectl -n <namespace> get kubeadmcontrolplane <cluster_name>-kcp -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 名称。Kubernetes 1.35 或更高版本必须进行此项设置,以便工作节点获得所需的 kubelet 补丁;对于更早版本,仅在需要更改其他引导设置时才进行修改。请参阅更新引导模板。

以下补丁仅更改 spec.template.spec。如果预检显示需要更正 MachineDeployment 策略,则必须在修补之前完成更正。

应用更改:

以下命令包含 Kubernetes 1.35 或更高版本所需的引导引用。如果目标版本更早且无需更改引导配置,请省略 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>"
          },
          "bootstrap": {
            "configRef": {
              "name": "<new-bootstrap-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

在不更改 Kubernetes 版本的情况下更新 OS 映像

使用此操作步骤,在 Kubernetes 版本保持不变的情况下,将节点迁移到新的 Alauda OS 映像,例如获取 OS 安全修复,或将Pod 日志目录迁移应用到现有节点。

  1. 按照创建目标机器模板中的导出、清理和重命名操作步骤,创建新的 VSphereMachineTemplate 资源。仅将 spec.template.spec.template 更改为新的 VM 模板名称。
  2. 应用两个新模板。
  3. 修补 KubeadmControlPlane.spec.machineTemplate.infrastructureRef.name,等待控制平面滚动升级完成,然后修补 MachineDeployment.spec.template.spec.infrastructureRef.name。

不要修改 spec.version、clusterConfiguration.dns.imageTag、clusterConfiguration.etcd.local.imageTag 或 cpaas.io/kube-ovn-version 注释。OS 映像滚动升级并非 Kubernetes 版本升级,因此无需遵循先升级 Kube-OVN 的顺序。

同样的滚动升级规则仍然适用:两个控制器上的 maxSurge: 0。由池管理的持久磁盘会像版本升级时一样重新挂载;由池管理的临时磁盘则会被销毁并重新创建为空磁盘。

如需恢复,将控制资源指回之前的模板。这是从失败的第 2 阶段升级中恢复的第 2 阶段。

不代表失败的滚动升级暂停

某些滚动升级暂停是 Provider 为保护数据而设置的。不要手动清除这些暂停。

附件安全暂停。 删除 VSphereVM 时,Provider 会扫描数据中心,查找仍挂载着该槽位持久磁盘后端存储的 VM。只要仍有任何磁盘处于挂载状态,Provider 就会保留 finalizer 并重新排队。相同的检查也会保护池回收。如果滚动升级似乎在删除第一个旧机器时停滞,通常是触发了此暂停,而非出现故障。不要移除 finalizer。

读取当前状态:

kubectl -n <namespace> get vspheremachineconfigpool <pool_name> \
  -o jsonpath='{range .status.persistentDiskStatuses[*]}{.hostname}{" "}{.name}{" "}{.phase}{" owner="}{.ownerMachineName}{" err="}{.lastError}{"\n"}{end}'
kubectl -n <namespace> get vspherevm -o custom-columns='NAME:.metadata.name,DELETED:.metadata.deletionTimestamp,FINALIZERS:.metadata.finalizers'

正常的交接过程是先执行 Attached,待旧 VM 消失后执行 Available,然后在替换机器上再次执行 Attached。删除和重新创建过程中会保留 ownerMachineName 和 ownerMachineUID,因此替换机器会重新挂载相同的磁盘。

Reclaimed 是墓碑记录。 不要删除 phase: Reclaimed 条目来解除滚动升级停滞。有关删除该条目会导致重新播种循环的原因,请参阅集群创建页面中的故障排除。

SlotAvailable=False 属于预期情况。 使用 maxSurge: 0 且池已完全分配时,只有在删除旧机器后才会有空闲槽位。SlotAvailable 会从池的 Ready 摘要中排除,正是为了避免将这种情况显示为失败。

在 vCenter 中关机的节点会保持关机状态。 VSphereVM 一旦锁定 InitialPowerOnCompleted=True,控制器就不再强制启动已关机的 VM。滚动升级期间创建的替换 VM,其锁定位未设置,因此升级前主动关机的节点会在替换后以开机状态恢复。

从失败的 Phase 2 升级中恢复

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

  1. 尚未创建目标版本的控制平面 Machine:恢复之前的 Kube-OVN 注解,以及之前的 KubeadmControlPlane 和 MachineDeployment 清单值。这样可以在引入新的控制平面数据格式之前取消目标版本的滚动升级。
  2. 仅更改了机器模板或 OS 镜像,Kubernetes 次版本未变:将控制资源指回之前的模板。Cluster API 会执行另一轮替换滚动升级。保持 Kubernetes 次版本不变。
  3. 目标 Kubernetes 次版本的控制平面 Machine 已加入集群:不要将 Kubernetes、CoreDNS 或 etcd 回退到之前的次版本。停止进一步滚动升级,在目标次版本上向前修复,或使用受支持的 ACP 恢复操作步骤,从经过验证的升级前备份恢复集群。

如果已创建目标次版本的控制平面 Machine,但它从未加入集群,请先恢复健康的 etcd 仲裁,并确定是否可以安全移除失败的替换节点。不要假设仅更改版本字段就足够了。

恢复期间,请牢记以下基础设施事实:

  • 旧 VM 已不存在。 它们已在升级过程中销毁。模板恢复会创建一组全新的替换机器,不会恢复原始 VM。
  • 旧的 VSphereMachineTemplate 资源必须仍然存在。 在新一轮滚动升级恢复正常之前,不要删除之前的模板。如果已将其删除,请在尝试恢复相同次版本的模板之前,从版本控制或备份中重新创建。
  • 池管理的磁盘身份会保留,但数据状态不会。 在 VSphereMachineConfigPool.spec.configs[].persistentDisks[] 中声明的磁盘会在相同槽位重新挂载到替换机器上,但升级期间写入的数据仍保留在这些磁盘上。
  • 临时磁盘已丢失。 每个被替换 VM 上的 VSphereMachineConfigPool.spec.configs[].ephemeralDisks[] 数据都会随 VM 一起销毁,无法从池中恢复。只有池管理的持久磁盘会重新挂载。
  • 不要撤销滚动升级规则的修正。 如果阶段 1 要求恢复之前的清单值,请将 maxSurge 保持为 0。

对于阶段 1,请使用在阶段 1 恢复期间恢复 Kube-OVN中的 vSphere 规则。Provider 会根据注解恢复 chart。请等待恢复后的 AppRelease 通过共享验证,然后再更改控制平面清单。

如果 etcd 不健康,KubeadmControlPlane 控制器可能会阻止替换操作。重试任何安全的替换操作之前,请先恢复仲裁。

验证

升级后重新读取池状态:

kubectl -n <namespace> get vspheremachineconfigpool
kubectl -n <namespace> get vspheremachineconfigpool <pool_name> \
  -o jsonpath='{range .status.persistentDiskStatuses[*]}{.hostname}{" "}{.name}{" "}{.phase}{"\n"}{end}'

确认以下结果:

  • KubeadmControlPlane 达到目标版本和所需的从节点数。
  • MachineDeployment 达到目标版本和所需的从节点数。
  • 控制平面和工作节点恢复到 Ready 状态。
  • vSphere CPI daemonset 在业务集群中仍然可用。
  • 每个 VSphereMachineConfigPool 均报告 Ready=True 和 PersistentDisksReady=True;其 ALLOCATED 数量等于从该池调度运行的 Machine 数量,并且其 TOTAL 数量保持不变。
  • 已分配槽位上的每个持久磁盘均报告 phase: Attached。

故障排查

问题检查内容
KubeadmControlPlane 上的 kubectl edit 或 kubectl patch 被拒绝运行升级前检查。有关完整的消息与原因对照表,请参阅准入拒绝。
删除第一台机器后,滚动升级停滞通常是附件安全保持机制,而非缺陷。请参阅不会导致失败的滚动升级保持机制。
池报告 Ready=True,但 SlotAvailable=False在 maxSurge: 0 滚动升级期间,已完全分配的池出现这种情况是正常的。SlotAvailable 不计入 Ready 汇总。
被替换节点的磁盘为空确认磁盘声明在哪个列表中。对于在 v1.0.17 或更高版本上创建的集群,/var/lib/kubelet、/var/lib/containerd 和 /var/lib/etcd 按设计属于临时磁盘,每次替换时都会从空状态开始。对于较旧的集群,它们属于持久磁盘,因此还要检查 wipeFilesystem;按设计,它在 etcd 磁盘上为 true。
没有任何资源协调、条件没有变化,也没有出现错误管理集群可能是灾难恢复备用集群。请参阅备用管理集群。
业务集群节点已关闭且无法恢复一旦 InitialPowerOnCompleted 已锁存,这是预期行为。请在 vCenter 中将其开机。请参阅不会导致失败的滚动升级保持机制。
新的控制平面机器始终无法引导查看 VSphereVM 和 VSphereMachine 上的 BootstrapReady 条件;原因分别为 BootstrapSecretGetFailed 和 BootstrapSecretContentInvalid。
Kube-OVN 注解已更改,但 chart 名称或修订版本未收敛按照共享的 Kube-OVN 操作步骤进行操作。请勿手动修补 chart 源。
控制平面达到目标版本后,业务 kube-proxy 或 coredns 仍在使用旧镜像仓库这是预期的堆积量——只有在控制平面滚动升级完成后,才会对这些资源进行协调。请参阅清单中由 Provider 管理的字段。
VSphereMachineTemplate 更新因不可变而被拒绝使用新名称创建新的模板。请参阅本页上方的警告。

后续步骤

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