在 Huawei DCS 上升级 Kubernetes
本指南说明如何完成 Huawei DCS 上集群升级工作流的第 2 阶段。在升级 Kubernetes 之前,请先完成 Upgrading Clusters 中描述的 Distribution Version 升级。
本页面在完整 ACP 升级流程中的位置
本页面仅涵盖升级中的 Kubernetes 步骤。完整的 ACP 升级流程——包括升级工件同步、通过 CVO 升级 ACP Core、Aligned 插件升级,以及来自 Marketplace 的 Agnostic 插件升级——都记录在 ACP 产品文档中。在开始本页面的 Kubernetes 步骤之前,请先完成这些步骤:
如果同一集群运行在不可变操作系统上,请使用本页面,因为在不可变 OS 上执行 Kubernetes 步骤时,会使用新的基于 Alauda OS 的 VM 模板替换节点,而不是就地升级二进制文件。
版本
DCS provider v1.0.16 是第一个支持池管理持久盘的版本。
现有集群迁移
如果你的集群运行的是 ACP v4.2.1 或更高版本,并且你要迁移到 DCS provider v1.0.16 或更高版本,请先完成 将现有 Huawei DCS 集群迁移到池管理持久盘 中的迁移步骤,然后再依赖升级期间的磁盘保留能力。
目录
升级顺序前提条件使用 YAML来自 OS Support Matrix 的必需值升级控制平面基础设施操作步骤升级控制平面 Kubernetes 版本操作步骤升级 Worker 节点操作步骤回滚失败的升级使用 Web UI前提条件升级工作流检查可用升级升级 Control Plane Node Pool升级 Worker Node Pools故障排查其他资源升级顺序
请按以下顺序升级 DCS 集群:
- (前提条件) 先升级管理集群上的 ACP 平台。这会将 cluster-api-provider-dcs controller 及相关 CAPI 组件(core、KubeadmControlPlane provider、bootstrap provider)升级到能够识别新 schema 的版本。只有在管理侧 controller 完成滚动并变为 Ready 之后,才触发业务集群升级。
- 在业务集群上升级 Distribution Version(Aligned Extensions)。参见 Upgrading Distribution Version。
- 升级控制平面 Kubernetes 版本。
- 将 worker 节点升级到目标 Kubernetes 版本。
Cluster API 使用内置安全机制编排滚动更新,以减少服务中断。
跳过步骤 1 可能导致两种失败模式:旧 controller 会静默忽略写入 DCSIpHostnamePool / DCSMachineTemplate 的新 schema 字段;或者在滚动过程中更换 controller 镜像会中断持久盘状态机的推进。务必先完成管理侧升级,再对业务集群执行滚动。
前提条件
在开始之前,请确保满足以下所有前提条件:
- Distribution Version 升级已完成
- 控制平面可达
- 所有节点健康并处于 Ready 状态
- IP Pool 有足够容量支持滚动更新
- VM 模板支持目标 Kubernetes 版本。有关版本映射,请参见 OS Support Matrix
- 对于跨越超过一个 Kubernetes minor 版本的跨版本升级,请提前准备好中间版本的 Core 镜像和 VM 模板。参见 Cross-Version Upgrade Preparation
- 目标 Kubernetes 版本与你的工作负载和 add-on 兼容
- 如果你使用池管理持久盘,DCS VM 模板必须是
4.2.1或更高版本,因为安全关机和磁盘分离依赖 guest tools - 如果你依赖池管理持久盘,请保持
KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge = 0,并保持每个MachineDeployment.spec.strategy.rollingUpdate.maxSurge = 0 - 如果集群使用了额外 NIC,请保持所需的
DCSIpHostnamePool.spec.pool[].additionNic[]条目,并确认可能接收替换 VM 的主机可以访问 DCS DVS 和 Port Groups
磁盘保留模型
升级依赖 Cluster API 的滚动更新机制。每个集群有四类磁盘;只有池管理类磁盘会在删除并重建后保留。
“保留”指的是同一块磁盘身份会被重新挂载——并不表示磁盘内容会被“时光回溯”。升级窗口期间写入池管理磁盘的任何内容,在升级后以及回滚后都会保留。
池管理保留要求逐台替换,因此请同时在 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate 和 MachineDeployment.spec.strategy.rollingUpdate 上保持 maxSurge = 0。
如果现有集群仍然把保留数据保存在旧的模板磁盘布局中,请先按照 将现有 Huawei DCS 集群迁移到池管理持久盘 进行迁移。
滚动替换期间的额外 NIC
额外 NIC 定义在 DCSIpHostnamePool.spec.pool[].additionNic[] 中,而不是在 DCSMachineTemplate 中。在升级期间,每个替换 VM 会使用其所声明的 Pool 槽位中的额外 NIC。下面的升级模板步骤不应将额外 NIC 配置迁移到 DCSMachineTemplate 中。
模板不能就地修改
DCSMachineTemplate 是一个 Cluster API infrastructure template。只有当 KubeadmControlPlane.spec.machineTemplate.infrastructureRef.name 或 MachineDeployment.spec.template.spec.infrastructureRef.name 指向不同的模板名称时,Cluster API 才会触发滚动替换。就地编辑现有模板只会改变 manifest,不会产生新的滚动更新——运行中的 VM 仍然继续使用之前模板的内存快照。
因此,本页面的每个升级步骤都会创建一个新的 DCSMachineTemplate,为其分配新的 metadata.name,应用后再将控制资源的 infrastructureRef.name patch 为新模板。应保留旧模板,直到新滚动健康为止,以便在需要回滚时使用。
使用 YAML
基于 YAML 的升级不依赖 Fleet Essentials。
来自 OS Support Matrix 的必需值
ACP 发布版本、其 Alauda OS 镜像、Kubernetes 版本,以及匹配的 CoreDNS、etcd 和 Kube-OVN 版本之间的权威映射,位于 OS Support Matrix 中。在开始之前,请先找到与目标 ACP 版本对应的那一行;该行提供下面 YAML 步骤所需的全部值。
你从该行读取的单元格与升级 manifest 的映射关系如下:
CoreDNS 和 etcd 的镜像标签仅适用于控制平面,因为 clusterConfiguration 是 KubeadmControlPlane 的字段。worker 节点从新的 VM 模板继承容器镜像版本;MachineDeployment 不携带自己的 dns/etcd 标签。Kube-OVN 注解位于 Cluster 资源上,而不是 KubeadmControlPlane 上,因为 DCS provider 会独立于 Kubernetes 控制平面滚动更新来监视它。
请与集群的平台所有者确认:目标 Alauda OS 镜像已经以矩阵中 Alauda OS Image Version 所对应的同名内容上传到 DCS 平台。如果在应用 DCSMachineTemplate 时该 VM 模板在 DCS 上不存在,升级将失败。
升级控制平面基础设施
升级控制平面 machine template 可让你滚动发布更新后的 VM 规格、系统补丁和基础设施设置。
操作步骤
-
创建更新后的 machine template
复制
KubeadmControlPlane引用的现有DCSMachineTemplate,并将其保存为新文件: -
修改模板规格
按需更新新模板:
- 将
metadata.name设置为<new-template-name> - 更新
spec.template.spec.vmTemplateName - 更新
spec.template.spec.vmConfig.dcsMachineCpuSpec.quantity - 更新
spec.template.spec.vmConfig.dcsMachineMemorySpec.quantity - 仅更新系统盘和模板本地磁盘的
spec.template.spec.vmConfig.dcsMachineDiskSpec - 从复制的 manifest 中删除服务器生成的 metadata(
resourceVersion、uid、generation、creationTimestamp、managedFields、kubectl.kubernetes.io/last-applied-configurationannotation)以及整个status字段。 - 保持
spec.template.spec.providerID为空。DCS provider 会在 VM 创建后将providerID设置为dcs://<machine-name>;如果在模板中预先填充该值,会破坏 controller 的 identity binding。
将池管理持久盘(包括
/var/cpaas)保留在DCSIpHostnamePool.spec.pool[].persistentDisk中。将额外 NIC 保留在DCSIpHostnamePool.spec.pool[].additionNic[]中。 - 将
-
应用更新后的模板
-
更新控制平面引用
修改
KubeadmControlPlane资源以引用新模板: -
监控滚动更新
升级控制平面 Kubernetes 版本
在不可变 OS 上升级控制平面 Kubernetes 版本是一个删除并重建的工作流。控制平面 VM 会通过新的 DCSMachineTemplate 逐台替换;该模板指向目标 Alauda OS VM 模板,并且会 patch KubeadmControlPlane 资源,使其携带匹配的 Kubernetes 版本、CoreDNS 镜像标签和 etcd 镜像标签。
在开始之前,请先按照 来自 OS Support Matrix 的必需值 的说明,从 OS Support Matrix 中目标 ACP 行收集所有必需值。
操作步骤
-
为目标 Kubernetes 版本创建一个新的
DCSMachineTemplate复制现有的控制平面模板,并将
metadata.name更新为新名称,将spec.template.spec.vmTemplateName更新为 OS Support Matrix 目标行中读取到的 Alauda OS Image Version 值。将池管理持久盘保留在DCSIpHostnamePool.spec.pool[].persistentDisk中,并将额外 NIC 保留在DCSIpHostnamePool.spec.pool[].additionNic[]中,而不是重新作为模板字段引入。 -
使用目标 Kubernetes 值 patch
KubeadmControlPlane通过一次性编辑更新
KubeadmControlPlane资源,以保持spec.version、CoreDNS 镜像标签、etcd 镜像标签以及基础设施模板引用与同一个 Alauda OS 版本一致:-
spec.version← OS Support Matrix 目标行中的 Kubernetes Version -
spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag← 同一行中的 coredns 列 -
spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag← 同一行中的 etcd 列 -
spec.machineTemplate.infrastructureRef.name← 步骤 1 中创建的新DCSMachineTemplate名称
仅更新
spec.version并不足够。CoreDNS 和 etcd 的镜像标签必须与 Kubernetes 版本一起迁移,因为它们是基于同一个 Alauda OS 版本构建的;如果保持旧值不变,可能导致 CoreDNS 和 etcd Pod 与新的 Kubernetes minor 版本不匹配。 -
-
在业务集群上升级 Kube-OVN chart
Kube-OVN 是一个 Core 生命周期组件,但在不可变 OS 上,DCS provider 不会将其 chart 版本固定到集群的 Kubernetes 版本。chart 版本由业务集群
cpaas-system命名空间中的一个名为cni-kube-ovn的独立AppRelease承载,你需要通过两个步骤将其推进:先更新Cluster资源上的注解用于记录和未来重新创建,再直接 patch 现有AppRelease以提升 chart revision。WARNING为什么在 DCS 上需要两个步骤
DCS provider 在集群首次创建时会创建
cni-kube-ovnAppRelease,从那以后它只会协调spec.values块(集群名称、CIDR、registry、控制平面节点列表)。它不会写入已存在AppRelease的spec.source.charts[0].targetRevision。因此,仅修改Cluster资源上的cpaas.io/kube-ovn-version并不会改变业务集群上的 chart 版本。仍然需要更新该注解,以便记录的目标值与 OS Support Matrix 行保持一致,但 chart 升级本身必须通过直接 patchAppRelease来驱动。3.1. 更新
Cluster资源上的cpaas.io/kube-ovn-version注解当
spec.version变化时,该注解不会自动更新;请使其与目标行的 kube-ovn (chart) 列保持一致。3.2. 在业务集群上 patch
AppRelease的 chart revision请对业务集群的 API server 执行 patch,而不是 bootstrap KIND 或
global集群:使用与注解中相同的值。
releaseName(cpaas-kube-ovn)和name(acp/chart-cpaas-kube-ovn)由 provider 管理;不要修改它们。3.3. 等待协调完成
观察 chart phase 和 installed revision:
正常顺序是
Upgrading → HealthChecking → Success。在小规模集群上,完整转换通常会在约一分钟内完成。各 phase 的含义如下: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字段。 -
监控滚动更新
当集群依赖池管理持久盘时,
KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge必须保持为0,这样控制平面 VM 才会逐台替换。
升级 Worker 节点
worker 节点的 Kubernetes 升级通过 MachineDeployment 资源进行管理。worker 升级涉及的字段比控制平面更少:CoreDNS 和 etcd 的镜像标签属于 KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration 的一部分,而 MachineDeployment 并不包含这些字段。worker 节点从新的 VM 模板继承 Kubernetes 组件版本;MachineDeployment 只需要目标 Kubernetes 版本和新的模板引用。
在开始之前,请按照 来自 OS Support Matrix 的必需值 的说明,读取 OS Support Matrix 中目标 ACP 行的 Alauda OS Image Version 和 Kubernetes Version 单元格。
操作步骤
-
为 worker 节点创建新的
DCSMachineTemplate- 创建一个新的
DCSMachineTemplate,并将vmTemplateName设置为 OS Support Matrix 目标行中的 Alauda OS Image Version 值 - 将
/var/cpaas以及任何其他升级期间需要保留的磁盘保留在DCSIpHostnamePool.spec.pool[].persistentDisk中,而不是重新作为模板磁盘引入 - 将额外 NIC 保留在
DCSIpHostnamePool.spec.pool[].additionNic[]中
- 创建一个新的
-
更新
MachineDeployment- 将
spec.template.spec.version设置为同一 OS Support Matrix 行中的 Kubernetes Version 值 - 将
spec.template.spec.infrastructureRef.name设置为步骤 1 中创建的新DCSMachineTemplate名称 - 如果此版本需要变更 bootstrap 配置,可选地更新
spec.template.spec.bootstrap.configRef.name
- 将
-
监控滚动更新
- 验证滚动更新已成功完成
- 验证新的 worker 节点已使用目标 Kubernetes 版本加入集群
当集群依赖池管理持久盘时,
MachineDeployment.spec.strategy.rollingUpdate.maxSurge必须保持为0,这样 worker 节点才会逐台替换。
回滚失败的升级
如果滚动更新失败——新的 VM 无法启动、节点未能变为 Ready,或者新的 Kubernetes minor 版本暴露出兼容性问题——请将模板引用和 Kubernetes 版本字段恢复为先前的值。Cluster API 会将该回退视为新的 spec 漂移,并将 v2 机器逐台回滚到之前的模板。
在回滚之前,需要先牢记三点:
- 旧 VM 已经消失。 它们在升级期间已被销毁。回滚会使用旧模板构建一组新的替换机器;它不会恢复原始 VM。
- 旧的
DCSMachineTemplate资源必须仍然存在。 在新滚动健康之前,不要删除旧模板。如果你已经删除了它,请先从版本控制或备份中重新创建,再进行回滚。 - 池管理磁盘的身份会被保留,但数据状态不会。 在
DCSIpHostnamePool.spec.pool[].persistentDisk中声明的磁盘会以相同 IP 槽位重新挂载到回滚后的机器上,但升级窗口期间写入这些磁盘的任何数据(例如新 Kubernetes minor 格式的 etcd 条目)都会保留。如果新格式对旧 Kubernetes minor 版本不可读,那么回滚仍可能失败,并需要手动恢复 etcd。
操作步骤:
-
控制平面:patch
KubeadmControlPlane,恢复之前的spec.machineTemplate.infrastructureRef.name、spec.version、spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag和spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag。 -
Workers:patch 每个
MachineDeployment,恢复之前的spec.template.spec.infrastructureRef.name和spec.template.spec.version。 -
Kube-OVN:如果升级了 Kube-OVN chart,则按应用升级时相同的方式回退——先恢复注解,再将
AppRelease的 chart revision patch 回去。使用与步骤 3 中相同的installedRevision+phase=Success检查进行验证。
如果新的控制平面从未达到 etcd quorum,那么 KubeadmControlPlane controller 可能会拒绝回滚任何机器,因为其预检检查会在不健康的 etcd 上阻塞。在重试回滚之前,先恢复 etcd quorum(需要 operator 干预)。
使用 Web UI
Fleet Essentials UI 不支持 ACP 4.3 集群升级
Fleet Essentials UI 工作流尚未适配 ACP 4.3 中引入的 Cluster Version Operator (CVO) 机制。请勿使用 Fleet Essentials UI 升级 ACP 4.3 上的 DCS 集群。
两种受支持的替代方式:
- YAML 路径 — 按照本页面前文所述的基于 YAML 的升级流程执行。
- ACP Core 集群管理 UI — 使用 ACP Core 平台内置的两步升级流程;参见 为 global 集群请求升级 或 为业务集群请求升级。
通过 Fleet Essentials UI 进行集群创建和节点池管理不受此限制影响。
在第 1 阶段完成后,使用此工作流从 Web UI 升级 Kubernetes。
版本要求:此工作流要求 Fleet Essentials 和 Alauda Container Platform DCS Infrastructure Provider 1.0.13 或更高版本。如果 provider 版本早于 1.0.13,请使用 YAML manifest。如果升级依赖池管理持久盘,请使用 DCS provider v1.0.16 或更高版本。在 v1.0.16 中,DCSIpHostnamePool 上的 persistentDisk 声明仍然只能通过 YAML 配置,Web UI 中不提供该项。
前提条件
- Distribution Version 升级已完成。参见 Upgrading Distribution Version
- Control Plane Node Pool 处于 Running 状态
- IP Pool 有足够容量支持滚动更新
- 如果升级依赖池管理持久盘,请确保所需的
DCSIpHostnamePool.spec.pool[].persistentDisk条目已经通过 YAML 创建或更新
升级工作流
在 Distribution Version 升级完成后,Kubernetes 升级按以下顺序进行:
- 升级 Control Plane Node Pool。
- 等待 Control Plane Node Pool 升级完成。
- 按任意顺序升级 Worker Node Pools。
检查可用升级
导航:Clusters → Clusters → 选择集群 → Node Pools 选项卡
有可用升级的 Node Pool 会显示 Upgrade available 指示器。点击 Node Pool 卡片可查看 Current 与 Target 版本。
升级 Control Plane Node Pool
步骤:
- 在 Node Pools 选项卡中,找到 Control Plane Node Pool
- 点击 Upgrade
- 查看升级信息:
- Current Version:当前 Kubernetes 版本
- Target Version:自动选择的最新 minor 版本
- 点击 Confirm 开始升级
监控:
- 观察 Node Pool 状态
- 节点会逐台滚动更新(
maxSurge=0)。当集群依赖持久盘时,也必须采用这种逐台替换方式。 - 升级时间取决于节点数量和资源情况
升级 Worker Node Pools
在 Control Plane Node Pool 升级完成之前,Worker Node Pools 不能升级。
何时可以升级 Worker Pool:
- Control Plane Kubernetes Version 与 global 集群版本一致
- Control Plane 处于 Running 状态
升级步骤:
- 对每个 Worker Node Pool:
- 点击 Upgrade 按钮
- 查看并确认
- Control Plane 完成后,各个 Pool 可以并行升级
升级约束: