第10章 OpenShift Data Foundation でのモニター Pod の復元
3 つすべてが停止している場合はモニター Pod を復元し、OpenShift Data Foundation がモニター Pod を自動的に復元できない場合は、モニター Pod を復元します。
手順
rook-ceph-operatorおよびocs Operatorデプロイメントをスケールダウンします。# oc scale deployment rook-ceph-operator --replicas=0 -n openshift-storage# oc scale deployment ocs-operator --replicas=0 -n openshift-storageopenshift-storagenamespace ですべてのデプロイメントのバックアップを作成します。# mkdir backup# cd backup# oc project openshift-storage# for d in $(oc get deployment|awk -F' ' '{print $1}'|grep -v NAME); do echo $d;oc get deployment $d -o yaml > oc_get_deployment.${d}.yaml; donelivenessProbeパラメーターを削除するように OSD デプロイメントにパッチを適用し、コマンドパラメーターsleepを指定して実行します。# for i in $(oc get deployment -l app=rook-ceph-osd -oname);do oc patch ${i} -n openshift-storage --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]' ; oc patch ${i} -n openshift-storage -p '{"spec": {"template": {"spec": {"containers": [{"name": "osd", "command": ["sleep", "infinity"], "args": []}]}}}}' ; doneすべての OSD から
monstoreクラスターマップを取得します。recover_mon.shスクリプトを作成します。#!/bin/bash ms=/tmp/monstore rm -rf $ms mkdir $ms for osd_pod in $(oc get po -l app=rook-ceph-osd -oname -n openshift-storage); do echo "Starting with pod: $osd_pod" podname=$(echo $osd_pod|sed 's/pod\///g') oc exec $osd_pod -- rm -rf $ms oc cp $ms $podname:$ms rm -rf $ms mkdir $ms echo "pod in loop: $osd_pod ; done deleting local dirs" oc exec $osd_pod -- ceph-objectstore-tool --type bluestore --data-path /var/lib/ceph/osd/ceph-$(oc get $osd_pod -ojsonpath='{ .metadata.labels.ceph_daemon_id }') --op update-mon-db --no-mon-config --mon-store-path $ms echo "Done with COT on pod: $osd_pod" oc cp $podname:$ms $ms echo "Finished pulling COT data from pod: $osd_pod" donerecover_mon.shスクリプトを実行します。# chmod +x recover_mon.sh# ./recover_mon.sh
MON デプロイメントにパッチを適用し、コマンドパラメーターを
sleepとして実行します。MON デプロイメントを編集します。
# for i in $(oc get deployment -l app=rook-ceph-mon -oname);do oc patch ${i} -n openshift-storage -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'; doneMON デプロイメントにパッチを適用して、
initialDelaySecondsを増やします。# oc get deployment rook-ceph-mon-a -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 2000/g" | oc replace -f -# oc get deployment rook-ceph-mon-b -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 2000/g" | oc replace -f -# oc get deployment rook-ceph-mon-c -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 2000/g" | oc replace -f -
以前に取得した
monstoreを mon-a Pod にコピーします。# oc cp /tmp/monstore/ $(oc get po -l app=rook-ceph-mon,mon=a -oname |sed 's/pod\///g'):/tmp/MON Pod に移動し、取得した
monstoreの所有権を変更します。# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)# chown -R ceph:ceph /tmp/monstoremon dbを再構築する前に、キーリングテンプレートファイルをコピーします。# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)# cp /etc/ceph/keyring-store/keyring /tmp/keyring# cat /tmp/keyring [mon.] key = AQCleqldWqm5IhAAgZQbEzoShkZV42RiQVffnA== caps mon = "allow *" [client.admin] key = AQCmAKld8J05KxAArOWeRAw63gAwwZO5o75ZNQ== auid = 0 caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *”それぞれのシークレットから、他のすべての Ceph デーモン (MGR、MDS、RGW、Crash、CSI、および CSI プロビジョナー) のキーリングを特定します。
# oc get secret rook-ceph-mds-ocs-storagecluster-cephfilesystem-a-keyring -ojson | jq .data.keyring | xargs echo | base64 -d [mds.ocs-storagecluster-cephfilesystem-a] key = AQB3r8VgAtr6OhAAVhhXpNKqRTuEVdRoxG4uRA== caps mon = "allow profile mds" caps osd = "allow *" caps mds = "allow"キーリングファイルのサンプル
/etc/ceph/ceph.client.admin.keyring:[mon.] key = AQDxTF1hNgLTNxAAi51cCojs01b4I5E6v2H8Uw== caps mon = "allow " [client.admin] key = AQDxTF1hpzguOxAA0sS8nN4udoO35OEbt3bqMQ== caps mds = "allow " caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" [mds.ocs-storagecluster-cephfilesystem-a] key = AQCKTV1horgjARAA8aF/BDh/4+eG4RCNBCl+aw== caps mds = "allow" caps mon = "allow profile mds" caps osd = "allow *" [mds.ocs-storagecluster-cephfilesystem-b] key = AQCKTV1hN4gKLBAA5emIVq3ncV7AMEM1c1RmGA== caps mds = "allow" caps mon = "allow profile mds" caps osd = "allow *" [client.rgw.ocs.storagecluster.cephobjectstore.a] key = AQCOkdBixmpiAxAA4X7zjn6SGTI9c1MBflszYA== caps mon = "allow rw" caps osd = "allow rwx" [mgr.a] key = AQBOTV1hGYOEORAA87471+eIZLZtptfkcHvTRg== caps mds = "allow *" caps mon = "allow profile mgr" caps osd = "allow *" [client.crash] key = AQBOTV1htO1aGRAAe2MPYcGdiAT+Oo4CNPSF1g== caps mgr = "allow rw" caps mon = "allow profile crash" [client.csi-cephfs-node] key = AQBOTV1hiAtuBBAAaPPBVgh1AqZJlDeHWdoFLw== caps mds = "allow rw" caps mgr = "allow rw" caps mon = "allow r" caps osd = "allow rw tag cephfs *=" [client.csi-cephfs-provisioner] key = AQBNTV1hHu6wMBAAzNXZv36aZJuE1iz7S7GfeQ== caps mgr = "allow rw" caps mon = "allow r" caps osd = "allow rw tag cephfs metadata=" [client.csi-rbd-node] key = AQBNTV1h+LnkIRAAWnpIN9bUAmSHOvJ0EJXHRw== caps mgr = "allow rw" caps mon = "profile rbd" caps osd = "profile rbd" [client.csi-rbd-provisioner] key = AQBNTV1hMNcsExAAvA3gHB2qaY33LOdWCvHG/A== caps mgr = "allow rw" caps mon = "profile rbd" caps osd = "profile rbd"重要-
client.csi関連のキーリングについては、前のキーリングファイルの出力を参照し、それぞれの OpenShift Data Foundation シークレットからキーをフェッチした後、デフォルトのcapsを追加します。 - OSD キーリングは、復元後に自動的に追加されます。
-
mon-a Pod に移動し、
monstoreにmonmapがあることを確認します。mon-a Pod に移動します。
# oc rsh $(oc get po -l app=rook-ceph-mon,mon=a -oname)monstoreにmonmapがあることを確認します。# ceph-monstore-tool /tmp/monstore get monmap -- --out /tmp/monmap# monmaptool /tmp/monmap --print
オプション:
monmapがない場合は、新しいmonmapを作成します。# monmaptool --create --add <mon-a-id> <mon-a-ip> --add <mon-b-id> <mon-b-ip> --add <mon-c-id> <mon-c-ip> --enable-all-features --clobber /root/monmap --fsid <fsid><mon-a-id>- mon-a Pod の ID です。
<mon-a-ip>- mon-a Pod の IP アドレスです。
<mon-b-id>- mon-b Pod の ID です。
<mon-b-ip>- mon-b Pod の IP アドレスです。
<mon-c-id>- mon-c Pod の ID です。
<mon-c-ip>- mon-c Pod の IP アドレスです。
<fsid>- ファイルシステム ID です。
monmapを確認します。# monmaptool /root/monmap --printmonmapをインポートします。重要以前に作成した キーリング ファイルを使用します。
# ceph-monstore-tool /tmp/monstore rebuild -- --keyring /tmp/keyring --monmap /root/monmap# chown -R ceph:ceph /tmp/monstore以前の
store.dbファイルのバックアップを作成します。# mv /var/lib/ceph/mon/ceph-a/store.db /var/lib/ceph/mon/ceph-a/store.db.corrupted# mv /var/lib/ceph/mon/ceph-b/store.db /var/lib/ceph/mon/ceph-b/store.db.corrupted# mv /var/lib/ceph/mon/ceph-c/store.db /var/lib/ceph/mon/ceph-c/store.db.corrupted再構築した
store.dbファイルをmonstoreディレクトリーにコピーします。# mv /tmp/monstore/store.db /var/lib/ceph/mon/ceph-a/store.db# chown -R ceph:ceph /var/lib/ceph/mon/ceph-a/store.dbmonstoreディレクトリーを再構築したら、store.dbファイルをローカルから残りの MON Pod にコピーします。# oc cp $(oc get po -l app=rook-ceph-mon,mon=a -oname | sed 's/pod\///g'):/var/lib/ceph/mon/ceph-a/store.db /tmp/store.db# oc cp /tmp/store.db $(oc get po -l app=rook-ceph-mon,mon=<id> -oname | sed 's/pod\///g'):/var/lib/ceph/mon/ceph-<id><id>- MON Pod の ID です。
残りの MON Pod に移動し、コピーした
monstoreの所有権を変更します。# oc rsh $(oc get po -l app=rook-ceph-mon,mon=<id> -oname)# chown -R ceph:ceph /var/lib/ceph/mon/ceph-<id>/store.db<id>- MON Pod の ID です。
パッチが適用された変更を元に戻します。
MON デプロイメントの場合:
# oc replace --force -f <mon-deployment.yaml><mon-deployment.yaml>- MON デプロイメントの yaml ファイルです。
OSD デプロイメントの場合:
# oc replace --force -f <osd-deployment.yaml><osd-deployment.yaml>- OSD デプロイメントの yaml ファイルです。
MGR デプロイメントの場合:
# oc replace --force -f <mgr-deployment.yaml><mgr-deployment.yaml>MGR デプロイメントの yaml ファイルです。
重要MON、Milla、および OSD Pod が稼働していることを確認します。
rook-ceph-operatorおよびocs-operatorデプロイメントをスケールアップします。# oc -n openshift-storage scale deployment ocs-operator --replicas=1
検証手順
Ceph のステータスをチェックして、CephFS が実行していることを確認します。
# ceph -s出力例:
cluster: id: f111402f-84d1-4e06-9fdb-c27607676e55 health: HEALTH_ERR 1 filesystem is offline 1 filesystem is online with fewer MDS than max_mds 3 daemons have recently crashed services: mon: 3 daemons, quorum b,c,a (age 15m) mgr: a(active, since 14m) mds: ocs-storagecluster-cephfilesystem:0 osd: 3 osds: 3 up (since 15m), 3 in (since 2h) data: pools: 3 pools, 96 pgs objects: 500 objects, 1.1 GiB usage: 5.5 GiB used, 295 GiB / 300 GiB avail pgs: 96 active+clean重要ファイルシステムがオフラインであるか、MDS サービスが見つからない場合は、CephFS を復元する必要があります。詳細は、「CephFS の復元」 を参照してください。
マルチクラウドオブジェクトゲートウェイ (MCG) のステータスを確認します。アクティブで、backingstore と bucketclass が
Ready状態になっている必要があります。noobaa status -n openshift-storage重要MCG がアクティブ状態でなく、backingstore と bucketclass が
Ready状態でない場合は、すべての MCG 関連 Pod を再起動する必要があります。詳細は、「Multicloud Object Gateway の復元」 を参照してください。
10.1. CephFS の復元 リンクのコピーリンクがクリップボードにコピーされました!
ファイルシステムがオフラインであるか、MDS サービスが見つからない場合は、CephFS を復元する必要があります。
手順
rook-ceph-operatorおよびocs Operatorデプロイメントをスケールダウンします。# oc scale deployment rook-ceph-operator --replicas=0 -n openshift-storage# oc scale deployment ocs-operator --replicas=0 -n openshift-storageMDS デプロイメントにパッチを適用して、
livenessProbeパラメーターを削除し、コマンドパラメーターsleepを使用して実行します。# for i in $(oc get deployment -l app=rook-ceph-mds -oname);do oc patch ${i} -n openshift-storage --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]' ; oc patch ${i} -n openshift-storage -p '{"spec": {"template": {"spec": {"containers": [{"name": "mds", "command": ["sleep", "infinity"], "args": []}]}}}}' ; doneCephFS を復元します。
# ceph fs reset ocs-storagecluster-cephfilesystem --yes-i-really-mean-itresetコマンドが失敗した場合は、データおよびメタデータプールを使用してデフォルトのファイルシステムを強制的に作成し、リセットします。注記cephfilesystemがない場合は、resetコマンドが失敗する場合があります。# ceph fs new ocs-storagecluster-cephfilesystem ocs-storagecluster-cephfilesystem-metadata ocs-storagecluster-cephfilesystem-data0 --force# ceph fs reset ocs-storagecluster-cephfilesystem --yes-i-really-mean-itMDS デプロイメントを置き換えます。
# oc replace --force -f oc_get_deployment.rook-ceph-mds-ocs-storagecluster-cephfilesystem-a.yaml# oc replace --force -f oc_get_deployment.rook-ceph-mds-ocs-storagecluster-cephfilesystem-b.yamlrook-ceph-operatorおよびocs-operatorデプロイメントをスケールアップします。# oc scale deployment ocs-operator --replicas=1 -n openshift-storageCephFS のステータスを確認します。
# ceph fs statusステータスは active である必要があります。
CephFS Persistent Volume Claim(永続ボリューム要求、PVC) を使用していたデプロイメントに割り当てられたアプリケーション Pod が、CephFS の復元後に
CreateContainerError状態のままになる場合は、アプリケーション Pod を再起動します。# oc -n <namespace> delete pods <cephfs-app-pod><namespace>- プロジェクトの namespace です。
<cephfs-app-pod>- CephFS アプリケーション Pod の名前です。
- 新規 CephFS または RBD PVC がバインドされない場合は、Ceph CSI に関連するすべての Pod を再起動します。