从旧版插件迁移 Volume Snapshot 组件

在 ACP 4.4 中,新集群不再需要单独安装 Snapshot Management 集群插件。如果现有的业务集群已经安装了旧版插件,请使用此操作步骤将该集群迁移到 ACP 4.4 的 snapshot 组件,同时不删除现有的 snapshot 资源。

适用范围

仅当满足以下所有条件时,本操作步骤才适用:

  • 业务集群使用的是旧版 Snapshot Management 集群插件。
  • 你要将该业务集群迁移到 ACP 4.4 或更高版本。
  • 你希望在删除旧版插件后由 ACP 管理集群级 snapshot 组件。

如果其他平台或管理员管理的组件仍在提供 Snapshot Controller,请勿使用此操作步骤。一个集群中只能有一个 Snapshot Controller 进行管理。

影响

卸载旧版插件到新的 snapshot 组件就绪之间,预计会有一段短暂的间隔。在此间隔内,集群中没有正在运行的 Snapshot Controller。新的 snapshot 创建或删除请求可能会一直处于 Pending 状态,直到新组件就绪。

现有的 VolumeSnapshotVolumeSnapshotContentVolumeSnapshotClassVolumeGroupSnapshotVolumeGroupSnapshotContentVolumeGroupSnapshotClass 资源会被保留。

WARNING

在此迁移过程中不要删除 snapshot CRD。删除 snapshot CRD 可能会删除所有集群范围的 snapshot 对象并导致数据丢失。

WARNING

不要使用会删除 snapshot CRD 或 snapshot 自定义资源的清理操作。

前提条件

  • 你对 global 集群和目标业务集群具有管理员访问权限。
  • 目标业务集群运行在 ACP 4.4 或更高版本,或者正在升级到 ACP 4.4。
  • ACP Storage 组件已安装在目标业务集群中。
  • 在执行 kubectl patch 命令的工作站上,已安装 jq 命令行工具。
  • 你已为 snapshot 操作预留维护窗口。

操作步骤

记录当前的 snapshot 资源

在进行更改之前,请在目标业务集群中运行以下命令:

kubectl get crd | grep -E 'snapshot.storage.k8s.io|groupsnapshot.storage.k8s.io'
kubectl get volumesnapshots.snapshot.storage.k8s.io -A --ignore-not-found
kubectl get volumesnapshotcontents.snapshot.storage.k8s.io --ignore-not-found
kubectl get volumesnapshotclasses.snapshot.storage.k8s.io --ignore-not-found
kubectl get volumegroupsnapshots.groupsnapshot.storage.k8s.io -A --ignore-not-found
kubectl get volumegroupsnapshotcontents.groupsnapshot.storage.k8s.io --ignore-not-found
kubectl get volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io --ignore-not-found

请保留输出结果,以便在迁移后进行比较。

确认已安装旧版插件

在 global 集群中运行以下命令。将 <workload-cluster-name> 替换为目标业务集群名称:

kubectl get moduleinfo \
  -l cpaas.io/module-name=snapshot,cpaas.io/cluster-name=<workload-cluster-name>

如果此命令返回资源,则表示已安装旧版 Snapshot Management 插件。

卸载旧版插件

从 global 集群卸载旧版插件。你可以使用 Web 控制台或 YAML。

使用 Web 控制台:

  1. 进入 Administrator > Marketplace > Cluster Plugins
  2. 选择目标业务集群。
  3. 找到 Snapshot Management
  4. 卸载该插件。

使用 YAML 时,从 global 集群中删除插件安装资源:

kubectl delete moduleinfo \
  -l cpaas.io/module-name=snapshot,cpaas.io/cluster-name=<workload-cluster-name>

卸载操作会移除旧版 Snapshot Controller 工作负载,但不得删除 snapshot CRD 或现有 snapshot 资源。

验证旧版控制器已移除

在目标业务集群中运行以下命令:

kubectl get deployment -A | grep -E 'snapshot-controller|snapshot' || true

仅在不再存在旧版 Snapshot Controller Deployment 时继续下一步。

如果仍有其他 Snapshot Controller 在运行,请停止操作。在另一个控制器仍处于活动状态时启用 ACP 接管 snapshot 管理,可能会导致同一集群中出现两个 Snapshot Controller。

启用 ACP snapshot 管理

在目标业务集群中运行以下命令:

kubectl patch storagefoundation default --type=json -p "$(
  kubectl get storagefoundation default -o json | jq -c '
    (.spec.operators // []) as $operators |
    (
      if any($operators[]?; .name == "snapshot") then
        $operators | map(
          if .name == "snapshot" then
            .enabled = true | .upgradePolicy.mode = "Automatic"
          else
            .
          end
        )
      else
        $operators + [{
          "name": "snapshot",
          "enabled": true,
          "upgradePolicy": {"mode": "Automatic"}
        }]
      end
    ) as $updated |
    [{
      "op": (if .spec.operators == null then "add" else "replace" end),
      "path": "/spec/operators",
      "value": $updated
    }]
  '
)"

