升级 global 集群的分发版本

升级路径

此页面适用于两种节点操作系统。在非 Alauda OS global 集群上,此操作步骤还会原位升级 Kubernetes,并在操作完成后完成 global 集群升级。如果您的 global 集群使用 Alauda OS,请先完成此页面中的操作,然后继续执行 在 Alauda OS 上升级 Kubernetes ,通过替换节点来推出 Kubernetes。

由一个global集群和一个或多个业务集群组成。要将平台迁移到新的 ACP 分发版本,请先将 global 层升级到目标分发版本,然后将业务集群升级到相同的分发版本。

集群升级使用基于 CVO 的工作流。典型的 global 集群升级包括工件准备、升级前检查、升级请求和状态观察。

升级 global 集群前,请确认每个业务集群都处于 Kubernetes 支持矩阵 中目标版本的兼容版本范围内。此先决条件与第三方集群接入范围相互独立。

无论环境是否使用 global DR,都必须满足此兼容版本先决条件。global DR 会改变升级 global 层所使用的操作步骤,但不会改变以下要求:在将 global 层升级到目标分发版本之前,业务集群必须保持在兼容的 Kubernetes 版本范围内。

Global 集群升级遵循本页中记录的、经过验证的基于 upgrade.sh 的操作步骤。您可以从 Web Console 请求 global 集群升级,也可以通过更新 ClusterVersionShadow.spec.desiredUpdate 或使用带有 --cluster=global 的 ACP CLI 请求升级。有关完整的 AC CLI 工作流和输出解读,请参阅升级集群。有关完整的命令和标志语法,请参阅 AC CLI 管理员命令参考。

如果环境使用 global DR,请按照在 DR 环境中升级 Global 集群操作。否则,请按照下面的标准工作流操作。

标准工作流

global 集群升级会按照时间线分阶段执行。大部分工作会在维护窗口之前完成,从而使维护窗口本身保持简短且可预测:

阶段时间发生的操作对集群的影响
1. 同步工件窗口开始前的任意时间对于平台内置 Registry,upgrade.sh --only-sync-image 会上传 Core 工件以及您手动放置在 plugins/ 中的十一个软件包。对于外部 Registry,请在运行 upgrade.sh 前手动上传目标 Core payload。在这两种情况下,violet 都会发布窗口所需的其他 Aligned 和 Agnostic 软件包。无 — 会发布镜像和目录条目,但不会更改正在运行的插件;不会停机。
2. 升级前检查窗口开始前 1–2 周upgrade.sh --preflight 会验证升级准备情况。请在窗口开始前解决所有阻塞项。无 — 只读验证。
3. 升级维护窗口期间upgrade.sh --skip-sync-image 会部署或更新集群版本 operator(CVO);然后请求并观察升级。集群将完成升级。

阶段 1 和阶段 2 不会更改集群状态 — 请尽早运行这些阶段,以便维护窗口中只包含阶段 3。对于小型或实验室环境,也可以运行单个 bash upgrade.sh,同时执行同步和 CVO 部署,但生产环境的维护窗口通常会将这两个阶段分开。

同步升级工件

时间:维护窗口前的任意时间。此步骤会将工件上传到 Registry,不会更改集群状态。

首先,记录已配置的 Registry 地址,并确定平台使用的是内置 Registry 还是外部 Registry:

kubectl get productbase base \
  -o jsonpath='{.spec.registry.address}{"\t"}{.spec.registry.external}{"\n"}'

对于平台内置 Registry,第二个值为 false;对于外部 Registry,第二个值为 true。将目标 Aligned 软件包复制到 plugins/ 后,再选择发布命令。

Core Package 不包含 ACP Upgrade to v4.5 中的 Aligned 软件包。将升级前准备中列出的十一个单独下载的软件包复制到解压后的 Core Package 的 plugins/ 目录中。对每个软件包分别运行以下命令:

cp <path-to-upgrade-extension-package> ./plugins/

同步前,请确认该目录包含全部十一个软件包:

ls -1 ./plugins/

根据 ProductBase.spec.registry.external 的值,按照相应分支发布暂存的 payload。

对于平台内置 Registry(false),请在解压后的 Core Package 目录中以仅同步模式运行 upgrade.sh:

bash upgrade.sh --only-sync-image

--only-sync-image 会上传 Core 镜像以及您手动放入 plugins/ 的软件包,但不会部署集群版本 operator,也不会更改正在运行的应用。CVO 将在维护窗口内的后续步骤中部署 — 请参阅部署集群版本 operator。

对于外部 Registry(true),不要将 --only-sync-image 作为已发布的证明。upgrade.sh 会自动跳过镜像同步。请从目标 Core Package 的 installer/ 目录开始,按照准备目标版本 payload,同时运行 res/upload.sh all 和 res/upload.sh necessary。两种模式可以按任意顺序运行,但都必须成功。

