升级集群

AC CLI 提供管理员命令,用于准备升级元数据、查看集群升级状态,以及请求集群升级。

当你需要执行以下操作时,请使用这些命令:

  • 为目标版本创建一个 ProductManifest
  • 检查当前集群版本和可用更新
  • 请求升级到最新版本
  • 请求升级到特定版本
  • 查看预检结果和升级执行进度

开始之前

在 ACP 中,availableUpdates 不是你手动维护的静态列表。升级控制器必须先看到目标版本的 ProductManifest,然后才能为集群发布可用的升级目标。

如果你没有先创建 ProductManifest,常见现象包括:

  • ac adm upgrade 不显示 availableUpdates
  • ac adm upgrade --to-latest 立即失败
  • 只能使用 --allow-explicit-upgrade 手动请求某个版本

推荐流程如下:

  1. 确定要发布或升级到哪个版本。
  2. 为该版本创建一个 ProductManifest
  3. 等待升级元数据被处理。
  4. 运行 ac adm upgrade,并确认 availableUpdates 已填充。
  5. 请求升级。

前提条件

在运行与升级相关的命令之前,请确保:

  • 你已登录到 ACP 平台。
  • 你具有集群管理员或等效权限。
  • 你知道目标集群名称。如果省略,ac adm upgrade 默认使用 global
  • 目标环境已经安装了 ProductManifest CRD 和升级控制器。

你可以先确认当前上下文:

ac config current-context

当前上下文仍然决定 AC 在该命令中使用哪些凭据和端点。

  • 对于 ac adm upgradeac adm upgrade status,目标集群仍通过 --cluster 显式选择,默认值为 global
  • 对于 ac adm release import-manifest,AC 会先检查当前上下文的 REST URL。如果它指向 ACP workload 路径,AC 会自动将请求重写为匹配的 global 路径。如果当前上下文不是 ACP workload/global URL,则 AC 按原样使用当前上下文,并且不要求 kubeconfig 会话扩展。

如有需要,请先切换到另一个 ACP 会话:

# Switch to another ACP session
ac config use-session production

创建 ProductManifest

使用以下命令为目标版本创建一个 ProductManifest

ac adm release import-manifest --version 4.20.0

此命令会创建控制器所需的最小升级元数据对象:

  • metadata.name 使用带前缀 v 的版本名,例如 v4.20.0
  • spec.version 使用你传入的版本,例如 4.20.0

如果你希望命令一直等待到对象变为 Ready,请添加 --wait

ac adm release import-manifest --version 4.20.0 --wait

你还可以覆盖等待超时时间:

ac adm release import-manifest --version 4.20.0 --wait --timeout=10m

命令行为:

  • --version 是必需的。
  • 如果 ProductManifest 不存在,AC 会创建它。
  • 如果 ProductManifest 已存在且版本相同,命令会成功且不会修改它。
  • 如果 ProductManifest 已存在但版本不同,命令会失败,并且不会覆盖现有对象。
  • 默认情况下,命令不会等待 Ready。只有显式传入 --wait 时才会等待。

查看升级状态和可用更新

创建 ProductManifest 之后,使用以下命令查看默认 global 集群的升级摘要:

ac adm upgrade

该命令通常会显示:

  • 当前集群版本
  • 期望版本(如果已经请求了升级)
  • 当前可用更新列表
  • 整体升级条件

当你想快速回答以下问题时,可以使用它:

  • 集群当前正在运行哪个版本?
  • 是否已经请求了目标版本?
  • 现在是否有新的升级目标可用?
  • 集群当前是 ReadyReconciling 还是 Degraded

要查询特定集群,请添加 --cluster

ac adm upgrade --cluster=workload-a

如果你刚刚创建了一个 ProductManifest,但仍然看不到 availableUpdates,控制器可能仍在处理该元数据。稍等片刻后再次运行 ac adm upgrade

升级到最新版本

availableUpdates 存在时,可使用以下命令请求升级到最新版本:

ac adm upgrade --to-latest

AC 会从 availableUpdates 中选择最高版本并提交升级请求。

--to-latest 是一个布尔标志,默认值为 false,这意味着:

  • 如果不指定它,AC 的行为等同于使用了 --to-latest=false
  • 如果只单独指定 --to-latest,AC 会将其视为 true
  • 你也可以显式写成 --to-latest=true--to-latest=false

如果不存在任何 availableUpdates,命令会失败,并且不会提交新的目标版本。

请求升级后,再次查看摘要:

ac adm upgrade

升级到特定版本

如果你想升级到某个特定版本,请运行:

ac adm upgrade --to=<version>

示例:

ac adm upgrade --to=4.20.0

典型场景包括:

  • 你不想使用最新可用版本
  • 你正在遵循发布流程中已批准的发布目标
  • 你想重试某个已知目标版本

默认情况下,请求的版本必须已经出现在 availableUpdates 中。否则,命令会失败。

如果你确实需要请求一个未列在 availableUpdates 中的版本,请添加:

