升级 global 集群
本文介绍如何升级运行在 Immutable Infrastructure 上的 global 集群。升级操作会使用 Cluster API provider 管理的新 Alauda OS 镜像替换节点;不采用节点原地升级。
对于 Huawei DCS global 集群,请在选择目标 DCS Provider 软件包和 Alauda OS 镜像之前,查看 Alauda OS 和 Provider 兼容性。
目录
何时使用此路径两阶段升级概览通用前提条件操作步骤步骤 1 — 升级 Kube-OVN步骤 2 — 更新 global 集群清单步骤 3 — 应用更新后的清单步骤 4 — 监控滚动替换验证恢复注意事项后续步骤何时使用此路径
在以下情况下选择此升级路径:
global集群最初安装在 Immutable Infrastructure 上。请参阅安装 global 集群。- 您的基础设施属于以下已记录的 provider 之一:Huawei DCS、VMware vSphere、Huawei Cloud Stack,或在所安装的版本中包含 provider
v1.0.0或更高版本的 Bare Metal。
对于传统 OS global 集群,请改用 标准升级路径。
两阶段升级概览
与业务集群一样,Immutable Infrastructure 上的 global 集群遵循两阶段升级流程。
- 阶段 1 — ACP Core 和 Distribution Version:准备构件和插件软件包,然后使用 CVO 将 global 层移动到目标 Distribution Version。此操作步骤由 ACP 产品文档负责;请参阅 升级前准备 和 升级 global 集群。
- 阶段 2 — Kubernetes 和 OS 镜像:使用包含目标 Kubernetes 版本的新 Alauda OS 镜像替换节点。本文重点介绍
global集群的阶段 2。
在开始阶段 2 之前,请验证每个业务集群都处于目标 Distribution Version 的兼容版本矩阵范围内。超出范围的业务集群必须先进行升级。
通用前提条件
global集群已完成阶段 1(Distribution Version 升级)。- 已对
global集群执行并验证 etcd 备份。 - OS Support Matrix 中的目标行可用,并且其中的 Kubernetes 版本、CoreDNS 标签、etcd 标签和 Kube-OVN chart 已完成暂存,同时已暂存该版本发布的 Alauda OS 镜像。
- 保留之前的 machine 模板和 bootstrap 模板,直到阶段 2 验证完成。
- 制定包含控制平面滚动替换的维护窗口计划。
- 对于跨越多个 Kubernetes minor 版本的跨版本升级,预先暂存中间版本的 Core 镜像和 OS 镜像。请参阅跨版本升级准备。
操作步骤
安装后,管理 global 集群的 Cluster API 控制器将在 global 集群自身上运行。在本操作步骤中,使用 global kubeconfig 执行 kubectl 命令。
在 Kubernetes 1.35 中,kubelet 凭证验证可能会应用于节点上已存在的镜像。在升级到 Kubernetes 1.35 或更高版本的过程中,将 imagePullCredentialsVerificationPolicy: NeverVerify 添加到每个替换节点使用的 kubelet patch 中。在与 spec.version 相同的 KubeadmControlPlane 编辑中更新控制平面文件。对于 worker,使用更新后的 patch 创建新的 KubeadmConfigTemplate,并在与版本相同的编辑中切换 MachineDeployment.spec.template.spec.bootstrap.configRef.name。Kubernetes 1.34 或更早版本无需添加此参数。请参阅Kubernetes 1.35 所需的 kubelet patch。
步骤 1 — 升级 Kube-OVN
从目标 OS Support Matrix 行中读取 kube-ovn (chart) 值,然后按照通用的特定 provider 版本的 Kube-OVN 操作步骤执行,并将 <cluster-name> 设置为 global。
该操作步骤首先检查已安装的 provider 修订版本,然后选择受支持的新流程或旧流程,处理 v4.4 处的 Kube-OVN chart 名称边界,并验证 chart 名称、目标修订版本、已安装修订版本、阶段和条件。对于 provider 和 cni-kube-ovn AppRelease 检查,均使用 global kubeconfig。在所有通用验证标准通过之前,请勿开始控制平面替换。
步骤 2 — 更新 global 集群清单
更新 global 集群的 Cluster API 清单,使其引用新的 Alauda OS 镜像和 Kubernetes 版本。需要更新的清单字段因 provider 而异。
对于 DCS,请创建新的 Immutable Infrastructure 模板,而不要编辑正在运行的机器已引用的模板。
更新控制平面资源:
- 为目标镜像创建新的
DCSMachineTemplate,并将spec.template.spec.vmTemplateName设置为与目标 Kubernetes 版本匹配的 Alauda OS 模板。 - 将保留的节点本地数据(包括
/var/cpaas)保留在DCSIpHostnamePool.spec.pool[].persistentDisk中。不要将保留的磁盘移回DCSMachineTemplate。 - 将
KubeadmControlPlane.spec.version设置为目标 Kubernetes 版本。 - 从同一 OS Support Matrix 行中设置
KubeadmControlPlane.spec.kubeadmConfigSpec.clusterConfiguration中的 CoreDNS 和 etcd 镜像标签。 - 当目标为 Kubernetes 1.35 或更高版本时,在同一清单编辑中更新
KubeadmControlPlane.spec.kubeadmConfigSpec.files中的控制平面 kubelet patch。 - 将
KubeadmControlPlane.spec.machineTemplate.infrastructureRef.name指向新的DCSMachineTemplate。 - 当集群使用池管理的持久磁盘时,保留
KubeadmControlPlane.spec.rolloutStrategy.rollingUpdate.maxSurge: 0。
更新 worker 节点资源:
- 使用目标
vmTemplateName创建新的 workerDCSMachineTemplate。 - 将每个
MachineDeployment.spec.template.spec.version设置为目标 Kubernetes 版本。 - 当目标为 Kubernetes 1.35 或更高版本时,使用所需的 kubelet patch 创建新的 worker
KubeadmConfigTemplate,并将MachineDeployment.spec.template.spec.bootstrap.configRef.name指向它。 - 将每个
MachineDeployment.spec.template.spec.infrastructureRef.name指向新的 workerDCSMachineTemplate。 - 当 worker 池使用池管理的持久磁盘时,保留每个
MachineDeployment.spec.strategy.rollingUpdate.maxSurge: 0。
池管理的持久磁盘声明在 IP 池上,而不是 machine 模板上:
仅当 DCS 环境要求显式的精简配置值时,才使用 isThin。如果省略,provider 不会发送 isThin,DCS 将使用平台默认值。新持久卷将创建为独立的持久普通卷。
使用 IP 池状态确认,在滚动替换期间,保留的磁盘已从旧 VM 分离并挂载到替换 VM。
步骤 3 — 应用更新后的清单
将更新后的清单应用到 global 集群。
Cluster API provider 开始使用新镜像替换控制平面和 worker 节点。当设置了 maxSurge: 0 时,每个旧节点都会先被排空并删除,然后其替换节点才能重新使用相同的固定身份、IP 地址或保留的磁盘。
步骤 4 — 监控滚动替换
监控滚动替换,直到所有控制平面和 worker 节点都已完成替换。
当每个 Machine 报告新的 Kubernetes 版本和 Phase: Running,且 KubeadmControlPlane 针对新版本报告 Ready: True 时,升级即完成。
验证
滚动替换完成后,验证升级后的 global 集群是否健康。
所有节点都必须报告新的 Kubernetes 版本,ClusterVersionShadow 必须反映目标 Distribution Version,核心平台 Pod 必须处于 Running 状态。
恢复注意事项
不要将 Kubernetes 次要版本降级视为普通回滚。应根据发布阶段选择恢复路径:
- 尚未创建目标版本控制平面的
Machine:恢复之前的 Kube-OVN 状态和之前的清单值。在引入新的控制平面数据格式之前取消目标版本发布。 - 仅更改了机器模板或 OS 镜像,Kubernetes 次要版本未发生变化:将控制资源指回之前的模板,并让 Cluster API 执行另一次替换发布。保持 Kubernetes 次要版本不变。
- 目标 Kubernetes 次要版本上的控制平面
Machine已加入集群:不要将 Kubernetes、CoreDNS 或 etcd 修补回之前的次要版本。停止进一步发布,并在目标次要版本上向前修复;或者通过已验证的升级前 etcd 备份或 Global DR 操作恢复global集群。
如果已创建目标次要版本的控制平面 Machine,但它从未加入集群,请先恢复健康的 etcd 仲裁,并在更改清单之前确定是否可以安全地移除失败的替换节点。
对于使用池管理持久磁盘的 DCS 集群,请在回滚前确认磁盘状态:
首先,在删除或重新创建机器之前检查 DCSIpHostnamePool.status.persistentDiskStatus。不要删除 DCSIpHostnamePool.spec.pool[].persistentDisk 中列出的保留 DCS 卷。
对于阶段 1,请使用阶段 1 恢复期间还原 Kube-OVN中的 DCS 规则;具体操作取决于已安装的 provider 版本。在同一次要版本替换恢复期间返回之前的机器模板时,请保留 maxSurge: 0。如果目标次要版本的控制平面机器已加入,请保留目标基线,并使用向前恢复或备份还原。