升级 global 集群

升级路径

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

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

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

在升级 global 集群之前,请确认每个业务集群都处于 Kubernetes Support Matrix 中目标 release 的 Compatible Versions 范围内。此先决条件与第三方集群接入范围是分开的。

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

global 集群升级遵循本页记录的经过验证的基于 upgrade.sh 的操作步骤。你可以从 Web Console 请求 global 集群升级,也可以通过更新 ClusterVersionShadow.spec.desiredUpdate,或者使用带有 --cluster=global 的 ACP CLI。有关完整的 AC CLI 工作流和输出解释,请参见 Upgrading Clusters。有关完整的命令和标志语法,请参见 AC CLI Administrator Command Reference

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

标准工作流

global 集群升级会沿时间线分阶段进行。大部分工作会在维护窗口之前完成,因此窗口本身会保持较短且可预测:

阶段时间发生的操作集群影响
1. 同步工件在窗口之前的任何时间对于平台内置 Registry,upgrade.sh --only-sync-image 会上传 Core 工件以及你手动放入 plugins/ 中的 11 个包。对于外部 Registry,请在运行 upgrade.sh 之前手动上传目标 Core 负载。在这两种情况下,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 值匹配的分支发布已暂存的负载。

对于平台内置 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/ 目录中,按照 准备目标版本负载 同时运行 res/upload.sh allres/upload.sh necessary。这两种模式可以按任意顺序运行,但都必须成功。

选定的发布路径会提供基于 CVO 的工作流所需的工件,包括:

类型内容目的
Product 镜像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 operators对 global 层以及安装了该 operator 的每个业务集群执行 violet push在升级每个运行该 operator 的集群之前必须完成。
Agnostic 集群插件和 operators对你计划升级它们的集群执行 violet 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.4 的应用请使用 upgrade.sh,其他 Aligned 包请使用 violet。同步一个包不会安装当前未安装的应用。对于已安装的 Aligned 集群插件,CVO 需要匹配的目标 ModulePluginConfig 处于 Ready;否则,CVO 无法构建升级计划,会通过 ClusterVersionShadow 报告错误,并重试现有请求。已安装的 Aligned operator 则需要其目录中匹配的目标 InstallPlan

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

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

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

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

如果已知工件校验是多余的,可以添加 --skip-check-artifacts 来绕过它。

WARNING

在镜像和插件同步完成之前,不要打开维护窗口。

在运行预检之前,请确认 Registry 配置仍然正确:

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

将所选发布命令成功完成的结果,以及 Registry 管理界面或 API 作为阶段 1 的证据。确认预期的目标仓库和 tag 已存在,并将已发布的 Extension 集与导出的已安装清单 apps.yaml 进行比较。不要将 ProductBase.status.artifacts 作为零输出的目标版本门控:它代表当前目录,且对于可选或未安装的包,合法地可能包含 Absent 条目。

运行预检

时间: 维护窗口前 1–2 周,这样在窗口打开之前就有时间解决任何阻塞项。

以预检模式运行 upgrade.sh

bash upgrade.sh --preflight

预检是只读的——它会验证升级就绪状态,但不会更改集群状态。

预检返回两部分:

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

默认检查集包括:

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

如果任何检查未通过,请在维护窗口之前停止,并按照 升级故障排查 处理。不要通过禁用版本、Kubernetes 支持或管理员确认检查来强制执行不受支持的升级。

部署 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
ACP CLI
kubectl

当目标版本对集群可用后,使用此入口。请求采用两步流程:

  • Step 1 中,查看 RPCH 列表。
  • 点击 Acknowledge,继续到 Step 2
  • Step 2 中,查看 Current VersionTarget Version。此时页面不会显示插件列表或警告面板。
  • 目标版本由已准备好的升级工件决定,无法在 Web Console 中手动选择。
  • 点击 Start Upgrade
  • 在对话框中确认操作。
  • 确认后,页面会显示升级请求已提交,操作进入进行中状态。

观察执行情况

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

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.phaseRunningstatus.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 集群插件,或者进入 Agnostic operator 的工作流。
  3. 选择目标插件或 operator 并触发升级。Marketplace 升级流程会读取此前通过 violet 推送的包。

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

验证升级

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

相关文档