升级 global 集群

升级路径

本页介绍适用于 global 集群的传统操作系统路径。如果你的 global 集群使用 Alauda OS,则 Kubernetes 步骤位于 Immutable Infrastructure 文档中——请参见 在 Immutable Infrastructure 上升级 global Cluster。本页描述的 Core、Aligned 和 Agnostic 步骤仍适用于 immutable-OS 集群;不同之处仅在于 Kubernetes 的发布方式。

由一个global集群和一个或多个 workload 集群组成。要将平台迁移到新的 ACP Distribution Version, 请先将 global 层升级到目标 Distribution Version,然后再将 workload 集群升级到相同的 Distribution Version。

集群升级使用基于 CVO 的工作流。典型的 global 集群升级包括制品准备、预检、升级请求以及状态观察。

在升级 global 集群之前,请确认每个 workload 集群都位于 Kubernetes 支持矩阵中目标版本的兼容版本范围内。此先决条件与第三方集群接入范围是分开的。

无论环境是否使用 global DR,此兼容版本先决条件都适用。global DR 会改变用于升级 global 层的操作步骤,但不会改变这样一个要求:在将 global 层升级到目标 Distribution Version 之前,workload 集群必须保持在兼容的 Kubernetes 版本范围内。

global 集群升级遵循本文档所述、经过验证的基于 upgrade.sh 的操作步骤。你可以通过 Web Console、更新 ClusterVersionShadow.spec.desiredUpdate,或使用带有 --cluster=global 的 ACP CLI 发起 global 集群升级。完整的 AC CLI 工作流和输出解释请参见 升级集群。完整的命令和标志语法请参见 AC CLI 管理员命令参考。

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

标准工作流

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

阶段时间发生的操作对集群的影响
1. 同步制品维护窗口之前的任意时间对于平台内置 Registry,upgrade.sh --only-sync-image 会上传 Core 制品以及你手动放入 plugins/ 中的 11 个包。对于外部 Registry,请在运行 upgrade.sh 之前手动上传目标 Core payload。在这两种情况下,violet 会发布窗口所需的其他 Aligned 和 Agnostic 包。无——镜像和目录条目已发布,但没有正在运行的插件发生变更;不会产生停机。
2. 预检维护窗口前 1–2 周upgrade.sh --preflight 会验证升级就绪性。在窗口开启之前解决所有阻塞项。无——只读验证。
3. 升级维护窗口期间upgrade.sh --skip-sync-image 部署或更新 cluster version 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.4 的 Aligned 包。请将 Pre-Upgrade Preparation 中列出的 11 个分别下载的包复制到解压后的 Core Package 的 plugins/ 目录中。对每个包运行一次以下命令:

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

在同步之前,确认该目录包含全部 11 个包:

ls -1 ./plugins/
从 ACP 4.1 升级

当源环境运行的是 ACP 4.1 时,不要用 violet push 替代此复制步骤。通过 violet 发布这些包可能会导致 Web Console 等自动安装应用在其 ACP 4.4 依赖可用之前就开始部署。

按照与 ProductBase.spec.registry.external 值相匹配的分支发布已暂存的 payload。

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

bash upgrade.sh --only-sync-image

