5.2. 替换 IBM Power 上的正常工作或失败的存储设备

您可以使用 IBM Power 上的本地存储设备替换 OpenShift Data Foundation 中部署的对象存储设备(OSD)。

注意

可能需要替换一个或多个底层存储设备。

先决条件

  • 红帽建议为替换设备配置类似的基础架构和资源,以用于被替换的设备。
  • 确保数据具有弹性。

    • 在 OpenShift Web 控制台中,点 StorageData Foundation
    • Storage Systems 选项卡,然后点 ocs-storagecluster-storagesystem
    • Block and File 仪表板的 Status 卡中,在 Overview 选项卡中,验证 Data Resiliency 是否具有绿色勾号。

流程

  1. 确定需要替换的 OSD,以及在其上调度 OSD 的 OpenShift Container Platform 节点。

    $ oc get -n openshift-storage pods -l app=rook-ceph-osd -o wide

    输出示例:

    rook-ceph-osd-0-86bf8cdc8-4nb5t   0/1     crashLoopBackOff   0   24h   10.129.2.26     worker-0     <none>       <none>
    rook-ceph-osd-1-7c99657cfb-jdzvz   1/1     Running   0          24h     10.128.2.46     worker-1     <none>       <none>
    rook-ceph-osd-2-5f9f6dfb5b-2mnw9    1/1     Running   0          24h     10.131.0.33    worker-2     <none>       <none>

    在本例中,需要替换 rook-ceph-osd-0-86bf8cdc8-4nb5tworker-0 是调度 OSD 的 RHOCP 节点。

    注意

    如果要更换的 OSD 处于健康状态,则 Pod 的状态将为 Running

  2. 缩减 OSD 部署,以替换 OSD。

    $ osd_id_to_remove=0
    $ oc scale -n openshift-storage deployment rook-ceph-osd-${osd_id_to_remove} --replicas=0

    其中,osd_id_to_remove 是 pod 名称中紧接在 rook-ceph-osd 前缀后面的整数。在本例中,部署名称为 rook-ceph-osd-0

    输出示例:

    deployment.extensions/rook-ceph-osd-0 scaled
  3. 验证 rook-ceph-osd pod 是否已终止。

    $ oc get -n openshift-storage pods -l ceph-osd-id=${osd_id_to_remove}

    输出示例:

    No resources found in openshift-storage namespace.
    重要

    如果 rook-ceph-osd pod 处于 terminating 状态超过几分钟,请使用 force 选项删除 pod。

    $ oc delete -n openshift-storage pod rook-ceph-osd-0-86bf8cdc8-4nb5t --grace-period=0 --force

    输出示例:

    warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
      pod "rook-ceph-osd-0-86bf8cdc8-4nb5t" force deleted
  4. 从集群中移除旧 OSD,以便您可以添加新 OSD。

    1. 识别与要替换的 OSD 关联的 DeviceSet

      $ oc get -n openshift-storage -o yaml deployment rook-ceph-osd-${osd_id_to_remove} | grep ceph.rook.io/pvc

      输出示例:

      ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-64xjl
          ceph.rook.io/pvc: ocs-deviceset-localblock-0-data-0-64xjl

      在本例中,持久性卷声明(PVC)名称是 ocs-deviceset-localblock-0-data-0-64xjl

    2. 识别与 PVC 关联的持久性卷(PV)。

      $ oc get -n openshift-storage pvc ocs-deviceset-<x>-<y>-<pvc-suffix>

      其中 xypvc-suffix 是前面步骤中标识的 DeviceSet 中的值。

      输出示例:

      NAME                      STATUS        VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      ocs-deviceset-localblock-0-data-0-64xjl   Bound    local-pv-8137c873    256Gi      RWO     localblock     24h

      在本例中,关联的 PV 是 local-pv-8137c873

    3. 确定要替换的设备的名称。

      $ oc get pv local-pv-<pv-suffix> -o yaml | grep path

      其中,pv-suffix 是前面步骤中标识的 PV 名称中的值。

      输出示例:

      path: /mnt/local-storage/localblock/vdc

      在本例中,设备名称为 vdc

    4. 找到与要被替换的 OSD 关联的 prepare-pod

      $ oc describe -n openshift-storage pvc ocs-deviceset-<x>-<y>-<pvc-suffix> | grep Used

      其中 xypvc-suffix 是前面步骤中标识的 DeviceSet 中的值。

      输出示例:

      Used By:    rook-ceph-osd-prepare-ocs-deviceset-localblock-0-data-0-64knzkc

      在本例中,prepare-pod 名称为 rook-ceph-osd-prepare-ocs-deviceset-localblock-0-data-0-64knzkc

    5. 删除所有旧的 ocs-osd-removal 任务。

      $ oc delete -n openshift-storage job ocs-osd-removal-job

      输出示例:

      job.batch "ocs-osd-removal-job" deleted
    6. 更改到 openshift-storage 项目。

      $ oc project openshift-storage
    7. 从集群中移除旧 OSD。

      $ oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_IDS=${osd_id_to_remove} -p FORCE_OSD_REMOVAL=false |oc create -n openshift-storage -f -

      FORCE_OSD_REMOVAL 值必须在有三个 OSD 的集群中更改为"true",或者有足够空间的集群在移除 OSD 后恢复所有这三个数据副本。

      警告

      这一步会导致 OSD 完全从集群中移除。确保提供了 osd_id_to_remove 的正确值。

  5. 通过检查 ocs-osd-removal-job pod 的状态,验证 OSD 是否已成功移除。

    状态为 Completed,确认 OSD 移除作业已成功。

    $ oc get pod -l job-name=ocs-osd-removal-job -n openshift-storage
  6. 确保 OSD 移除已完成。

    $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1 | egrep -i 'completed removal'

    输出示例:

    2022-05-10 06:50:04.501511 I | cephosd: completed removal of OSD 0
    重要

    如果 ocs-osd-removal-job 失败并且 pod 不在预期的 Completed 状态,请检查 pod 日志来进一步调试。

    例如:

    # oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1
  7. 如果在安装时启用了加密,在从相应 OpenShift Data Foundation 节点中删除的 OSD 设备中删除 dm-crypt 关联的 device-mapper 映射。

    1. ocs-osd-removal-job pod 日志中获取被替换 OSD 的 PVC 名称。

      $ oc logs -l job-name=ocs-osd-removal-job -n openshift-storage --tail=-1  |egrep -i ‘pvc|deviceset’

      输出示例:

      2021-05-12 14:31:34.666000 I | cephosd: removing the OSD PVC "ocs-deviceset-xxxx-xxx-xxx-xxx"
    2. 对于之前标识的每个节点,执行以下操作:

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

        $ oc debug node/<node name>
        <node name>

        是节点的名称。

        $ chroot /host
      2. 根据上一步中标识的 PVC 名称,查找相关的设备名称。

        $ dmsetup ls| grep <pvc name>
        <pvc name>

        是 PVC 的名称。

        输出示例:

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

        $ cryptsetup luksClose --debug --verbose ocs-deviceset-xxx-xxx-xxx-xxx-block-dmcrypt
        重要

        如果上述命令因为权限不足而卡住,请运行以下命令:

        • CTRL+Z 退出上述命令。
        • 查找阻塞的进程的 PID。

          $ ps -ef | grep crypt
        • 使用 kill 命令终止进程。

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

          $ dmsetup ls
  8. 查找需要删除的 PV。

    $ oc get pv -L kubernetes.io/hostname | grep localblock | grep Released

    输出示例:

    local-pv-d6bf175b           1490Gi       RWO         Delete          Released            openshift-storage/ocs-deviceset-0-data-0-6c5pw      localblock      2d22h       compute-1
  9. 删除 PV。

    $ oc delete pv <pv-name>
    <pv-name>
    是 PV 的名称。
  10. 替换旧设备,并使用新设备创建新的 OpenShift Container Platform PV。

    1. 使用要替换的设备登录到 OpenShift Container Platform 节点。在本例中,OpenShift Container Platform 节点是 worker-0

      $ oc debug node/worker-0

      输出示例:

      Starting pod/worker-0-debug ...
      To use host binaries, run `chroot /host`
      Pod IP: 192.168.88.21
      If you don't see a command prompt, try pressing enter.
      # chroot /host
    2. 使用前面标识的设备名称 vdc 记录要替换的 /dev/disk

      # ls -alh /mnt/local-storage/localblock

      输出示例:

      total 0
      drwxr-xr-x. 2 root root 17 Nov  18 15:23 .
      drwxr-xr-x. 3 root root 24 Nov  18 15:23 ..
      lrwxrwxrwx. 1 root root  8 Nov  18 15:23 vdc -> /dev/vdc
    3. 查找 LocalVolume CR 的名称,并删除或注释掉要替换的设备 /dev/disk

      $ oc get -n openshift-local-storage localvolume

      输出示例:

      NAME          AGE
      localblock   25h
      # oc edit -n openshift-local-storage localvolume localblock

      输出示例:

      [...]
          storageClassDevices:
          - devicePaths:
         #   - /dev/vdc
            storageClassName: localblock
            volumeMode: Block
      [...]

      确保在编辑 CR 后保存更改。

  11. 使用要替换的设备登录到 OpenShift Container Platform 节点,并删除旧的符号链接

    $ oc debug node/worker-0

    输出示例:

    Starting pod/worker-0-debug ...
    To use host binaries, run `chroot /host`
    Pod IP: 192.168.88.21
    If you don't see a command prompt, try pressing enter.
    # chroot /host
    1. 确定要替换的设备名称的旧 符号链接。在本例中,设备名称为 vdc

      # ls -alh /mnt/local-storage/localblock

      输出示例:

      total 0
      drwxr-xr-x. 2 root root 17 Nov  18 15:23 .
      drwxr-xr-x. 3 root root 24 Nov  18 15:23 ..
      lrwxrwxrwx. 1 root root  8 Nov  18 15:23 vdc -> /dev/vdc
    2. 删除 符号链接

      # rm /mnt/local-storage/localblock/vdc
    3. 验证是否删除了 symlink

      # ls -alh /mnt/local-storage/localblock

      输出示例:

      total 0
      drwxr-xr-x. 2 root root 6 Nov 18 17:11 .
      drwxr-xr-x. 3 root root 24 Nov 18 15:23 ..
  12. 使用新设备替换旧设备。
  13. 重新登录到正确的 OpenShift Cotainer Platform 节点,并确定新驱动器的设备名称。设备名称必须更改,除非您要重置同一设备。

    # lsblk

    输出示例:

    NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    vda                          252:0    0   40G  0 disk
    |-vda1                       252:1    0    4M  0 part
    |-vda2                       252:2    0  384M  0 part /boot
    `-vda4                       252:4    0 39.6G  0 part
      `-coreos-luks-root-nocrypt 253:0    0 39.6G  0 dm   /sysroot
    vdb                          252:16   0  512B  1 disk
    vdd                          252:32   0  256G  0 disk

    在这个示例中,新设备名称为 vdd

  14. 在新的 /dev/disk 可用后,您可以向 LocalVolume CR 添加新磁盘条目。

    1. 编辑 LocalVolume CR 并添加新 /dev/disk

      在本例中,新设备为 /dev/vdd

      # oc edit -n openshift-local-storage localvolume localblock

      输出示例:

      [...]
          storageClassDevices:
          - devicePaths:
          #  - /dev/vdc
            - /dev/vdd
            storageClassName: localblock
            volumeMode: Block
      [...]

      确保在编辑 CR 后保存更改。

  15. 验证是否有新 PV 处于 Available 状态且大小正确。

    $ oc get pv | grep 256Gi

    输出示例:

    local-pv-1e31f771   256Gi   RWO    Delete  Bound  openshift-storage/ocs-deviceset-localblock-2-data-0-6xhkf   localblock    24h
    local-pv-ec7f2b80   256Gi   RWO    Delete  Bound  openshift-storage/ocs-deviceset-localblock-1-data-0-hr2fx   localblock    24h
    local-pv-8137c873   256Gi   RWO    Delete  Available                                                          localblock    32m
  16. 为新设备创建一个新 OSD。

    部署新的 OSD。您需要重启 rook-ceph-operator 来强制协调 Operator。

    1. 识别 rook-ceph-operator 的名称。

      $ oc get -n openshift-storage pod -l app=rook-ceph-operator

      输出示例:

      NAME                                  READY   STATUS    RESTARTS   AGE
      rook-ceph-operator-85f6494db4-sg62v   1/1     Running   0          1d20h
    2. 删除 rook-ceph-operator

      $ oc delete -n openshift-storage pod rook-ceph-operator-85f6494db4-sg62v

      输出示例:

      pod "rook-ceph-operator-85f6494db4-sg62v" deleted

      在本例中,rook-ceph-operator pod 名称为 rook-ceph-operator-85f6494db4-sg62v

    3. 验证 rook-ceph-operator pod 是否已重启。

      $ oc get -n openshift-storage pod -l app=rook-ceph-operator

      输出示例:

      NAME                                  READY   STATUS    RESTARTS   AGE
      rook-ceph-operator-85f6494db4-wx9xx   1/1     Running   0          50s

      在操作器重启后,创建新 OSD 可能需要几分钟时间。

  17. 删除 ocs-osd-removal 任务。

    $ oc delete -n openshift-storage job ocs-osd-removal-job

    输出示例:

    job.batch "ocs-osd-removal-job" deleted
