第 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

下表提供了有关可用于这些注解的不同值的信息:

表 4.1. uninstall.ocs.openshift.io 卸载注解描述

注解默认行为

cleanup-policy

delete

Rook 清理物理驱动器和 DataDirHostPath

cleanup-policy

retain

Rook 不会清理物理驱动器和 DataDirHostPath

模式

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),则管理员必须在移除消耗这些资源后将它们删除。

流程

  1. 删除使用 OpenShift Data Foundation 的卷快照。

    1. 列出来自所有命名空间的卷快照。

      $ oc get volumesnapshot --all-namespaces
    2. 从上一命令的输出中,识别和删除使用 OpenShift Data Foundation 的卷快照。

      $ oc delete volumesnapshot <VOLUME-SNAPSHOT-NAME> -n <NAMESPACE>
      <VOLUME-SNAPSHOT-NAME>
      是卷快照的名称
      <NAMESPACE>
      是项目的命名空间
  2. 删除使用 OpenShift Data Foundation 的 PVC 和 OBC。

    在默认的卸载模式 (graceful) 中,卸载程序会等待所有使用 OpenShift Data Foundation 的 PVC 和 OBC 被删除。

    如果要在没有删除 PVC 的情况下删除 Storage Cluster,您可以将卸载模式注解设置为 forced(强制)并跳过此步骤。这样做会在系统中产生孤立 PVC 和 OBC。

    1. 使用 OpenShift Data Foundation 删除 OpenShift Container Platform 监控堆栈 PVC。

      请参阅从 OpenShift Data Foundation 中删除监控堆栈

    2. 使用 OpenShift Data Foundation 删除 OpenShift Container Platform Registry PVC。

      从 OpenShift Data Foundation 中删除 OpenShift Container Platform registry

    3. 使用 OpenShift Data Foundation 删除 OpenShift Container Platform 日志 PVC。

      从 OpenShift Data Foundation 中删除集群日志记录操作器

    4. 删除使用 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>

        是项目的名称

        注意

        确保您已删除了集群中创建的任何自定义后备存储、存储桶类等。

  3. 删除 Storage System 对象,并等待相关资源被删除。

    $ oc delete -n openshift-storage storagesystem --all --wait=true
  4. 检查 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
  5. 确认目录 /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
  6. 如果在安装时启用了加密,请从所有 OpenShift Data Foundation 节点上的 OSD 设备删除 dm-crypt 管理的 device-mapper 映射。

    1. 创建 debug pod 和 chroot 到存储节点上的主机。

      $ oc debug node/<node-name>
      $ chroot /host
      <node-name>
      是节点的名称
    2. 获取设备名称并记录 OpenShift Data Foundation 设备。

      $ dmsetup ls

      输出示例:

      ocs-deviceset-0-data-0-57snx-block-dmcrypt (253:1)
    3. 删除映射的设备。

      $ 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
  7. 删除命名空间并等待删除完成。如果 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 期间剩余的资源 的步骤,以识别阻止命名空间终止的对象。

  8. 如果您使用本地存储设备部署了 OpenShift Data Foundation,请删除本地存储 Operator 配置。请参阅 删除本地存储 Operator 配置
  9. 取消标记存储节点。

    $ oc label nodes  --all cluster.ocs.openshift.io/openshift-storage-
    $ oc label nodes  --all topology.rook.io/rack-
  10. 如果节点存在污点,则删除 OpenShift Data Foundation 污点。

    $ oc adm taint nodes --all node.ocs.openshift.io/storage-
  11. 确认已删除使用 OpenShift Data Foundation 置备的所有持久卷(PV)。如果有任何 PV 处于 Released 状态,请将其删除。

    $ oc get pv
    $ oc delete pv <pv-name>
    <pv-name>
    是 PV 的名称
  12. 删除 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
  13. 要确保在 OpenShift Container Platform Web 控制台中完全卸载 OpenShift Data Foundation,

    1. Storage
    2. 验证 OpenShift Data Foundation 是否不再出现在 Storage 下。

4.1.1. 删除本地存储 Operator 配置

只有在您使用本地存储设备部署了 OpenShift Data Foundation 时,才使用本节中的说明。

注意

对于仅使用 localvolume 资源部署的 OpenShift Data Foundation,请直接转到第 8 步。

流程

  1. 标识 LocalVolumeSet 以及 OpenShift Data Foundation 使用的对应 StorageClassName

    $ oc get localvolumesets.local.storage.openshift.io -n openshift-local-storage
  2. 将变量 SC 设置为提供 LocalVolumeSetStorageClass

    $ export SC="<StorageClassName>"
  3. 列出并记下稍后要清理的设备。要列出磁盘的设备 ID,请按照这里所述的步骤进行操作,请参阅查找可用的存储设备

    输出示例:

    /dev/disk/by-id/scsi-360050763808104bc28000000000000eb
    /dev/disk/by-id/scsi-360050763808104bc28000000000000ef
    /dev/disk/by-id/scsi-360050763808104bc28000000000000f3
  4. 删除 LocalVolumeSet

    $ oc delete localvolumesets.local.storage.openshift.io <name-of-volumeset> -n openshift-local-storage
  5. 删除给定 StorageClassName 的本地存储 PV。

    $ oc get pv | grep $SC | awk '{print $1}'| xargs oc delete pv
  6. 删除 StorageClassName

    $ oc delete sc $SC
  7. 删除 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
  8. 删除 LocalVolumeDiscovery

    $ oc delete localvolumediscovery.local.storage.openshift.io/auto-discover-devices -n openshift-local-storage
  9. 删除 LocalVolume 资源(如果有)。

    使用以下步骤删除在当前或以前的 OpenShift Data Foundation 版本中置备 PV 的 LocalVolume 资源。此外,确保这些资源不提供给集群上的其他租户使用。

    对于每个本地卷,请执行以下操作:

    1. 标识 LocalVolume 以及 OpenShift Data Foundation 使用的对应 StorageClassName

      $ oc get localvolume.local.storage.openshift.io -n openshift-local-storage
    2. 将变量 LV 设置为 LocalVolume 的名称,变量 SC 设置为 StorageClass 的名称

      例如:

      $ LV=local-block
      $ SC=localblock
    3. 列出并记下稍后要清理的设备。

      $ oc get localvolume -n openshift-local-storage $LV -o jsonpath='{ .spec.storageClassDevices[].devicePaths[] }{"\n"}'

      输出示例:

      /dev/sdb
      /dev/sdc
      /dev/sdd
      /dev/sde
    4. 删除本地卷资源。

      $ oc delete localvolume -n openshift-local-storage --wait=true $LV
    5. 删除剩余的 PV 和 StorageClasses(如果存在)。

      $ oc delete pv -l storage.openshift.com/local-volume-owner-name=${LV} --wait --timeout=5m
      $ oc delete storageclass $SC --wait --timeout=5m
    6. 从该资源的存储节点中清理工件。

      $ [[ ! -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 ...
  10. 分别擦除第 1 和第 8 步中列出的每个本地卷组或本地卷的磁盘,以便可以重复使用它们。

    1. 列出存储节点。

      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
    2. 获取节点控制台并在出现提示时执行 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
    3. 将磁盘路径存储在 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 ".
    4. 在所有磁盘上运行 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.
    5. 退出 shell,再对其他节点重复此操作。

      sh-4.4# exit
      exit
      sh-4.2# exit
      exit
      Removing debug pod ...
  11. 删除 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