搜索

第 3 章 卸载 OpenShift Container Storage

download PDF

3.1. 在内部模式中卸载 OpenShift Container Storage

使用本节中的步骤卸载 OpenShift Container Storage。

卸载注解

Storage Cluster 上的注解用于更改卸载过程的行为。要定义卸载行为,在存储集群中引入了以下两个注解:

  • uninstall.ocs.openshift.io/cleanup-policy: delete
  • uninstall.ocs.openshift.io/mode: graceful

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

表 3.1. uninstall.ocs.openshift.io 卸载注解描述
注解默认行为

cleanup-policy

delete

Rook 清理物理驱动器和 DataDirHostPath

cleanup-policy

retain

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

mode

graceful

Rook 和 NooBaa 暂停卸载过程,直到管理员/用户移除 PVC 和 OBC

mode

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

流程

  1. 删除使用 OpenShift Container Storage 的卷快照。

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

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

      $ oc delete volumesnapshot <VOLUME-SNAPSHOT-NAME> -n <NAMESPACE>
  2. 删除使用 OpenShift Container Storage 的 PVC 和 OBC。

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

    如果要事先删除 PVC 来删除存储集群,您可以将卸载模式注解设置为"强制"并跳过此步骤。这样做会导致系统中出现孤立 PVC 和 OBC。

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

      请查看 第 3.2 节 “从 OpenShift Container Storage 中删除监控堆栈”

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

      请查看 第 3.3 节 “从 OpenShift Container Storage 中删除 OpenShift Container Platform registry”

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

      请查看 第 3.4 节 “从 OpenShift Container Storage 中删除集群日志记录 Operator”

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

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

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

    $ oc delete -n openshift-storage storagecluster --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 Container Storage 节点上的 OSD 设备中删除 dm-crypt 管理的 device-mapper 映射。

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

      $ oc debug node/<node name>
      $ chroot /host
    2. 获取设备名称并记录 OpenShift Container Storage 设备。

      $ 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 退出上述命令。
      • 查找 cryptsetup 进程的 PID,该进程一直卡住。

        $ ps

        输出示例:

        PID     TTY    TIME     CMD
        778825   ?     00:00:00 cryptsetup

        记录要终止的 PID 编号。在本例中,PID778825

      • 使用 kill 命令终止进程。

        $ kill -9 <PID>
      • 验证设备名称是否已移除。

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

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

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

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

    $ oc get pv
    $ oc delete pv <pv name>
  12. 删除 Multicloud 对象网关存储类。

    $ oc delete storageclass openshift-storage.noobaa.io --wait=true --timeout=5m
  13. 删除 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
  14. 在 OpenShift Container Platform Web 控制台中,确保完全卸载 OpenShift Container Storage,

    1. Home Overview 访问仪表板。
    2. 验证 Cluster 选项卡旁边是否不再显示持久性存储和对象存储选项卡。

3.1.1. 删除本地存储 Operator 配置

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

注意

对于仅使用 localvolume 资源的 OpenShift Container Storage 部署,请直接转至第 8 步。

流程

  1. 标识 LocalVolumeSet 以及 OpenShift Container Storage 使用的对应 StorageClassName
  2. 将变量 SC 设置为提供 LocalVolumeSetStorageClass

    $ export SC="<StorageClassName>"
  3. 删除 LocalVolumeSet

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

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

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

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

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

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

    1. 标识 LocalVolume 以及 OpenShift Container Storage 使用的对应 StorageClassName
    2. 将变量 LV 设置为 LocalVolume 的名称,变量 SC 设置为 StorageClass 的名称

      例如:

      $ LV=local-block
      $ SC=localblock
    3. 删除本地卷资源。

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

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

      $ [[ ! -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 ...
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.