第11章 OpenShift Data Foundation でのモニター Pod の復元
3 つすべてが停止している場合はモニター Pod を復元し、OpenShift Data Foundation がモニター Pod を自動的に復元できない場合は、モニター Pod を復元します。
これは障害復旧手順であり、Red Hat サポートチームの指導の下で実行する必要があります。Red Hat サポートチーム (Red Hat サポート) にお問い合わせください。
手順
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; doneオブジェクトストレージデバイス (OSD) デプロイメントにパッチを適用して
livenessProbeパラメーターを削除し、コマンドパラメーターを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": []}]}}}}' ; donetarを OSD にコピーします。for i in `oc get pods -l app=rook-ceph-osd -o name | sed -e "s/pod\///g"` ; do cat /usr/bin/tar | oc exec -i ${i} -- bash -c 'cat - >/usr/bin/tar' ; oc exec -i ${i} -- bash -c 'chmod +x /usr/bin/tar' ;done注記tar バイナリーを OSD にコピーする際は、
tarバイナリーが Pod のコンテナーイメージ OS と一致することを確認することが重要です。macOS、Ubuntu などの別の OS からバイナリーをコピーすると、互換性の問題が発生する可能性があります。すべての 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 exec $osd_pod -- mkdir $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を増やします。# for i in a b c ; do oc get deployment rook-ceph-mon-${i} -o yaml | sed "s/initialDelaySeconds: 10/initialDelaySeconds: 10000/g" | oc replace -f - ; donetarを MON Pod にコピーします。# for i in `oc get pods -l app=rook-ceph-mon -o name | sed -e "s/pod\///g"` ; do cat /usr/bin/tar | oc exec -i ${i} -- bash -c 'cat - >/usr/bin/tar' ; oc exec -i ${i} -- bash -c 'chmod +x /usr/bin/tar' ;done注記tar バイナリーを MON にコピーする際は、
tarバイナリーが Pod のコンテナーイメージ OS に一致することを確認することが重要です。macOS、Ubuntu などの別の OS からバイナリーをコピーすると、互換性の問題が発生する可能性があります。
以前に取得した
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 デーモン (OSD、MGR、MDS、RGW) のキーリングをそれぞれのシークレットから入力します。
# 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"デーモンキーリングを取得する場合は、次のコマンドを使用します。
# for i in `oc get secret | grep keyring| awk '{print $1}'` ; do oc get secret ${i} -ojson | jq .data.keyring | xargs echo | base64 -d ; done次のスクリプトを使用して OSD キーを取得します。
# for i in `oc get pods -l app=rook-ceph-osd -o name | sed -e "s/pod\///g"` ; do oc exec -i ${i} -- bash -c 'cat /var/lib/ceph/osd/ceph-*/keyring ' ;donemon キーリングをローカルでコピーし、前の手順でキャプチャーしたすべてのデーモンキーを追加して編集し、これを MON Pod の 1 つ (mon-a) にコピーして戻します。
oc cp $(oc get po -l app=rook-ceph-mon,mon=a -oname|sed -e "s/pod\///g"):/etc/ceph/keyring-store/..data/keyring /tmp/keyring-mon-avi /tmp/keyring-mon-aたとえば、キーリングファイルは以下のようになります。
[mon.] key = AQCbQLRn0j9mKhAAJKWmMZ483QIpMwzx/yGSLw== caps mon = "allow *" [mds.ocs-storagecluster-cephfilesystem-a] key = AQBFQbRnYuB9LxAA8i1fCSAKQQsPuywZ0Jlc5Q== caps mon = "allow profile mds" caps osd = "allow *" caps mds = "allow" [mds.ocs-storagecluster-cephfilesystem-b] key = AQBHQbRnwHAOEBAAv+rBpYP5W8BmC7gLfLyk1w== caps mon = "allow profile mds" caps osd = "allow *" caps mds = "allow" [osd.0] key = AQAvQbRnjF0eEhAA3H0l9zvKGZZM9Up6fJajhQ== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" [osd.1] key = AQA0QbRnq4cSGxAA7JpuK1+sq8gALNmMYFUMzw== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" [osd.2] key = AQA3QbRn6JvcOBAAFKruZQhlQJKUOi9oxcN6fw== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" [client.admin] key = AQCbQLRnSzOuLBAAK1cSgr2eIyrZV8mV28UfvQ== caps mds = "allow *" caps mon = "allow *" caps osd = "allow *" caps mgr = "allow *" [client.rgw.ocs.storagecluster.cephobjectstore.a] key = AQBTQbRny7NJLRAAPeTvK9kVg71/glbYLANGyw== caps mon = "allow rw" caps osd = "allow rwx" [mgr.a] key = AQD9QLRn8+xzDxAARqWQatoT9ruK76EpDS6iCw== caps mon = "allow profile mgr" caps mds = "allow *" caps osd = "allow *" [mgr.b] key = AQD9QLRnltZOIhAAexshUqdOr3G79HWYXUDGFg== caps mon = "allow profile mgr" caps mds = "allow *" caps osd = "allow *" [client.crash] key = AQD7QLRn6DDzCBAAEzhXRzGQUBUNTzC3nHntFQ== caps mon = "allow profile crash" caps mgr = "allow rw" [client.ceph-exporter] key = AQD7QLRntHzkGxAApQTkMVzcTiZn7jZbwK99SQ== caps mon = "allow profile ceph-exporter" caps mgr = "allow r" caps osd = "allow r" caps mds = "allow r"注記OSD キー出力に
capsエントリーが存在しない場合は、前のキーリングファイルの例で説明したように、すべての OSD 出力にcapsを追加してください。oc cp /tmp/keyring-mon-a $(oc get po -l app=rook-ceph-mon,mon=a -oname|sed -e "s/pod\///g"):/tmp/keyringmon-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 rook-ceph-operator --replicas=1# 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マルチクラウドオブジェクトゲートウェイ (MCG) のステータスを確認します。アクティブで、backingstore と bucketclass が
Ready状態になっている必要があります。noobaa status -n openshift-storage重要MCG がアクティブ状態でなく、backingstore と bucketclass が
Ready状態でない場合は、すべての MCG 関連 Pod を再起動する必要があります。詳細は、「Multicloud Object Gateway の復元」 を参照してください。
11.1. Multicloud Object Gateway の復元 リンクのコピーリンクがクリップボードにコピーされました!
Multicloud Object Gateway (MCG) がアクティブ状態でなく、backingstore および bucketclass が Ready 状態でない場合は、MCG 関連のすべての Pod を再起動し、MCG ステータスをチェックして、MCG がバックアップされ、および実行していることを確認する必要があります。
手順
MCG に関連するすべての Pod を再起動します。
# oc delete pods <noobaa-operator> -n openshift-storage# oc delete pods <noobaa-core> -n openshift-storage# oc delete pods <noobaa-endpoint> -n openshift-storage# oc delete pods <noobaa-db> -n openshift-storage<noobaa-operator>- MCG Operator の名前です。
<noobaa-core>- MCG コア Pod の名前です。
<noobaa-endpoint>- MCG エンドポイントの名前です。
<noobaa-db>- MCG db Pod の名前です。
RADOS Object Gateway (RGW) が設定されている場合は、Pod を再起動します。
# oc delete pods <rgw-pod> -n openshift-storage<rgw-pod>- RGW Pod の名前です。
OpenShift Container Platform 4.11 では、リカバリー後、RBD PVC がアプリケーション Pod にマウントされません。したがって、アプリケーション Pod をホストしているノードを再起動する必要があります。アプリケーション Pod をホストしているノード名を取得するには、次のコマンドを実行します。
# oc get pods <application-pod> -n <namespace> -o yaml | grep nodeName
nodeName: node_name