第 5 章 卸载 OpenShift Container Storage
5.1. 在内部模式中卸载 OpenShift Container Storage
使用本节中的步骤卸载 OpenShift Container Storage。
卸载注解
Storage Cluster 上的注解用于更改卸载过程的行为。要定义卸载行为,在存储集群中引入了以下两个注解:
-
uninstall.ocs.openshift.io/cleanup-policy: delete
-
uninstall.ocs.openshift.io/mode: graceful
下表提供了有关可用于这些注解的不同值的信息:
表 5.1. uninstall.ocs.openshift.io
卸载注解描述
注解 | 订阅价值 | Default(默认) | 行为 |
---|---|---|---|
cleanup-policy | 删除 | 是 |
Rook 清理物理驱动器和 |
cleanup-policy | retain | 否 |
Rook 不会清理物理驱动器和 |
模式 | graceful | 是 | Rook 和 NooBaa 暂停卸载过程,直到管理员/用户移除 PVC 和 OBC |
模式 | forced | 否 | Rook 和 NooBaa 即使使用 Rook 和 NooBaa 置备的 PVC/OBC 分别存在,也会继续卸载。 |
您可以通过使用以下命令编辑注解值来更改清理策略或卸载模式:
$ oc annotate storagecluster -n openshift-storage ocs-storagecluster uninstall.ocs.openshift.io/cleanup-policy="retain" --overwrite storagecluster.ocs.openshift.io/ocs-storagecluster annotated
$ oc annotate storagecluster -n openshift-storage ocs-storagecluster uninstall.ocs.openshift.io/mode="forced" --overwrite storagecluster.ocs.openshift.io/ocs-storagecluster annotated
先决条件
- 确保 OpenShift Container Storage 集群处于健康状态。当因为资源或节点不足而导致部分 pod 无法成功终止时,卸载过程可能会失败。如果集群处于不健康状态,请在卸载 OpenShift Container Storage 前联络红帽客户支持。
- 使用 OpenShift Container Storage 提供的存储类,确保应用程序不使用持久性卷声明 (PVC) 或对象存储桶声明 (OBC)。
- 如果管理员创建了任何自定义资源(如自定义存储类、cephblockpools),则管理员必须在移除消耗这些资源后将它们删除。
步骤
删除使用 OpenShift Container Storage 的卷快照。
列出来自所有命名空间的卷快照。
$ oc get volumesnapshot --all-namespaces
在上一命令的输出中,识别和删除使用 OpenShift Container Storage 的卷快照。
$ oc delete volumesnapshot <VOLUME-SNAPSHOT-NAME> -n <NAMESPACE>
删除使用 OpenShift Container Storage 的 PVC 和 OBC。
在默认的卸载模式 (graceful) 中,卸载程序会等待所有使用 OpenShift Container Storage 的 PVC 和 OBC 被删除。
如果要事先删除 PVC 来删除存储集群,您可以将卸载模式注解设置为
强制
并跳过此步骤。这样做会导致系统处于孤立的 PVC 和 OBC。使用 OpenShift Container Storage 删除 OpenShift Container Platform 监控堆栈 PVC。
如需更多信息,请参阅 第 5.2 节 “从 OpenShift Container Storage 中删除监控堆栈”。
使用 OpenShift Container Storage 删除 OpenShift Container Platform Registry PVC。
如需更多信息,请参阅 第 5.3 节 “从 OpenShift Container Storage 中删除 OpenShift Container Platform registry”。
使用 OpenShift Container Storage 删除 OpenShift Container Platform 日志 PVC。
如需更多信息,请参阅 第 5.4 节 “从 OpenShift Container Storage 中删除集群日志记录 Operator”。
删除使用 OpenShift Container Storage 置备的其他 PVC 和 OBC。
以下示例是示例脚本,用于识别使用 OpenShift Container Storage 置备的 PVC 和 OBC。该脚本忽略 Openshift Container Storage 内部使用的 PVC。
#!/bin/bash RBD_PROVISIONER="openshift-storage.rbd.csi.ceph.com" CEPHFS_PROVISIONER="openshift-storage.cephfs.csi.ceph.com" NOOBAA_PROVISIONER="openshift-storage.noobaa.io/obc" RGW_PROVISIONER="openshift-storage.ceph.rook.io/bucket" NOOBAA_DB_PVC="noobaa-db" NOOBAA_BACKINGSTORE_PVC="noobaa-default-backing-store-noobaa-pvc" # Find all the OCS StorageClasses OCS_STORAGECLASSES=$(oc get storageclasses | grep -e "$RBD_PROVISIONER" -e "$CEPHFS_PROVISIONER" -e "$NOOBAA_PROVISIONER" -e "$RGW_PROVISIONER" | awk '{print $1}') # List PVCs in each of the StorageClasses for SC in $OCS_STORAGECLASSES do echo "======================================================================" echo "$SC StorageClass PVCs and OBCs" echo "======================================================================" oc get pvc --all-namespaces --no-headers 2>/dev/null | grep $SC | grep -v -e "$NOOBAA_DB_PVC" -e "$NOOBAA_BACKINGSTORE_PVC" oc get obc --all-namespaces --no-headers 2>/dev/null | grep $SC echo done
注意云平台省略
RGW_PROVISIONER
。删除 OBC。
$ oc delete obc <obc name> -n <project name>
删除 PVC。
$ oc delete pvc <pvc name> -n <project-name>
注意确保您已删除了集群中创建的任何自定义后备存储、存储桶类等。
删除 Storage Cluster 对象并等待相关资源被删除。
$ oc delete -n openshift-storage storagecluster --all --wait=true
检查
uninstall.ocs.openshift.io/cleanup-policy
是否已设置为delete
(默认),并确保其状态为Completed
。$ oc get pods -n openshift-storage | grep -i cleanup NAME READY STATUS RESTARTS AGE cluster-cleanup-job-<xx> 0/1 Completed 0 8m35s cluster-cleanup-job-<yy> 0/1 Completed 0 8m35s cluster-cleanup-job-<zz> 0/1 Completed 0 8m35s
确认目录
/var/lib/rook
现在为空。只有uninstall.ocs.openshift.io/cleanup-policy
注解设置为delete
(默认)时,此目录才为空。$ for i in $(oc get node -l cluster.ocs.openshift.io/openshift-storage= -o jsonpath='{ .items[*].metadata.name }'); do oc debug node/${i} -- chroot /host ls -l /var/lib/rook; done
如果在安装时启用了加密,在所有 OpenShift Container Storage 节点上的 OSD 设备中删除
dm-crypt
管理的device-mapper
映射。创建
debug
pod 和chroot
到存储节点上的主机。$ oc debug node/<node name> $ chroot /host
获取设备名称并记录 OpenShift Container Storage 设备。
$ dmsetup ls ocs-deviceset-0-data-0-57snx-block-dmcrypt (253:1)
删除映射的设备。
$ cryptsetup luksClose --debug --verbose ocs-deviceset-0-data-0-57snx-block-dmcrypt
注意如果上述命令因为权限不足而卡住,请运行以下命令:
-
按
CTRL+Z
退出上述命令。 查找阻塞的进程的 PID。
$ ps -ef | grep crypt
使用
kill
命令终止进程。$ kill -9 <PID>
验证设备名称是否已移除。
$ dmsetup ls
-
按
删除命名空间并等待删除完成。如果
openshift-storage
是活跃的项目,则需要切换到另一个项目。例如:
$ oc project default $ oc delete project openshift-storage --wait=true --timeout=5m
如果以下命令返回 NotFound 错误,则项目被删除。
$ oc get project openshift-storage
注意卸载 OpenShift Container Storage 时,如果没有完全删除
命名空间
并处于Terminating
状态,请执行 故障排除和删除 Uninstall 过程中剩余的资源 的步骤,以识别阻塞命名空间的对象。- 如果您使用本地存储设备部署了 OpenShift Container Storage,请删除本地存储 Operator 配置。请参阅 删除本地存储 Operator 配置。
取消标记存储节点。
$ oc label nodes --all cluster.ocs.openshift.io/openshift-storage- $ oc label nodes --all topology.rook.io/rack-
如果节点有污点,则删除 OpenShift Container Storage 污点。
$ oc adm taint nodes --all node.ocs.openshift.io/storage-
确认已删除使用 OpenShift Container Storage 置备的所有 PV。如果有任何 PV 处于
Released
状态,请将其删除。$ oc get pv $ oc delete pv <pv name>
删除 Multicloud 对象网关存储类。
$ oc delete storageclass openshift-storage.noobaa.io --wait=true --timeout=5m
删除
CustomResourceDefinitions
。$ oc delete crd backingstores.noobaa.io bucketclasses.noobaa.io cephblockpools.ceph.rook.io cephclusters.ceph.rook.io cephfilesystems.ceph.rook.io cephnfses.ceph.rook.io cephobjectstores.ceph.rook.io cephobjectstoreusers.ceph.rook.io noobaas.noobaa.io ocsinitializations.ocs.openshift.io storageclusters.ocs.openshift.io cephclients.ceph.rook.io cephobjectrealms.ceph.rook.io cephobjectzonegroups.ceph.rook.io cephobjectzones.ceph.rook.io cephrbdmirrors.ceph.rook.io --wait=true --timeout=5m
可选:要确保永久删除 vault 密钥,您需要手动删除与 vault 密钥关联的元数据。
注意只有在 Vault Key/Value(KV)机密引擎 API 时才执行此步骤,使用密钥管理系统(KMS)版本 2 进行集群范围加密,因为 vault 密钥被标记为删除并在 OpenShift Container Storage 卸载过程中永久删除。如果需要,您可以在以后恢复它。
列出密码库中的密钥。
$ vault kv list <backend_path>
<backend_path>
是存储加密密钥的密码库中的路径。
例如:
$ vault kv list kv-v2
输出示例:
Keys ----- NOOBAA_ROOT_SECRET_PATH/ rook-ceph-osd-encryption-key-ocs-deviceset-thin-0-data-0m27q8 rook-ceph-osd-encryption-key-ocs-deviceset-thin-1-data-0sq227 rook-ceph-osd-encryption-key-ocs-deviceset-thin-2-data-0xzszb
列出与 vault 密钥关联的元数据。
$ vault kv get kv-v2/<key>
对于 Multicloud Object Gateway(MCG)密钥:
$ vault kv get kv-v2/NOOBAA_ROOT_SECRET_PATH/<key>
<key>
是加密密钥。
例如:
$ vault kv get kv-v2/rook-ceph-osd-encryption-key-ocs-deviceset-thin-0-data-0m27q8
输出示例:
====== Metadata ====== Key Value --- ----- created_time 2021-06-23T10:06:30.650103555Z deletion_time 2021-06-23T11:46:35.045328495Z destroyed false version 1
删除元数据。
$ vault kv metadata delete kv-v2/<key>
对于 MCG 密钥:
$ vault kv metadata delete kv-v2/NOOBAA_ROOT_SECRET_PATH/<key>
<key>
是加密密钥。
例如:
$ vault kv metadata delete kv-v2/rook-ceph-osd-encryption-key-ocs-deviceset-thin-0-data-0m27q8
输出示例:
Success! Data deleted (if it existed) at: kv-v2/metadata/rook-ceph-osd-encryption-key-ocs-deviceset-thin-0-data-0m27q8
- 重复这些步骤,以删除与所有 vault 密钥关联的元数据。
在 OpenShift Container Platform Web 控制台中,确保完全卸载 OpenShift Container Storage,
- 点 Storage。
- 验证 Overview 不再显示在 Storage 下。
5.1.1. 删除本地存储 Operator 配置
只有在使用本地存储设备部署了 OpenShift Container Storage 时,才使用本节中的说明。
对于只使用 localvolume
资源的 OpenShift Container Storage 部署,请参阅第 8 步。
步骤
-
标识
LocalVolumeSet
以及 OpenShift Container Storage 使用的对应StorageClassName
。 将变量 SC 设置为提供
LocalVolumeSet
的StorageClass
。$ export SC="<StorageClassName>"
删除
LocalVolumeSet
。$ oc delete localvolumesets.local.storage.openshift.io <name-of-volumeset> -n openshift-local-storage
删除给定
StorageClassName
的本地存储 PV。$ oc get pv | grep $SC | awk '{print $1}'| xargs oc delete pv
删除
StorageClassName
。$ oc delete sc $SC
删除
LocalVolumeSet
创建的符号链接。[[ ! -z $SC ]] && for i in $(oc get node -l cluster.ocs.openshift.io/openshift-storage= -o jsonpath='{ .items[*].metadata.name }'); do oc debug node/${i} -- chroot /host rm -rfv /mnt/local-storage/${SC}/; done
删除
LocalVolumeDiscovery
。$ oc delete localvolumediscovery.local.storage.openshift.io/auto-discover-devices -n openshift-local-storage
删除
LocalVolume
资源(如果有)。使用以下步骤删除在当前或以前的 OpenShift Container Storage 版本中置备 PV 的
LocalVolume
资源。另外,也要确保这些资源没有被集群中的其他租户使用。对于每个本地卷,请执行以下操作:
-
标识
LocalVolume
以及 OpenShift Container Storage 使用的对应StorageClassName
。 将变量 LV 设置为 LocalVolume 的名称,变量 SC 设置为 StorageClass 的名称
例如:
$ LV=local-block $ SC=localblock
删除本地卷资源。
$ oc delete localvolume -n local-storage --wait=true $LV
删除剩余的 PV 和 StorageClasses(如果存在)。
$ oc delete pv -l storage.openshift.com/local-volume-owner-name=${LV} --wait --timeout=5m $ oc delete storageclass $SC --wait --timeout=5m
从该资源的存储节点中清理工件。
$ [[ ! -z $SC ]] && for i in $(oc get node -l cluster.ocs.openshift.io/openshift-storage= -o jsonpath='{ .items[*].metadata.name }'); do oc debug node/${i} -- chroot /host rm -rfv /mnt/local-storage/${SC}/; done
输出示例:
Starting pod/node-xxx-debug ... To use host binaries, run `chroot /host` removed '/mnt/local-storage/localblock/nvme2n1' removed directory '/mnt/local-storage/localblock' Removing debug pod ... Starting pod/node-yyy-debug ... To use host binaries, run `chroot /host` removed '/mnt/local-storage/localblock/nvme2n1' removed directory '/mnt/local-storage/localblock' Removing debug pod ... Starting pod/node-zzz-debug ... To use host binaries, run `chroot /host` removed '/mnt/local-storage/localblock/nvme2n1' removed directory '/mnt/local-storage/localblock' Removing debug pod ...
-
标识