所选发布路径会使基于 CVO 的工作流所需的工件可用,包括:

类型内容用途
产品镜像product-image用于在 ProductManifest 和 CVO 中解析目标版本和镜像。
CVO 镜像cluster-version-operator用于部署或更新集群版本 operator。
插件工件plugins/*.tgz在升级计划需要插件工件时使用。

对于 ACP Upgrade to v4.5 中的十一个 Aligned 原生应用,始终将软件包暂存到 plugins/。内置 Registry 路径会通过 upgrade.sh --only-sync-image 发布这些软件包;外部 Registry 路径则通过 res/upload.sh all 发布。CVO 仅会升级已安装的原生应用;为未安装的原生应用发布软件包并不会安装该应用。

对于从 violet list 清单下载的其他软件包,请使用 violet push:

软件包组发布路径要求
其他 Aligned 集群插件violet push 到 global 层级对于每个不属于 ACP Upgrade to v4.5 的已安装插件都是必需的。
其他 Aligned operatorviolet push 到 global 层级以及安装了该 operator 的每个业务集群在升级运行该 operator 的每个集群之前都必须完成。
Agnostic 集群插件和 operatorviolet push 到计划升级它们的集群对 CVO 可选;但在开始单独的 Marketplace 或 operator 升级前必须完成。
# Publish another cluster plugin to the global tier
violet push <path-to-other-cluster-plugin-package> \
  --platform-address "https://<your-platform-domain>" \
  --platform-token "<platform_token>"

# Publish another operator to global and each workload cluster that runs it
violet push <path-to-other-operator-package> \
  --platform-address "https://<your-platform-domain>" \
  --platform-token "<platform_token>" \
  --clusters "global,<workload-cluster-1>,<workload-cluster-2>"

建议在 global 窗口期间,将每个 operator 软件包推送到每个 集群。如果 global 窗口已结束,而您发现某个业务集群缺少 operator 软件包,仍可在升级该业务集群之前将软件包推送到该集群 — 请参阅升级业务集群。

WARNING

请求升级前,请确保目标软件包对集群上已安装的每个 Aligned 插件都可用。对于 ACP Upgrade to v4.5 中的原生应用,请使用 upgrade.sh;对于其他 Aligned 软件包,请使用 violet。同步软件包不会安装当前未安装的应用。对于已安装的 Aligned 集群插件,CVO 要求对应的目标 ModulePluginConfig 处于 Ready 状态;否则,CVO 无法构建升级计划,会通过 ClusterVersionShadow 报告错误,并重试现有请求。已安装的 Aligned operator 需要其目录中对应的目标 InstallPlan。

Registry 的行为取决于环境配置方式:

场景行为
已指定 --registry直接使用提供的 Registry。
未指定 --registry从 ProductBase.spec.registry.address 读取 Registry 地址。
平台内置 Registry使用 global VIP 重新构建访问地址。
外部 Registry自动设置 SKIP_SYNC_IMAGE=true;目标 payload 必须已通过规范的目标版本 payload 操作步骤上传。
需要上传镜像,但未提供凭据从 cpaas-system/registry-admin Secret 中读取 username 和 password。

当目标 Registry 不是平台默认 Registry 时,请添加 Registry 参数:

参数用途
--registry指定目标 Registry 地址。
--username / --password指定 Registry 凭据。

工件验证会将 plugins/ 中存在的每个软件包与目标 Core Package 预期的版本进行比较,若版本不匹配则失败。它不会验证软件包集合是否完整:从未暂存的软件包不会被检查,运行会继续。请先根据下载 ACP Upgrade to v4.5确认十一个软件包,再依赖验证成功的结果。

WARNING

镜像和插件同步完成之前,请勿开启维护窗口。

运行升级前检查之前,请确认 Registry 配置仍然正确:

kubectl get productbase base \
  -o jsonpath='{.spec.registry.address}{"\t"}{.spec.registry.external}{"\n"}'

将所选发布命令成功完成,以及 Registry 管理界面或 API 中的相关信息,作为阶段 1 的证据。请确认预期的目标仓库和标签均已存在,并将已发布的 Extension 集合与导出到 apps.yaml 的已安装清单进行比较。不要将 ProductBase.status.artifacts 作为目标版本的零输出门槛:它表示当前目录,其中可以合理包含可选或未安装软件包的 Absent 条目。

运行升级前检查

时间:维护窗口前 1–2 周,以便在窗口开启前有时间解决所有阻塞项。

以升级前检查模式运行 upgrade.sh:

bash upgrade.sh --preflight

升级前检查为只读操作 — 它会验证升级准备情况,不会更改集群状态。

升级前检查要求 CVO 自定义资源已存在

对于从未部署过集群版本 operator 的集群,--preflight 尚无法运行,并会报错:

resolve desired release: get ProductManifest for version "<target-version>": no matches for kind "ProductManifest" in version "config.alauda.io/v1"

该消息提到了一个 API 组,但原因是操作顺序不正确,而不是版本不匹配:ProductManifest 自定义资源定义和目标版本 ProductManifest 均由部署集群版本 operator创建。请先执行该步骤,然后再运行升级前检查。对于之前已使用 CVO 工作流完成升级的集群,这些资源已存在,同步工件后即可随时运行升级前检查。

升级前检查会返回两部分内容:

输出用途
Summary显示总体结果、当前版本、目标版本和目标镜像。
Checks显示各项验证的结果。

默认检查集包括:

  • ResourcePatchUpgradeable
  • ClusterVersionUpgradeable
  • AdminAckRequired
  • VersionUpgradePath
  • KubernetesVersionSupported
  • DockerRuntimeUnsupported
  • ClusterRunning
  • ClusterModuleStable
  • ControlPlaneStaticPodsPresent
  • CustomEtcdBackupCronJobsAbsent
  • CRIUpgradePodsAbsent
  • ModuleInfoStable
  • PlatformLicense

处理升级前检查阻塞项

时间:维护窗口前;升级前检查一旦报告阻塞项,就应立即处理。

在经过定制的环境中,首次运行升级前检查就全部通过并不常见。请将解决阻塞项视为准备阶段的一部分,而非例外情况 — 这正是要提前一到两周运行升级前检查的原因。

如果任何检查未通过,请勿开启维护窗口。请根据升级故障排除解决每个阻塞项,其中涵盖:

不要强行绕过失败的检查进行升级。VersionUpgradePath、KubernetesVersionSupported 和 AdminAckRequired 是受支持升级路径本身的门槛。如果无法解决阻塞项,请在继续之前联系技术支持。

部署集群版本 operator

时间:维护窗口开始时。

以跳过同步模式运行 upgrade.sh。由于已在同步升级工件中上传工件,因此跳过同步:

bash upgrade.sh --skip-sync-image

此操作会部署或更新集群版本 operator(CVO),并完成剩余准备工作。下一步请求升级后,CVO 将驱动 Core 和 Aligned 插件升级。

命令完成后,请检查目标 ProductManifest,再请求升级:

kubectl get productmanifest v<target-version> \
  -o jsonpath='{range .status.conditions[*]}{.type}{"\t"}{.status}{"\t"}{.reason}{"\t"}{.message}{"\n"}{end}'

kubectl get productmanifest v<target-version> -o json | jq -r '
  .status.artifacts[] as $artifact
  | $artifact.channels[]
  | select(.artifactStatus != "Ready")
  | [$artifact.name, .channel, .tag, .artifactStatus]
  | @tsv'

每个工件的输出用于诊断,不要求为空。目标清单可能包含可选、Agnostic 或未安装的条目,这些条目未处于 Ready 状态也可能是正常情况。请将输出与已安装的 Core 和 Aligned 清单进行比较。对于已安装的 Aligned ModulePlugin,如果对应的目标 ModulePluginConfig 所属的 channel 未处于 Ready 状态,请检查该资源:

kubectl get modulepluginconfig <modulepluginconfig-name> -o yaml

请使用目标 ProductManifest 中的组件名称和 channel 标签,或 ClusterVersionShadow 错误中报告的名称,来识别 ModulePluginConfig。此名称中的组件版本不一定是 ACP Distribution Version。不要仅凭 artifactStatus: Absent 就认定 Registry manifest 缺失;请使用 ModulePluginConfig 条件及其 .spec.image,以区分 manifest 缺失与身份验证、CA、网络或软件包内容问题。

请求升级

部署集群版本 operator 后,可通过以下任一入口请求升级。这些入口的功能相同;请选择符合您运维模式的入口。

平台在 Web Console 中提供两个集群管理界面。Web Console 是平台内置的界面,也是默认入口。Web Console (Fleet Essentials) 是较新的集群管理界面,通过独立的集群插件提供,必须先安装才能使用。

Web Console
Web Console (Fleet Essentials)
ACP CLI
kubectl

这是内置的集群管理界面。每个 平台都提供此界面,除平台本身外无需安装任何组件。

请求升级需要对目标集群的 ClusterVersionShadow 和 ResourcePatch 资源具有更新权限。

  1. 在左侧导航栏中,点击 Clusters > Clusters,然后点击 global 集群。

  2. 打开 Functional Components 选项卡。

    该选项卡会列出每个组件及其 Status 和 Version。有可用新版本的组件会标记为 Upgradeable。无法升级到新版本的组件则会显示阻止原因,页面还会显示与新版本不兼容的组件。

  3. 点击 Upgrade。

    没有可升级版本(No upgradable version)、升级已在运行(Upgrading)或集群运行状况不正常(Cluster Abnormality)时,该按钮处于禁用状态。将鼠标悬停在按钮上即可查看原因。

  4. 在 Personalized Configuration Confirmation 步骤中,查看列出的配置,然后点击 Acknowledge。

    仅当集群包含个性化配置时才会显示此步骤,包括自定义的 ModuleInfo、自定义的 ClusterModule 或 ResourcePatch。该步骤会列出每个配置项,并以只读 YAML 的形式显示所选配置项的覆盖值,警告内容为:您的环境中存在以下个性化配置,请与技术支持人员确认是否需要删除或调整,否则升级可能会失败!

    当集群不包含个性化配置时,不会显示此步骤,页面会直接打开下一步所述的确认表单。

  5. 在 Confirm Component Upgrade 步骤中,查看 Current Version 和 Target Version。

    目标版本是 ClusterVersionShadow.status.availableUpdates 的第一项。该版本由已为集群准备的升级工件确定,无法在此界面中手动选择。

  6. 点击 Upgrade。

  7. 在 Are you sure you want to upgrade the cluster version? 对话框中,设置 Maintenance mode,然后点击 Upgrade 提交请求。

默认情况下,此对话框会启用维护模式

确认对话框打开时,Maintenance mode 已启用。维护模式启用期间,非平台管理员用户将被限制访问平台功能,并会看到 Platform maintenance announcements 中的文本。启用开关时必须填写公告,且公告长度限制为 200 个字符。如果变更窗口不要求限制访问,请在提交前关闭该开关。该开关会写入平台范围的维护模式设置,因此变更窗口结束后请再次检查该设置。

提交请求后,页面会返回 Functional Components 选项卡,并显示 The upgrade has been initiated. It may take 5~10 minute for the status to update.。点击组件 Status 列中的放大镜图标,可以跟踪该组件的升级进度。

观察执行情况

使用以下命令检查总体状态:

kubectl get cvsh -n cpaas-system

重要状态字段:

字段用途
status.conditions总体状态入口。
status.preflight.observedAt最近一次预检运行的时间。
status.preflight.checks每个预检项目的详细结果。
status.current当前已应用的版本和镜像。
status.desired正在协调的目标版本和镜像。
status.history升级历史记录,最新记录在前。
status.stages升级阶段及每个阶段的执行状态。

请先关注以下条件:

条件解释
PreflightReadyTrue 表示预检已通过。
ReadyTrue 表示集群已达到所需版本。
ReconcilingTrue 表示升级仍在运行。
StalledTrue 表示升级已被阻止,需要进行干预。

如果 Stalled=True,请参阅升级故障排除。要观察单个插件或 operator 模块,请读取其 ModuleInfo:

# Current version, target, next available version, and phase per installed module on this cluster
kubectl get moduleinfo -l cpaas.io/cluster-name=global \
  -o custom-columns='MODULE:.metadata.labels.cpaas\.io/module-name,CURRENT:.status.version,TARGET:.spec.version,NEW:.status.availableVersions[0].version,PHASE:.status.phase'

# Conditions and any block reasons for one module
kubectl get moduleinfo <name> \
  -o jsonpath='{range .status.conditions[*]}{.type}{"\t"}{.status}{"\t"}{.reason}{"\t"}{.message}{"\n"}{end}'

当模块的 status.phase 为 Running 且 status.version 等于目标版本时,表示该模块已达到目标版本。

从 Marketplace 升级 Agnostic 插件

CVO 驱动 Core 和 Aligned 插件。Agnostic 插件不在 CVO 的范围内,集群达到目标 Distribution Version 后,必须单独升级这些插件。每个 Agnostic 插件是否需要升级取决于其自身的 Kubernetes 兼容性 — 请参阅插件的 release notes,了解其与目标 Kubernetes 版本的兼容性。

对于 global 集群上正在使用的每个 Agnostic 插件:

  1. 在 Web Console 中切换到 Administrator 视图。
  2. 对于 Agnostic 集群插件,导航到 Marketplace > Cluster Plugins;对于 Agnostic operator,导航到 operator 操作流程。
  3. 选择目标插件或 operator 并触发升级。Marketplace 升级流程会读取之前使用 violet 推送的软件包。

如果在升级前跳过了推送 Agnostic 插件,而 Marketplace 未提供目标版本,请先完成 violet push 步骤,然后重试 Marketplace 升级。

验证升级

集群达到所需版本并处理完正在使用的 Agnostic 插件后,请完成升级验证。如果 global 集群使用 Alauda OS,请先完成 在 Alauda OS 上升级 Kubernetes。

相关文档