ac adm upgrade --to=<version> --allow-explicit-upgrade

--allow-explicit-upgrade 的默认值为 false

  • 如果不指定它,AC 的行为等同于使用了 --allow-explicit-upgrade=false
  • 如果只单独指定 --allow-explicit-upgrade,AC 会将其视为 true
  • 你也可以显式写成 --allow-explicit-upgrade=true--allow-explicit-upgrade=false

示例:

ac adm upgrade --to=4.20.0 --allow-explicit-upgrade=true

此标志只会更改客户端侧校验。升级控制器及其预检检查仍然会决定所请求的目标是否可以继续。

查看详细升级状态

如果你需要更深入的诊断,请运行:

ac adm upgrade status

要查看特定集群:

ac adm upgrade status --cluster=workload-a

ac adm upgrade 相比,此命令会展开显示:

  • 当前版本、期望版本和整体条件的摘要
  • 当前升级目标的预检结果
  • 升级阶段和操作进度

预检结果

Preflight 用于描述升级是否可以进入执行阶段。每项检查通常包含:

  • 检查名称
  • 重入策略
  • 状态
  • 原因
  • 消息

状态解释如下:

  • Passed:检查已通过。
  • Retry:检查暂时还不能给出最终结果。请等待后再次检查。
  • Failed:存在阻塞条件,必须先处理。

如果当前还没有预检数据,请将其视为“暂时还没有结果”,而不是“所有检查都已通过”。

如果 AdminAckRequired 处于 Failed 状态,则当前升级目标需要管理员确认门禁。请查看该门禁,完成所需的手动检查,写入确认信息,然后再次运行 ac adm upgrade status --cluster=<cluster>,以确认检查通过。

升级阶段

当升级进入执行阶段后,状态输出会显示阶段和操作进度。

阶段输出可能包含:

  • 阶段名称
  • 优先级
  • 阶段

操作输出可能包含:

  • 操作名称
  • 动作
  • 当前版本
  • 目标版本
  • 阶段

阶段状态解释如下:

  • Pending:该阶段尚未开始。
  • Running:该阶段正在进行中。
  • Finished:该阶段已完成。

如果当前还没有阶段数据,则很可能升级尚未进入执行阶段。

常见信号和故障排查

阅读升级状态时,请参考以下指南:

  • Ready 通常表示集群已达到期望状态。
  • Reconciling 通常表示集群仍在应用当前的升级请求。
  • Degraded 通常表示升级被阻塞或发生了错误。

ac adm upgrade 没有显示任何 availableUpdates 时,先检查以下事项:

  1. 是否已创建目标版本的 ProductManifest
  2. 如果使用了 --waitProductManifest 是否已达到 Ready=True
  3. 控制器是否有足够时间处理新的元数据?

ac adm upgrade 显示了期望目标,但升级没有继续推进时:

  1. 运行 ac adm upgrade status
  2. 检查是否有任何预检项处于 RetryFailed
  3. 查看升级阶段是否已经开始。

ac adm upgrade status --cluster=<cluster> 显示 AdminAckRequired 处于 Failed 状态时:

  1. 从 global 集群检查发行版提供的门禁:

    kubectl -n cpaas-system get configmap admin-gates -o yaml
  2. 如果目标发行版是 ACP 4.4 或更高版本,且将集群升级到 Kubernetes 1.35 或更高版本,并且 admin-gates 报告了一个节点就绪确认键,请在目标集群中的每个生产节点上完成 Kubernetes 1.35 or later node readiness checks。为满足此要求而引入的第一个门禁是 ack-4.4-kubernetes-1.35-kernel-update;请将其视为示例,因为后续目标发行版可能提供不同的键。

  3. 完成门禁要求后,从 admin-gates 复制适用的键,并将其写入 global 侧的 admin-acks ConfigMap:

    ACK_KEY='<key-from-admin-gates>'
    kubectl -n cpaas-system patch configmap admin-acks --type merge \
      -p "{\"data\":{\"${ACK_KEY}\":\"true\"}}"
  4. 确认预检通过:

    ac adm upgrade status --cluster=<cluster>

当升级已经在进行中时:

  1. 运行 ac adm upgrade status
  2. 查看当前阶段和操作的状态。
  3. 比较当前版本与目标版本。

示例流程

# 1. Create a ProductManifest for the target version
ac adm release import-manifest --version 4.20.0 --wait

# 2. Review the upgrade summary for the default global cluster
ac adm upgrade

# 3. Review the summary for a specific cluster
ac adm upgrade --cluster=workload-a

# 4. Request an upgrade to the latest available version
ac adm upgrade --to-latest

# 5. Review detailed status
ac adm upgrade status --cluster=workload-a

# 6. Request an upgrade to a specific version
ac adm upgrade --cluster=workload-a --to=4.20.0

# 7. Request a version outside availableUpdates when you explicitly intend to do so
ac adm upgrade --cluster=workload-a --to=4.20.0 --allow-explicit-upgrade