在 Huawei Cloud Stack 上升级集群
本指南说明如何在尽量减少停机时间的情况下升级 Huawei Cloud Stack 上的 Kubernetes 集群,同时保持稳定性和数据完整性。
本页在完整 ACP 升级流程中的位置
本页仅涵盖升级中的 Kubernetes 步骤。完整的 ACP 升级流程——包括升级工件同步、通过 CVO 升级 ACP Core、Aligned 插件升级,以及从 Marketplace 升级 Agnostic 插件——都记录在 ACP 产品文档中。在开始本页的 Kubernetes 步骤之前,请先完成这些步骤:
如果同一集群运行在不可变操作系统上,请使用本页,因为不可变 OS 上的 Kubernetes 步骤是从新的 VM 模板替换节点,而不是原地升级二进制文件。
版本
HCS provider v1.0.1 是首个支持 pool-managed persistent disks 的版本。
现有集群迁移
如果您的集群运行 ACP v4.3.1 或更高版本,并且正在迁移到 HCS provider v1.0.1 或更高版本,请先完成 将现有 Huawei Cloud Stack 集群迁移到 Pool-Managed Persistent Disks 中的迁移操作,再依赖升级时的磁盘保留能力。
概述
HCS 上的集群升级包含多个组件,并采用结构化方法来确保系统可靠性:
- 控制平面升级:更新 Kubernetes 控制平面组件及底层基础设施
- 工作节点升级:使用新的机器镜像和 Kubernetes 版本升级工作节点
- 基础设施更新:修改虚拟机规格、存储和网络配置
升级顺序
请按以下顺序升级 HCS 集群:
- (前置条件) 先在管理集群上升级 ACP 平台。这会将
cluster-api-provider-hcs控制器以及相关的 CAPI 组件升级到能够识别新 schema 的版本。只有在管理侧控制器完成滚动发布并变为 Ready 之后,才触发 workload 集群升级。 - 升级 workload 集群上的 Distribution Version。请参见 升级集群。
- 升级控制平面 Kubernetes 版本。
- 将工作节点升级到目标 Kubernetes 版本。
Cluster API 使用内置的安全机制编排滚动更新,以减少服务中断。
跳过步骤 1 会带来两种失败模式:旧控制器会静默忽略写入 HCSMachineConfigPool / HCSMachineTemplate 的新 schema 字段;或者在滚动过程中更换控制器镜像会中断 persistent-disk 状态机的推进。请务必先完成管理侧升级,再触碰 workload 的滚动发布。
前提条件
在开始之前,请确保满足以下所有前提条件:
- Distribution Version 升级已完成。
- 控制平面可达。
- 所有节点均处于健康状态并为
Ready。 - 目标 VM 镜像已存在于 HCS 环境中,且名称与 OS Support Matrix 对应行中的 Alauda OS Image Version 值相同。如果在应用新的
HCSMachineTemplate时该镜像不存在,升级会失败。 - 对于跨越多个 Kubernetes minor 版本的跨版本升级,已预先准备好中间版本的 Core 镜像和 VM 镜像。请参见 跨版本升级准备。
- 目标 Kubernetes 版本与您的工作负载和附加组件兼容。
- 请检查 Kubernetes 升级路径和版本偏差策略。
- 任何必须在替换后仍需保留的节点本地状态,都应声明在
HCSMachineConfigPool.spec.configs[].persistentDisks[]中,而不是声明在HCSMachineTemplate.spec.template.spec.dataVolumes[]中。
首次部署请参见 创建集群 指南。
单控制平面集群
本文档中的升级流程适用于具有高可用控制平面的 HCS 集群。支持创建单控制平面 HCS 集群,但不支持通过此流程进行升级。
磁盘保留模型
升级依赖 Cluster API 的滚动替换机制。HCS provider 有四类磁盘:
不要将 HCS dataVolumes[] 上的节点本地数据视为可保留状态。在滚动替换之前,请将 /var/cpaas 以及任何其他需要保留的节点本地路径迁移到 pool-managed persistent disks。
模板不能原地修改
HCSMachineTemplate 是 Cluster API 的基础设施模板。只有当 KubeadmControlPlane.spec.machineTemplate.infrastructureRef.name 或 MachineDeployment.spec.template.spec.infrastructureRef.name 指向不同的模板名称时,Cluster API 才会触发滚动替换。就地编辑现有模板会改变 manifest,但不会产生新的滚动发布——正在运行的 VM 仍继续使用之前模板在内存中的快照。
因此,本页中的每个升级步骤都会创建一个带有新 metadata.name 的新 HCSMachineTemplate,先应用它,然后再把控制资源的 infrastructureRef.name 补丁到新模板。请保留旧模板,直到新的滚动发布健康为止,以便在需要回滚时使用。
Fleet Essentials UI 不支持 ACP 4.3 集群升级
Fleet Essentials UI 工作流尚未适配 ACP 4.3 中引入的 Cluster Version Operator (CVO) 机制。HCS 集群当前不提供 Fleet Essentials UI 升级路径;请使用下文记录的 YAML 操作步骤,或使用 ACP Core 平台内置的两步升级流程——请参见 为 workload 集群请求升级。
控制平面升级
控制平面升级会更新 Kubernetes API server、etcd、scheduler 和 controller manager,以及底层的 VM 基础设施。
对于由使用 pool-managed persistent disks 的 HCSMachineConfigPool 支撑的 HCS 控制平面,在升级期间请将 KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0 保持不变。persistent disks 绑定到固定的 (hostname, slot) 身份,因此滚动发布必须先移除旧机器,然后替换机器才能复用相同的磁盘。
基础设施镜像更新
升级控制平面节点所使用的底层机器镜像可以提供安全补丁、性能改进以及更新后的系统组件。
操作步骤
-
创建更新后的 Machine Template
复制
KubeadmControlPlane引用的现有HCSMachineTemplate,并修改所需规格: -
修改模板规格
修改新模板:
- 将
metadata.name设置为<new-template-name> - 从复制的 manifest 中移除服务器生成的 metadata 和 status 字段
- 保持运行时身份字段为空,包括
spec.template.spec.providerID和spec.template.spec.serverId。HCS provider 在创建实例时会分配这些值。 - 将需要保留的路径(例如
/var/cpaas)排除在spec.template.spec.dataVolumes[]之外。请在引用的HCSMachineConfigPool.spec.configs[].persistentDisks[]中声明这些路径。 - 按需更新:
spec.template.spec.imageNamespec.template.spec.flavorNamespec.template.spec.rootVolume.sizespec.template.spec.dataVolumes(仅用于临时磁盘)
- 将
-
部署更新后的模板
应用新的 machine template:
-
更新控制平面引用
修改
KubeadmControlPlane资源以引用新模板: -
监控滚动更新
控制平面将自动执行滚动更新:
Kubernetes 版本升级
升级 Kubernetes 版本需要同时更新控制平面软件和配套的虚拟机镜像。
来自 OS Support Matrix 的必需值
ACP 版本、其 Alauda OS 镜像、Kubernetes 版本,以及匹配的 CoreDNS、etcd 和 Kube-OVN 版本之间的权威映射位于 OS Support Matrix 中。开始之前,请先找到与目标 ACP 版本对应的行;该行提供了下述操作所需的全部值。
您从该行读取的单元格与升级 manifest 的映射关系如下:
CoreDNS 和 etcd 的镜像标签仅适用于控制平面,因为 clusterConfiguration 是 KubeadmControlPlane 字段。工作节点从新的 VM 模板继承容器镜像版本;MachineDeployment 不携带自己的 dns/etcd 标签。Kube-OVN 注解位于 Cluster 资源上,而不是 KubeadmControlPlane 上,因为 HCS provider 会独立于 Kubernetes 控制平面滚动发布来监视它。
操作步骤
-
为目标 Kubernetes 版本创建新的
HCSMachineTemplate复制现有控制平面模板,并以新的
metadata.name和目标imageName应用它:在
new-cp-template.yaml中:-
将
metadata.name设置为<new-template-name>。 -
将
spec.template.spec.imageName设置为 OS Support Matrix 中目标行的 Alauda OS Image Version 值。 -
删除服务器生成的 metadata(
resourceVersion、uid、generation、creationTimestamp、managedFields、kubectl.kubernetes.io/last-applied-configuration注解)以及整个status字段。 -
保持运行时身份字段为空,包括
spec.template.spec.providerID和spec.template.spec.serverId。HCS provider 在 VM 创建后会将providerID设置为hcs://<cluster-name>/<machine-name>,并将serverId设置为 HCS ECS 实例 ID;在模板中预先填充这些字段会破坏控制器的身份绑定。
-
-
使用目标 Kubernetes 值补丁
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 步创建的新HCSMachineTemplate名称
仅更新
spec.version不足够。CoreDNS 和 etcd 的镜像标签必须与 Kubernetes 版本一起变更,因为它们都基于同一个 Alauda OS 版本构建;如果保留旧值,可能会导致 CoreDNS 和 etcd pod 与新的 Kubernetes minor 版本不匹配。当引用的控制平面池使用 persistent disks 时,请保持
spec.rolloutStrategy.rollingUpdate.maxSurge: 0。替换机器在旧机器移除后必须复用相同的固定 hostname 和磁盘 slot。 -
-
在 workload 集群上升级 Kube-OVN chart
Kube-OVN 是一个 Core 生命周期组件,但在不可变 OS 上,HCS provider 不会将其 chart 版本固定到集群的 Kubernetes 版本。chart 版本由 workload 集群中
cpaas-system命名空间下名为cni-kube-ovn的独立AppRelease承载,您需要分两步向前推进:先更新Cluster资源上的注解,用于记录和未来重建,然后直接补丁现有AppRelease以提升 chart revision。WARNING为什么在 HCS 上需要两步
HCS provider 在集群首次构建时创建
cni-kube-ovnAppRelease,此后只会调谐spec.values块(集群名称、CIDR、registry、控制平面节点列表)。它不会写入已存在AppRelease的spec.source.charts[0].targetRevision。因此,仅在Cluster资源上更改cpaas.io/kube-ovn-version并不会推动 workload 集群上的 chart 版本变更。注解仍然必须更新,以便记录的目标值与 OS Support Matrix 行一致,但 chart 升级本身需要通过直接补丁AppRelease来驱动。3.1. 更新
Cluster资源上的cpaas.io/kube-ovn-version注解当
spec.version变化时,该注解不会自动更新;请将其保持为目标行的 kube-ovn (chart) 列对应的值。3.2. 在 workload 集群上补丁
AppRelease的 chart revision请针对 workload 集群的 API server 执行补丁操作(不要针对 bootstrap KIND 或
global集群):使用与注解中相同的值。
releaseName(cpaas-kube-ovn)和name(acp/chart-cpaas-kube-ovn)由 provider 管理;不要更改它们。3.3. 等待调谐完成
观察 chart 阶段和已安装 revision:
正常顺序是
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 资源进行管理。
有关工作节点的详细操作步骤,请参见 管理节点 部分。
回滚失败的升级
如果滚动更新失败——例如新的 VM 无法启动、节点无法变为 Ready,或者新的 Kubernetes minor 版本暴露出兼容性问题——请将模板引用和 Kubernetes 版本字段恢复为之前的值。Cluster API 会将此回退视为新的 spec 漂移,并逐个将 v2 机器回滚到之前的模板。
在执行回滚前,需要先理解以下三点:
- 旧 VM 已经不存在。 它们在升级期间已被销毁。回滚会使用旧模板构建一组新的替换机器;它不会恢复原来的 VM。
- 旧的
HCSMachineTemplate资源必须仍然存在。 在新的滚动发布健康之前,不要删除前一个模板。如果您已经删除了它,请在回滚前从版本控制或备份中重新创建它。 - 只有 pool-managed persistent disks 才能保留节点本地状态。 升级窗口内写入
HCSMachineTemplate.spec.template.spec.dataVolumes[]的数据会在该 VM 被替换时丢失。写入HCSMachineConfigPool.spec.configs[].persistentDisks[]中声明的磁盘的数据会被保留并重新挂载到替换后的 VM。除非您的运维设计明确依赖节点本地状态,否则应用数据仍应使用外部持久化存储,例如 HCS EVS CSI。
操作步骤:
-
控制平面:补丁
KubeadmControlPlane,恢复之前的spec.machineTemplate.infrastructureRef.name、spec.version、spec.kubeadmConfigSpec.clusterConfiguration.dns.imageTag和spec.kubeadmConfigSpec.clusterConfiguration.etcd.local.imageTag。 -
工作节点:补丁每个
MachineDeployment,恢复之前的spec.template.spec.infrastructureRef.name和spec.template.spec.version。 -
Kube-OVN:如果已升级 Kube-OVN chart,请按升级时相同的方式回滚——先恢复注解,再将
AppRelease的 chart revision 补丁回去。使用第 3 步中相同的installedRevision+phase=Success检查进行验证。
如果新的控制平面从未达到 etcd quorum,KubeadmControlPlane 控制器可能会因为预检检查在不健康的 etcd 上阻塞,而拒绝回滚任何机器。请先恢复 etcd quorum(需要 operator 人工介入),然后再重试回滚。