10.3.2. VMware およびベアメタルインフラストラクチャーで動作するストレージデバイスまたは失敗したストレージデバイスの置き換え

ベアメタルおよび VMware インフラストラクチャーでローカルストレージデバイスを使用してデプロイされた OpenShift Container Storage のオブジェクトストレージデバイス (OSD) を置き換えることができます。基礎となるストレージデバイスを置き換える必要がある場合は、この手順を使用します。

手順

  1. 置き換える必要がある OSD と、その OSD がスケジュールされている OpenShift Container Platform ノードを特定します。

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

    出力例:

    rook-ceph-osd-0-6d77d6c7c6-m8xj6    0/1    CrashLoopBackOff    0    24h   10.129.0.16   compute-2   <none>           <none>
    rook-ceph-osd-1-85d99fb95f-2svc7    1/1    Running    0    24h   10.128.2.24   compute-0   <none>           <none>
    rook-ceph-osd-2-6c66cdb977-jp542    1/1    Running    0    24h   10.130.0.18   compute-1   <none>           <none>

    この例では、置き換える必要があるのは rook-ceph-osd-0-6d77d6c7c6-m8xj6 であり、OSD がスケジュールされている OCP ノードは compute-2 です。

    注記

    置き換える 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_removerook-ceph-osd プレフィックスの直後にくる Pod 名の整数です。この例では、デプロイメント名は 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 pod rook-ceph-osd-0-6d77d6c7c6-m8xj6 --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-6d77d6c7c6-m8xj6" force deleted
  4. 新規 OSD を追加できるようにクラスターから古い OSD を削除します。

    1. 古い ocs-osd-removal ジョブを削除します。

      # oc delete job ocs-osd-removal-${osd_id_to_remove}

      出力例:

      job.batch "ocs-osd-removal-0" deleted
    2. クラスターから以前の OSD を削除します。

      # oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_ID=${osd_id_to_remove} | oc create -f -
      警告

      この手順により、OSD はクラスターから完全に削除されます。osd_id_to_remove の正しい値が指定されていることを確認します。

  5. ocs-osd-removal Pod のステータスをチェックして、OSD が正常に削除されたことを確認します。Completed のステータスで、OSD の削除ジョブが正常に完了したことを確認します。

    # oc get pod -l job-name=ocs-osd-removal-${osd_id_to_remove} -n openshift-storage
    注記

    ocs-osd-removal が失敗し、Pod が予想される Completed の状態にない場合、追加のデバッグのために Pod ログを確認します。以下に例を示します。

    # oc logs -l job-name=ocs-osd-removal-${osd_id_to_remove} -n openshift-storage --tail=-1
  6. 置き換える OSD に関連付けられた Persistent Volume Claim (永続ボリューム要求、PVC) リソースを削除します。

    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-0-0-nvs68
          ceph.rook.io/pvc: ocs-deviceset-0-0-nvs68

      この例では、PVC 名は OCS-deviceset-0-0-nvs68 です。

    2. PVC に関連付けられた PV を特定します。

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

      ここで、xy、および pvc-suffix は、直前の手順で特定された DeviceSet の値です。

      出力例:

      NAME                      STATUS        VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      ocs-deviceset-0-0-nvs68   Bound   local-pv-d9c5cbd6   1490Gi     RWO            localblock     24h

      この例では、関連付けられた PV は local-pv-d9c5cbd6 です。

    3. 置き換えるデバイスの名前を特定します。

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

      ここで、pv-suffix は、前のステップで特定された PV 名の値です。

      出力例:

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

      この例では、デバイス名は nvme0n1 です。

    4. 置き換える OSD に関連付けられた prepare-pod を特定します。

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

      ここで、xy、および pvc-suffix は、直前の手順で特定された DeviceSet の値です。

      出力例:

      Mounted By:    rook-ceph-osd-prepare-ocs-deviceset-0-0-nvs68-zblp7

      この例では、prepare-pod 名は rook-ceph-osd-prepare-ocs-deviceset-0-0-nvs68-zblp7 です。

    5. 関連付けられた PVC を削除する前に osd-prepare Pod を削除します。

      # oc delete -n openshift-storage pod rook-ceph-osd-prepare-ocs-deviceset-<x>-<y>-<pvc-suffix>-<pod-suffix>

      ここで、xypvc-suffix、および pod-suffix は、直前の手順で特定された osd-prepare Pod 名の値です。

      出力例:

      pod "rook-ceph-osd-prepare-ocs-deviceset-0-0-nvs68-zblp7" deleted
    6. 置き換える OSD に関連付けられた PVC を削除します。

      # oc delete -n openshift-storage pvc ocs-deviceset-<x>-<y>-<pvc-suffix>

      ここで、xy、および pvc-suffix は、直前の手順で特定された DeviceSet の値です。

      出力例:

      persistentvolumeclaim "ocs-deviceset-0-0-nvs68" deleted
  7. 古いデバイスを置き換え、新規デバイスを使用して新規の OpenShift Container Platform PV を作成します。

    1. 置き換えるデバイスのある OpenShift Container Platform ノードにログインします。この例では、OpenShift Container Platform ノードは compute-2 です。

      # oc debug node/compute-2

      出力例:

      Starting pod/compute-2-debug ...
      To use host binaries, run `chroot /host`
      Pod IP: 10.70.56.66
      If you don't see a command prompt, try pressing enter.
      # chroot /host
    2. 先に特定したデバイス名 nvme0n1 を使用して置き換える /dev/disk/by-id/{id} を記録します。

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

      出力例:

      total 0
      drwxr-xr-x. 2 root root 51 Aug 18 19:05 .
      drwxr-xr-x. 3 root root 24 Aug 18 19:05 ..
      lrwxrwxrwx. 1 root root 57 Aug 18 19:05 nvme0n1 -> /dev/disk/by-id/nvme-eui.01000000010000005cd2e4de2f0f5251
    3. LocalVolume CR の名前を見つけ、置き換えるデバイス /dev/disk/by-id/{id} を削除またはコメントアウトします。

      # oc get -n local-storage localvolume
      NAME          AGE
      local-block   25h
      # oc edit -n local-storage localvolume local-block

      出力例:

      [...]
          storageClassDevices:
          - devicePaths:
            - /dev/disk/by-id/nvme-eui.01000000010000005cd2e4895e0e5251
            - /dev/disk/by-id/nvme-eui.01000000010000005cd2e4ea2f0f5251
        #   - /dev/disk/by-id/nvme-eui.01000000010000005cd2e4de2f0f5251
            storageClassName: localblock
            volumeMode: Block
      [...]

      CR の編集後に変更を保存するようにしてください。

  8. 置き換えるデバイスで OpenShift Container Platform ノードにログインし、古いsymlink を削除します。

    # oc debug node/compute-2

    出力例:

    Starting pod/compute-2-debug ...
    To use host binaries, run `chroot /host`
    Pod IP: 10.70.56.66
    If you don't see a command prompt, try pressing enter.
    # chroot /host
    1. 置き換えるデバイス名の古い symlink を特定します。この例では、デバイス名は nvme0n1 です。

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

      出力例:

      total 0
      drwxr-xr-x. 2 root root 51 Aug 18 19:05 .
      drwxr-xr-x. 3 root root 24 Aug 18 19:05 ..
      lrwxrwxrwx. 1 root root 57 Aug 18 19:05 nvme0n1 -> /dev/disk/by-id/nvme-eui.01000000010000005cd2e4de2f0f5251
    2. symlink を削除します。

      # rm /mnt/local-storage/localblock/nvme0n1
    3. symlink が削除されていることを確認します。

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

      出力例:

      total 0
      drwxr-xr-x. 2 root root 17 Apr 10 00:56 .
      drwxr-xr-x. 3 root root 24 Apr  8 23:03 ..
      重要

      OpenShift Container Storage 4.5 以降の新規デプロイメントでは、LVM が使用されていないため、ceph-volume raw モードが動作します。そのため、追加の検証は不要であり、次のステップに進むことができます。

      OpenShift Container Storage 4.4 の場合、または OpenShift Container Storage が以前のバージョンからバージョン 4.5 にアップグレードされた場合、/dev/mapper/dev/ の両方をチェックし、移行前に ceph に関連する孤立したオブジェクトがあるかどうかを確認します。vgdisplay の結果を使用して、これらの孤立を見つけます。/dev/mapper または /dev/ceph-* に、VG 名の一覧にない名前に ceph が設定されている場合は、dmsetup を使用してこれを削除します。

  9. 先の手順で特定された、置き換えるデバイスに関連付けられた PV を削除します。この例では、PV 名は local-pv-d9c5cbd6 です。

    # oc delete pv local-pv-d9c5cbd6

    出力例:

    persistentvolume "local-pv-d9c5cbd6" deleted
  10. デバイスを新しいデバイスに置き換えます。
  11. 正しい OpenShift Container Platform ノードにログインし、新規ドライブのデバイス名を特定します。デバイス名は古いデバイスと同じにすることができますが、同じデバイスを使用しない限り by-id は変更する必要があります。

    # lsblk

    出力例:

    NAME                         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda                            8:0    0   120G  0 disk
    |-sda1                         8:1    0   384M  0 part /boot
    |-sda2                         8:2    0   127M  0 part /boot/efi
    |-sda3                         8:3    0     1M  0 part
    `-sda4                         8:4    0 119.5G  0 part
      `-coreos-luks-root-nocrypt 253:0    0 119.5G  0 dm   /sysroot
    nvme0n1                      259:0    0   1.5T  0 disk

    この例では、新しいデバイス名は nvme0n1 です。

    1. 新規デバイスの /dev/disk/by-id/{id} を特定し、これを記録します。

      # ls -alh /dev/disk/by-id | grep nvme0n1

      出力例:

      lrwxrwxrwx. 1 root root 57 Aug 18 19:05 nvme0n1 -> /dev/disk/by-id/nvme-eui.01000000010000005cd2e4ce090e5251
  12. 新規の /dev/disk/by-id/{id} が利用可能になると、新規ディスクエントリーを LocalVolume CR に追加できます。

    1. LocalVolume CR の名前を検索します。

      # oc get -n local-storage localvolume
      NAME          AGE
      local-block   25h
    2. LocalVolume CR を編集し、新規の /dev/disk/by-id/{id} を追加します。この例では、新しいデバイスは /dev/disk/by-id/nvme-eui.01000000010000005cd2e4ce090e5251 です。

      # oc edit -n local-storage localvolume local-block

      出力例:

      [...]
          storageClassDevices:
          - devicePaths:
            - /dev/disk/by-id/nvme-eui.01000000010000005cd2e4895e0e5251
            - /dev/disk/by-id/nvme-eui.01000000010000005cd2e4ea2f0f5251
        #   - /dev/disk/by-id/nvme-eui.01000000010000005cd2e4de2f0f5251
            - /dev/disk/by-id/nvme-eui.01000000010000005cd2e4ce090e5251
            storageClassName: localblock
            volumeMode: Block
      [...]

      CR の編集後に変更を保存するようにしてください。

  13. 新規 PV が Available 状態にあり、正しいサイズであることを確認します。

    # oc get pv | grep 1490Gi

    出力例:

    local-pv-3e8964d3                          1490Gi      RWO            Delete           Bound       openshift-storage/ocs-deviceset-2-0-79j94   localblock                             25h
    local-pv-414755e0                          1490Gi      RWO            Delete           Bound       openshift-storage/ocs-deviceset-1-0-959rp   localblock                             25h
    local-pv-b481410                           1490Gi      RWO            Delete           Available
  14. 新規デバイス用に新規 OSD を作成します。

    1. 置き換えられる OSD のデプロイメントを削除します。

      # osd_id_to_remove=0
      # oc delete -n openshift-storage deployment rook-ceph-osd-${osd_id_to_remove}

      出力例:

      deployment.extensions/rook-ceph-osd-0 deleted
    2. rook-ceph-operator を再起動して Operator の調整を強制的に実行して新規 OSD をデプロイします。

      1. rook-ceph-operator の名前を特定します。

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

        出力例:

        NAME                                  READY   STATUS    RESTARTS   AGE
        rook-ceph-operator-6f74fb5bff-2d982   1/1     Running   0          1d20h
      2. rook-ceph-operator を削除します。

        # oc delete -n openshift-storage pod rook-ceph-operator-6f74fb5bff-2d982

        出力例:

        pod "rook-ceph-operator-6f74fb5bff-2d982" deleted

        この例では、rook-ceph-operator Pod 名は rook-ceph-operator-6f74fb5bff-2d982 です。

      3. rook-ceph-operator Pod が再起動していることを確認します。

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

        出力例:

        NAME                                  READY   STATUS    RESTARTS   AGE
        rook-ceph-operator-6f74fb5bff-7mvrq   1/1     Running   0          66s

        新規 OSD の作成には、Operator が再起動するまでに数分かかる場合があります。

検証手順

  • 新しい OSD が実行されており、新規 PVC が作成されていることを確認します。

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

    出力例:

    rook-ceph-osd-0-5f7f4747d4-snshw                                  1/1     Running     0          4m47s
    rook-ceph-osd-1-85d99fb95f-2svc7                                  1/1     Running     0          1d20h
    rook-ceph-osd-2-6c66cdb977-jp542                                  1/1     Running     0          1d20h
    # oc get -n openshift-storage pvc | grep localblock

    出力例:

    ocs-deviceset-0-0-c2mqb   Bound    local-pv-b481410                          1490Gi     RWO            localblock                    5m
    ocs-deviceset-1-0-959rp   Bound    local-pv-414755e0                         1490Gi     RWO            localblock                    1d20h
    ocs-deviceset-2-0-79j94   Bound    local-pv-3e8964d3                         1490Gi     RWO            localblock                    1d20h
  • OpenShift Web コンソールにログインし、ストレージダッシュボードを表示します。

    図10.2 デバイスの置き換え後の OpenShift Container Platform ストレージダッシュボードの OSD ステータス

    OCP storage dashboard showing the healthy OSD.