从旧版插件迁移 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 状态,直到新组件就绪。
现有的 VolumeSnapshot、VolumeSnapshotContent、VolumeSnapshotClass、VolumeGroupSnapshot、VolumeGroupSnapshotContent 和 VolumeGroupSnapshotClass 资源会被保留。
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 控制台:
- 进入 Administrator > Marketplace > Cluster Plugins。
- 选择目标业务集群。
- 找到 Snapshot Management。
- 卸载该插件。
使用 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。
相关文档