此补丁会添加或更新 snapshot 条目,并保留所有现有条目。仅在旧版控制器已移除后使用此设置。

等待 snapshot 组件就绪

在目标业务集群中运行以下命令:

kubectl get storagefoundation default \
  -o jsonpath='{range .status.operators[?(@.name=="snapshot")]}phase={.phase}{"\n"}{range .conditions[*]}{.type}={.status} reason={.reason} message={.message}{"\n"}{end}{end}'

snapshot 条目报告 phase=Ready 时,表示迁移成功。

验证 snapshot CRD 是否存在

在目标业务集群中运行以下命令:

for crd in \
  volumesnapshots.snapshot.storage.k8s.io \
  volumesnapshotcontents.snapshot.storage.k8s.io \
  volumesnapshotclasses.snapshot.storage.k8s.io \
  volumegroupsnapshots.groupsnapshot.storage.k8s.io \
  volumegroupsnapshotcontents.groupsnapshot.storage.k8s.io \
  volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io; do
  kubectl get crd "$crd"
done

snapshot 组件就绪后,应存在全部 6 个 CRD。

验证现有 snapshot 资源已保留

将以下输出与迁移前记录的输出进行比较:

kubectl get volumesnapshots.snapshot.storage.k8s.io -A --ignore-not-found
kubectl get volumesnapshotcontents.snapshot.storage.k8s.io --ignore-not-found
kubectl get volumesnapshotclasses.snapshot.storage.k8s.io --ignore-not-found
kubectl get volumegroupsnapshots.groupsnapshot.storage.k8s.io -A --ignore-not-found
kubectl get volumegroupsnapshotcontents.groupsnapshot.storage.k8s.io --ignore-not-found
kubectl get volumegroupsnapshotclasses.groupsnapshot.storage.k8s.io --ignore-not-found

现有 snapshot 资源应仍然存在。

回滚

如果 snapshot 组件未变为 Ready,请检查 snapshot 状态:

kubectl get storagefoundation default \
  -o jsonpath='{range .status.operators[?(@.name=="snapshot")]}phase={.phase}{"\n"}{range .conditions[*]}{.type}={.status} reason={.reason} message={.message}{"\n"}{end}{end}'

如果你需要停止 ACP snapshot 管理,同时保留 snapshot CRD 和 snapshot 资源,请将 snapshot 条目设置为 enabled: false

kubectl patch storagefoundation default --type=json -p "$(
  kubectl get storagefoundation default -o json | jq -c '
    (.spec.operators // []) as $operators |
    (
      if any($operators[]?; .name == "snapshot") then
        $operators | map(
          if .name == "snapshot" then
            .enabled = false | .upgradePolicy.mode = "Automatic"
          else
            .
          end
        )
      else
        $operators + [{
          "name": "snapshot",
          "enabled": false,
          "upgradePolicy": {"mode": "Automatic"}
        }]
      end
    ) as $updated |
    [{
      "op": (if .spec.operators == null then "add" else "replace" end),
      "path": "/spec/operators",
      "value": $updated
    }]
  '
)"

要恢复旧版插件,请在 global 集群中通过 Administrator > Marketplace > Cluster Plugins 重新安装 Snapshot Management。仅在 ACP snapshot 管理已被禁用且其控制器不再运行时执行此操作。

故障排查

Snapshot 状态报告 Skipped

Skipped 表示集群中已经存在一个或多个 snapshot CRD,并且 ACP 没有自动接管 snapshot 管理。在从旧版插件迁移期间,在你显式启用 ACP snapshot 管理之前,这属于预期行为:

name: snapshot
enabled: true

Snapshot 操作仍处于 Pending

检查是否正在运行 Snapshot Controller:

kubectl get deployment -A | grep -E 'snapshot-controller|snapshot'

如果没有控制器在运行且 snapshot 状态报告为 Skipped,请确认旧版插件已卸载,然后启用 ACP snapshot 管理。

在另一个控制器仍在运行时启用了 snapshot 管理

这可能会导致同一集群中出现两个 Snapshot Controller。请先禁用 ACP snapshot 管理:

kubectl patch storagefoundation default --type=json -p "$(
  kubectl get storagefoundation default -o json | jq -c '
    (.spec.operators // []) as $operators |
    (
      if any($operators[]?; .name == "snapshot") then
        $operators | map(
          if .name == "snapshot" then
            .enabled = false | .upgradePolicy.mode = "Automatic"
          else
            .
          end
        )
      else
        $operators + [{
          "name": "snapshot",
          "enabled": false,
          "upgradePolicy": {"mode": "Automatic"}
        }]
      end
    ) as $updated |
    [{
      "op": (if .spec.operators == null then "add" else "replace" end),
      "path": "/spec/operators",
      "value": $updated
    }]
  '
)"

在移除 ACP snapshot 组件后,请决定应由哪个组件提供集群级 snapshot 能力。集群中只应保留一个 Snapshot Controller。

相关文档