注意

使用带有数据加密的外部密钥管理系统(KMS)时,可以从 Vault 服务器中删除旧的 OSD 加密密钥,因为它现在是孤立的密钥。

验证步骤

  1. 验证是否有新的 OSD 正在运行。

    $ oc get -n openshift-storage pods -l app=rook-ceph-osd

    输出示例:

    rook-ceph-osd-0-76d8fb97f9-mn8qz   1/1     Running   0          23m
    rook-ceph-osd-1-7c99657cfb-jdzvz   1/1     Running   1          25h
    rook-ceph-osd-2-5f9f6dfb5b-2mnw9   1/1     Running   0          25h
  2. 验证是否创建了新 PVC。

    $ oc get -n openshift-storage pvc | grep localblock

    输出示例:

    ocs-deviceset-localblock-0-data-0-q4q6b   Bound    local-pv-8137c873       256Gi     RWO         localblock         10m
    ocs-deviceset-localblock-1-data-0-hr2fx   Bound    local-pv-ec7f2b80       256Gi     RWO         localblock         1d20h
    ocs-deviceset-localblock-2-data-0-6xhkf   Bound    local-pv-1e31f771       256Gi     RWO         localblock         1d20h
  3. 可选:如果在集群中启用了集群范围的加密,请验证新 OSD 设备是否已加密。

    1. 识别运行新 OSD pod 的节点。

      $ oc get -n openshift-storage -o=custom-columns=NODE:.spec.nodeName pod/<OSD-pod-name>
      <OSD-pod-name>

      是 OSD pod 的名称。

      例如:

      $ oc get -n openshift-storage -o=custom-columns=NODE:.spec.nodeName pod/rook-ceph-osd-0-544db49d7f-qrgqm

      输出示例:

      NODE
      compute-1
    2. 对于之前标识的每个节点,执行以下操作:

      1. 创建调试 pod,并为所选主机打开 chroot 环境。

        $ oc debug node/<node name>
        <node name>

        是节点的名称。

        $ chroot /host
      2. 检查 ocs-deviceset 名称旁边的 crypt 关键字。

        $ lsblk
  4. 登录 OpenShift Web 控制台,并在存储下的 OpenShift Data Foundation 控制面板中检查状态卡。
注意

根据正在恢复的数据量,完整数据恢复可能需要更长的时间。