--only-sync-image 会上传 Core 镜像以及你手动放入 plugins/ 中的包,而不会部署 cluster version operator 或更改正在运行的应用。CVO 会在稍后维护窗口内部署——请参见 部署 cluster version 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用于部署或更新 cluster version operator。
插件制品plugins/*.tgz在需要插件制品时,由升级计划使用。

对于来自 ACP Upgrade to v4.4 的 11 个 Aligned 应用,始终将这些包暂存到 plugins/ 中。内置 Registry 路径会通过 upgrade.sh --only-sync-image 发布它们;外部 Registry 路径会通过 res/upload.sh all 发布它们。CVO 只会升级已经安装的应用;发布某个未安装应用的包,并不会安装该应用。

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

包组发布路径要求
其他 Aligned 集群插件对 global 层执行 violet push对每个已安装且不属于 ACP Upgrade to v4.4 的插件都必须执行。
其他 Aligned operator对 global 层以及安装了该 operator 的每个 workload 集群执行 violet push在升级运行该 operator 的每个集群之前都必须完成。
Agnostic 集群插件和 operator对计划升级它们的集群执行 violet pushCVO 不要求;在启动它们各自的 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 窗口已经过去,而你发现某个 workload 集群缺少 operator 包,仍然可以在 workload 升级之前将其推送到该 workload 集群——请参见 升级 workload 集群。

WARNING

在请求升级之前,请确保目标包对集群中安装的每个 Aligned 插件都可用。来自 ACP Upgrade to v4.4 的应用使用 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 地址。
--username / --password指定 Registry 凭据。

制品验证会将 plugins/ 中存在的每个包与目标 Core Package 期望的版本进行比较,并在版本不匹配时失败。它不会验证集合是否完整:未暂存的包不会被检查,运行会继续。请在依赖验证成功之前,先根据 Download ACP Upgrade to v4.4 确认这 11 个包。

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 自定义资源已存在

在从未部署过 cluster version operator 的集群上,--preflight 还不能运行,并会失败并报出:

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

该消息提到了一个 API group,但根因是顺序问题,而不是版本不匹配:ProductManifest 自定义资源定义和目标版本的 ProductManifest 都是由 部署 cluster version operator 创建的。请先运行该步骤,然后再运行预检。在之前的升级已经使用过 CVO 工作流的集群上,这些资源已经存在,因此在制品同步之后的任何时间都可以运行预检。

预检会返回两部分:

输出目的
Summary显示总体结果、当前版本、目标版本和目标镜像。
Checks显示每个单独验证项的结果。

默认检查集包括:

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

处理预检阻塞

何时: 在维护窗口之前,一旦预检报告阻塞项就立即处理。

在经过定制的环境中,第一次预检就完全通过并不常见。应将解决阻塞项视为准备阶段的一部分,而不是例外——这也是为什么预检要提前一到两周运行。

如果任一检查未通过,不要打开维护窗口。请使用 升级故障排查 逐一解决阻塞项,其中包括:

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

部署 cluster version operator

何时: 在维护窗口开始时。

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

bash upgrade.sh --skip-sync-image

这会部署或更新 cluster version 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'

按制品逐项输出的信息用于诊断,不要求为空。目标 manifest 可以包含未安装、Agnostic 或可选条目,这些条目未处于 Ready 状态是合理的。请将输出与已安装的 Core 和 Aligned 清单进行比较。对于已安装的 Aligned ModulePlugin,当其 channel 不处于 Ready 状态时,请检查匹配的目标 ModulePluginConfig:

kubectl get modulepluginconfig <modulepluginconfig-name> -o yaml

使用目标 ProductManifest 中的组件名称和 channel tag,或者使用 ClusterVersionShadow 错误中报告的名称,来定位 ModulePluginConfig。此名称中的组件版本不一定就是 ACP Distribution Version。不要仅将 artifactStatus: Absent 视为 Registry manifest 缺失的证据;应结合 ModulePluginConfig 条件及其 .spec.image,区分 manifest 缺失、认证问题、CA 问题、网络问题或包内容问题。

请求升级

在 cluster version 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。该步骤会列出每一项,并在警告 There are the following personalized configurations in your environment, please confirm with the technical support staff whether you need to delete or adjust, otherwise, your upgrade may fail! 下,以只读 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

确认对话框打开时,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. 导航到 Marketplace > Cluster Plugins 以升级 Agnostic 集群插件,或导航到 operator 工作流以升级 Agnostic operator。
  3. 选择目标插件或 operator 并触发升级。Marketplace 升级流程会读取之前通过 violet 推送的包。

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

验证升级

在集群达到目标版本且已处理正在使用的 Agnostic 插件后,请完成 升级验证。

相关文档