4.3. ローカルストレージデバイスがサポートするクラスターで動作するストレージデバイスまたは障害のあるストレージデバイスの置き換え
ベアメタルおよび VMware インフラストラクチャーでローカルストレージデバイスを使用してデプロイされた OpenShift Container Storage のオブジェクトストレージデバイス (OSD) を置き換えることができます。基盤のストレージデバイスを 1 つまたは複数置き換える必要がある場合は、この手順を使用します。
前提条件
- Red Hat では、交換前のノードと同様のインフラストラクチャーおよびリソースで、交換後のノードを設定することを推奨します。
-
以前のバージョンから OpenShift Container Storage 4.6 にアップグレードした場合、アップグレード後の手順に従って
LocalVolumeDiscovery
オブジェクトを作成していることを確認します。詳細は、更新後の設定の変更について参照してください。 -
以前のバージョンから OpenShift Container Storage 4.6 にアップグレードした場合、アップグレード後の手順に従って
LocalVolumeSet
オブジェクトを作成していることを確認します。詳細は、更新後の設定の変更について参照してください。
手順
置き換える必要がある 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
を置き換える必要があり、compute-2
は OSD がスケジュールされる OpenShift Container platform ノードです。注記置き換える OSD が正常である場合、Pod のステータスは
Running
になります。置き換えられる 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
はrook-ceph-osd
プレフィックスの直後にくる Pod 名の整数です。この例では、デプロイメント名はrook-ceph-osd-0
です。出力例:
deployment.extensions/rook-ceph-osd-0 scaled
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-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
新規 OSD を追加できるようにクラスターから古い OSD を削除します。
古い
ocs-osd-removal
ジョブを削除します。$ oc delete -n openshift-storage job ocs-osd-removal-${osd_id_to_remove}
出力例:
job.batch "ocs-osd-removal-0" deleted
openshift-storage
プロジェクトを変更します。$ oc project openshift-storage
クラスターから以前の OSD を削除します。
$ oc process -n openshift-storage ocs-osd-removal -p FAILED_OSD_IDS=${osd_id_to_remove} |oc create -n openshift-storage -f -
警告この手順により、OSD はクラスターから完全に削除されます。
osd_id_to_remove
の正しい値が指定されていることを確認します。
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
暗号化がインストール時に有効にされている場合は、それぞれの OpenShift Container Storage ノードから削除された OSD デバイスから
dm-crypt
で管理されるdevice-mapper
マッピングを削除します。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"
手順 #1 で特定されたノードごとに、以下を実行します。
デバッグ
Pod を作成し、ストレージノードのホストに対してchroot
を作成します。$ oc debug node/<node name> $ chroot /host
直前の手順で特定された PVC 名に基づいて関連するデバイス名を検索します。
sh-4.4# dmsetup ls| grep <pvc name> ocs-deviceset-xxx-xxx-xxx-xxx-block-dmcrypt (253:0)
マップ済みデバイスを削除します。
$ cryptsetup luksClose --debug --verbose ocs-deviceset-xxx-xxx-xxx-xxx-block-dmcrypt
注記権限が十分にないため、コマンドがスタックした場合には、以下のコマンドを実行します。
-
CTRL+Z
を押して上記のコマンドを終了します。 スタックしたプロセスの PID を検索します。
$ ps -ef | grep crypt
kill
コマンドを使用してプロセスを終了します。$ kill -9 <PID>
デバイス名が削除されていることを確認します。
$ dmsetup ls
-
コマンドで削除する必要のある永続ボリューム (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
永続ボリュームを削除します。
$ oc delete pv local-pv-d6bf175b
物理的に新規デバイスをノードに追加します。
以前デバイスを削除することもできます (オプション)。
以下のコマンドを使用して、
deviceInclusionSpec
に一致するデバイスの永続ボリュームのプロビジョニングを追跡します。永続ボリュームをプロビジョニングするのに数分かかる場合があります。$ oc -n openshift-local-storage describe localvolumeset localblock
出力例:
[...] Status: Conditions: Last Transition Time: 2020-11-17T05:03:32Z Message: DiskMaker: Available, LocalProvisioner: Available Status: True Type: DaemonSetsAvailable Last Transition Time: 2020-11-17T05:03:34Z Message: Operator reconciled successfully. Status: True Type: Available Observed Generation: 1 Total Provisioned Device Count: 4 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Discovered 2m30s (x4 localvolumeset- node.example.com - NewDevice over 2m30s) symlink-controller found possible matching disk, waiting 1m to claim Normal FoundMatch 89s (x4 localvolumeset- node.example.com - ingDisk over 89s) symlink-controller symlinking matching disk
永続ボリュームがプロビジョニングされると、新しい OSD Pod がプロビジョニングボリューム用に自動作成されます。
ocs-osd-removal
ジョブを削除します。$ oc delete -n openshift-storage job ocs-osd-removal-${osd_id_to_remove}
検証手順
新しい OSD が実行されていることを確認します。
$ 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
注記数分後に新規 OSD が
Running
と表示されない場合は、rook-ceph-operator
Pod を再起動して強制的に調整を行います。$ oc delete pod -n openshift-storage -l app=rook-ceph-operator
出力例:
pod "rook-ceph-operator-6f74fb5bff-2d982" deleted
新規 PVC が作成されていることを確認します。
# 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
(オプション) クラスターでデータの暗号化が有効な場合には、新規 OSD デバイスが暗号化されていることを確認します。
新規 OSD Pod が実行しているノードを特定します。
$ oc get -o=custom-columns=NODE:.spec.nodeName pod/<OSD pod name>
以下は例になります。
oc get -o=custom-columns=NODE:.spec.nodeName pod/rook-ceph-osd-0-544db49d7f-qrgqm
直前の手順で特定されたノードごとに、以下を実行します。
デバッグ Pod を作成し、選択したホストの chroot 環境を開きます。
$ oc debug node/<node name> $ chroot /host
「lsblk」を実行し、
ocs-deviceset
名の横にある「crypt」キーワードを確認します。$ lsblk
OpenShift Web コンソールにログインし、ストレージダッシュボードで OSD のステータスを確認します。
図4.6 デバイスの置き換え後の OpenShift Container Platform ストレージダッシュボードの OSD ステータス
データの完全復旧には、復元されるデータ量により、時間がかかる場合があります。