第 4 章 卸载 OpenShift Data Foundation
4.1. 在内部附加设备模式中卸载 OpenShift Data Foundation
使用本节中的步骤卸载 OpenShift Data Foundation。
卸载注解
Storage Cluster 上的注解用于更改卸载过程的行为。要定义卸载行为,在存储集群中引入了以下两个注解:
-
uninstall.ocs.openshift.io/cleanup-policy: delete
-
uninstall.ocs.openshift.io/mode: graceful
下表提供了有关可用于这些注解的不同值的信息:
注解 | 值 | 默认值 | 行为 |
---|---|---|---|
cleanup-policy | delete | 是 |
Rook 清理物理驱动器和 |
cleanup-policy | retain | 否 |
Rook 不会清理物理驱动器和 |
模式 | graceful | 是 | rook 和 NooBaa 在管理员/用户删除持久性卷声明(PVC)和 Object Bucket Claims(OBC)前暂停卸载过程。 |
模式 | forced | 否 | rook 和 NooBaa 会在卸载过程中继续进行,即使 PVC/OBCs 使用 Rook 和 NooBaa 置备 |
编辑注解的值,以更改清理策略或卸载模式。
$ oc -n openshift-storage annotate storagecluster ocs-storagecluster uninstall.ocs.openshift.io/cleanup-policy="retain" --overwrite
$ oc -n openshift-storage annotate storagecluster ocs-storagecluster uninstall.ocs.openshift.io/mode="forced" --overwrite
两个命令的预期输出:
storagecluster.ocs.openshift.io/ocs-storagecluster annotated
先决条件
- 确保 OpenShift Data Foundation 集群处于健康状态。当因为资源或节点不足而导致部分 pod 无法成功终止时,卸载过程可能会失败。如果集群处于不健康状态,请在卸载 OpenShift Data Foundation 前联系红帽客户支持。
- 使用 OpenShift Data Foundation 提供的存储类,确保应用程序不使用持久性卷声明 (PVC) 或对象存储桶声明 (OBC)。
- 如果管理员创建了任何自定义资源(如自定义存储类、cephblockpools),则管理员必须在移除消耗这些资源后将它们删除。
流程
删除使用 OpenShift Data Foundation 的卷快照。
列出来自所有命名空间的卷快照。
$ oc get volumesnapshot --all-namespaces
从上一命令的输出中,识别和删除使用 OpenShift Data Foundation 的卷快照。
$ oc delete volumesnapshot <VOLUME-SNAPSHOT-NAME> -n <NAMESPACE>
<VOLUME-SNAPSHOT-NAME>
- 是卷快照的名称
<NAMESPACE>
- 是项目的命名空间
删除使用 OpenShift Data Foundation 的 PVC 和 OBC。
在默认的卸载模式 (graceful) 中,卸载程序会等待所有使用 OpenShift Data Foundation 的 PVC 和 OBC 被删除。
如果要在没有删除 PVC 的情况下删除 Storage Cluster,您可以将卸载模式注解设置为
forced(强制)
并跳过此步骤。这样做会在系统中产生孤立 PVC 和 OBC。使用 OpenShift Data Foundation 删除 OpenShift Container Platform 监控堆栈 PVC。
使用 OpenShift Data Foundation 删除 OpenShift Container Platform Registry PVC。
从 OpenShift Data Foundation 中删除 OpenShift Container Platform registry
使用 OpenShift Data Foundation 删除 OpenShift Container Platform 日志 PVC。
删除使用 OpenShift Data Foundation 置备的其他 PVC 和 OBC。
下面是一个示例脚本,用于标识使用 OpenShift Data Foundation 置备的 PVC 和 OBC。该脚本将忽略 OpenShift Data Foundation 内部使用的 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>
<obc-name>
- 是 OBC 的名称
<project-name>
- 是项目的名称
删除 PVC。
$ oc delete pvc <pvc-name> -n <project-name>
<pvc-name>
- 是 PVC 的名称
<project-name>
是项目的名称
注意确保您已删除了集群中创建的任何自定义后备存储、存储桶类等。
删除 Storage System 对象,并等待相关资源被删除。
$ oc delete -n openshift-storage storagesystem --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 Data Foundation 节点上的 OSD 设备删除
dm-crypt
管理的device-mapper
映射。创建
debug
pod 和chroot
到存储节点上的主机。$ oc debug node/<node-name>
$ chroot /host
<node-name>
- 是节点的名称
获取设备名称并记录 OpenShift Data Foundation 设备。
$ 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>
<PID>
- 是进程 ID
验证设备名称是否已移除。
$ dmsetup ls
-
按
删除命名空间并等待删除完成。如果
openshift-storage
是活跃的项目,则需要切换到另一个项目。例如:
$ oc project default
$ oc delete project openshift-storage --wait=true --timeout=5m
如果以下命令返回 NotFound 错误,则项目被删除。
$ oc get project openshift-storage
注意卸载 OpenShift Data Foundation 时,如果还没有完全删除
命名空间
并处于Terminating
状态,请执行故障排除和删除 Uninstall 期间剩余的资源 的步骤,以识别阻止命名空间终止的对象。- 如果您使用本地存储设备部署了 OpenShift Data Foundation,请删除本地存储 Operator 配置。请参阅 删除本地存储 Operator 配置。
取消标记存储节点。
$ oc label nodes --all cluster.ocs.openshift.io/openshift-storage-
$ oc label nodes --all topology.rook.io/rack-
如果节点存在污点,则删除 OpenShift Data Foundation 污点。
$ oc adm taint nodes --all node.ocs.openshift.io/storage-
确认已删除使用 OpenShift Data Foundation 置备的所有持久卷(PV)。如果有任何 PV 处于
Released
状态,请将其删除。$ oc get pv
$ oc delete pv <pv-name>
<pv-name>
- 是 PV 的名称
删除
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 storagesystems.odf.openshift.io --wait=true --timeout=5m
要确保在 OpenShift Container Platform Web 控制台中完全卸载 OpenShift Data Foundation,
- 点 Storage。
- 验证 OpenShift Data Foundation 是否不再出现在 Storage 下。
4.1.1. 删除本地存储 Operator 配置
只有在您使用本地存储设备部署了 OpenShift Data Foundation 时,才使用本节中的说明。
对于仅使用 localvolume
资源部署的 OpenShift Data Foundation,请直接转到第 8 步。
流程
标识
LocalVolumeSet
以及 OpenShift Data Foundation 使用的对应StorageClassName
。$ oc get localvolumesets.local.storage.openshift.io -n openshift-local-storage
将变量 SC 设置为提供
LocalVolumeSet
的StorageClass
。$ export SC="<StorageClassName>"
列出并记下稍后要清理的设备。要列出磁盘的设备 ID,请按照这里所述的步骤进行操作,请参阅查找可用的存储设备。
输出示例:
/dev/disk/by-id/scsi-360050763808104bc28000000000000eb /dev/disk/by-id/scsi-360050763808104bc28000000000000ef /dev/disk/by-id/scsi-360050763808104bc28000000000000f3
删除
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 Data Foundation 版本中置备 PV 的
LocalVolume
资源。此外,确保这些资源不提供给集群上的其他租户使用。对于每个本地卷,请执行以下操作:
标识
LocalVolume
以及 OpenShift Data Foundation 使用的对应StorageClassName
。$ oc get localvolume.local.storage.openshift.io -n openshift-local-storage
将变量 LV 设置为 LocalVolume 的名称,变量 SC 设置为 StorageClass 的名称
例如:
$ LV=local-block $ SC=localblock
列出并记下稍后要清理的设备。
$ oc get localvolume -n openshift-local-storage $LV -o jsonpath='{ .spec.storageClassDevices[].devicePaths[] }{"\n"}'
输出示例:
/dev/sdb /dev/sdc /dev/sdd /dev/sde
删除本地卷资源。
$ oc delete localvolume -n openshift-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 ...
分别擦除第 1 和第 8 步中列出的每个本地卷组或本地卷的磁盘,以便可以重复使用它们。
列出存储节点。
oc get nodes -l cluster.ocs.openshift.io/openshift-storage=
输出示例:
NAME STATUS ROLES AGE VERSION node-xxx Ready worker 4h45m v1.18.3+6c42de8 node-yyy Ready worker 4h46m v1.18.3+6c42de8 node-zzz Ready worker 4h45m v1.18.3+6c42de8
获取节点控制台并在出现提示时执行
chroot /host
命令。$ oc debug node/node-xxx Starting pod/node-xxx-debug … To use host binaries, run `chroot /host` Pod IP: w.x.y.z If you don't see a command prompt, try pressing enter. sh-4.2# chroot /host
将磁盘路径存储在 DISKS 变量中的引号内。有关磁盘路径列表,请查看第 3 步和第 8.c 步以了解本地卷集和本地卷。
输出示例:
sh-4.4# DISKS="/dev/disk/by-id/scsi-360050763808104bc28000000000000eb /dev/disk/by-id/scsi-360050763808104bc28000000000000ef /dev/disk/by-id/scsi-360050763808104bc28000000000000f3 " or sh-4.2# DISKS="/dev/sdb /dev/sdc /dev/sdd /dev/sde ".
在所有磁盘上运行
sgdisk --zap-all
。sh-4.4# for disk in $DISKS; do sgdisk --zap-all $disk;done
输出示例:
Creating new GPT entries. GPT data structures destroyed! You may now partition the disk using fdisk or other utilities. Creating new GPT entries. GPT data structures destroyed! You may now partition the disk using fdisk or other utilities. Creating new GPT entries. GPT data structures destroyed! You may now partition the disk using fdisk or other utilities. Creating new GPT entries. GPT data structures destroyed! You may now partition the disk using fdisk or other utilities.
退出 shell,再对其他节点重复此操作。
sh-4.4# exit exit sh-4.2# exit exit Removing debug pod ...
删除
openshift-local-storage
命名空间并等待删除完成。如果openshift-local-storage
命名空间是活跃的项目,则需要切换到另一个项目。例如:
$ oc project default $ oc delete project openshift-local-storage --wait=true --timeout=5m
如果以下命令返回了 NotFound 错误,则该项目将被删除。
$ oc get project openshift-local-storage