第12章 OpenShift Data Foundation での ceph-monitor クォーラムの復元
状況によっては、ceph-mons
がクォーラムを失う可能性があります。mons
が再びクォーラムを形成できない場合は、クォーラムを再度取得する手動の手順があります。唯一の要件は、1 つ以上の mon
が正常である必要があることです。以下の手順は、正常でない mon
をクォーラムから削除し、単一の mon
でクォーラムを再度作成してから、クォーラムを元のサイズに戻すことができます。
たとえば、3 つの mons
があり、クォーラムが失われる場合は、クォーラムから 2 つの悪い mons
を削除して、適切な mon
がクォーラムの唯一の mon
であることを通知してから、適切なmon
を再起動する必要があります。
手順
monmap
を変更する場合にmons
がフェイルオーバーしないように、rook-ceph-operator
を停止します。# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=0
新しい
monmap
を注入します。警告monmap
は非常に慎重に注入する必要があります。誤って実行すると、クラスターは永続的に破棄される可能性があります。Cephmonmap
は、mon
クォーラムを追跡します。monmap
は、正常な mon のみが含まれるように更新されます。この例では、正常な mon はrook-ceph-mon-b
ですが、正常でないmon
はrook-ceph-mon-a
およびrook-ceph-mon-c
になります。現在の
rook-ceph-mon-b
デプロイメントのバックアップを作成します。# oc -n openshift-storage get deployment rook-ceph-mon-b -o yaml > rook-ceph-mon-b-deployment.yaml
YAML ファイルを開き、コマンド および 引数 を
mon
コンテナーからコピーします (以下の例の containers リストを参照)。これは、monmap
の変更に必要です。[...] containers: - args: - --fsid=41a537f2-f282-428e-989f-a9e07be32e47 - --keyring=/etc/ceph/keyring-store/keyring - --log-to-stderr=true - --err-to-stderr=true - --mon-cluster-log-to-stderr=true - '--log-stderr-prefix=debug ' - --default-log-to-file=false - --default-mon-cluster-log-to-file=false - --mon-host=$(ROOK_CEPH_MON_HOST) - --mon-initial-members=$(ROOK_CEPH_MON_INITIAL_MEMBERS) - --id=b - --setuser=ceph - --setgroup=ceph - --foreground - --public-addr=10.100.13.242 - --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db - --public-bind-addr=$(ROOK_POD_IP) command: - ceph-mon [...]
コピーした
command
およびargs
フィールドを、以下のように貼り付け可能なコマンドを形成するためにクリーンアップします。# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP
注記--log-stderr-prefix
フラグおよび括弧の周りの一重引用符を必ず削除し、ROOK_CEPH_MON_HOST
、ROOK_CEPH_MON_INITIAL_MEMBERS
、およびROOK_POD_IP
) に渡されます。rook-ceph-mon-b
デプロイメントにパッチを適用し、mon
Pod を削除せずにこのmon
の作業を停止します。# oc -n openshift-storage patch deployment rook-ceph-mon-b --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]' # oc -n openshift-storage patch deployment rook-ceph-mon-b -p '{"spec": {"template": {"spec": {"containers": [{"name": "mon", "command": ["sleep", "infinity"], "args": []}]}}}}'
mon-b
Pod で以下の手順を実行します。正常な
mon
の Pod に接続し、以下のコマンドを実行します。# oc -n openshift-storage exec -it <mon-pod> bash
変数を設定します。
# monmap_path=/tmp/monmap
ceph
mon
を適切なmon
デプロイメントから貼り付け、--extract-monmap=${monmap_path}
フラグを追加して、monmap
をファイルにデプロイメントします。# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP \ --extract-monmap=${monmap_path}
monmap
の内容を確認します。# monmaptool --print /tmp/monmap
monmap
から不正なmons
を削除します。# monmaptool ${monmap_path} --rm <bad_mon>
この例では、
mon0
およびmon2
を削除します。# monmaptool ${monmap_path} --rm a # monmaptool ${monmap_path} --rm c
ceph
mon
コマンドを貼り付け、--inject-monmap=${monmap_path}
フラグを以下のように追加することで、変更したmonmap
を適切なmon
に挿入します。# ceph-mon \ --fsid=41a537f2-f282-428e-989f-a9e07be32e47 \ --keyring=/etc/ceph/keyring-store/keyring \ --log-to-stderr=true \ --err-to-stderr=true \ --mon-cluster-log-to-stderr=true \ --log-stderr-prefix=debug \ --default-log-to-file=false \ --default-mon-cluster-log-to-file=false \ --mon-host=$ROOK_CEPH_MON_HOST \ --mon-initial-members=$ROOK_CEPH_MON_INITIAL_MEMBERS \ --id=b \ --setuser=ceph \ --setgroup=ceph \ --foreground \ --public-addr=10.100.13.242 \ --setuser-match-path=/var/lib/ceph/mon/ceph-b/store.db \ --public-bind-addr=$ROOK_POD_IP \ --inject-monmap=${monmap_path}
- シェルを終了して続行します。
Rook
configmaps
を編集します。Operator が
mon
を追跡するのに使用するconfigmap
を編集します。# oc -n openshift-storage edit configmap rook-ceph-mon-endpoints
data 要素で、以下のような 3 つの
mon
(またはmoncount
に応じて) が表示されることを確認します。data: a=10.100.35.200:6789;b=10.100.13.242:6789;c=10.100.35.12:6789
リストから問題の
mon
を削除し、末尾に適切なmon
を 1 つ削除します。以下に例を示します。data: b=10.100.13.242:6789
- ファイルを保存して終了します。
ここで、
mons
およびその他のコンポーネントに使用されるSecret
を調整する必要があります。変数
good_mon_id
の値を設定します。以下に例を示します。
# good_mon_id=b
oc patch
コマンドを使用して、rook-ceph-config
シークレットにパッチを適用し、mon_host
およびmon_initial_members
の 2 つのキー/値のペアを更新できます。# mon_host=$(oc -n openshift-storage get svc rook-ceph-mon-b -o jsonpath='{.spec.clusterIP}') # oc -n openshift-storage patch secret rook-ceph-config -p '{"stringData": {"mon_host": "[v2:'"${mon_host}"':3300,v1:'"${mon_host}"':6789]", "mon_initial_members": "'"${good_mon_id}"'"}}'
注記hostNetwork: true
を使用している場合は、mon_host
変数をmon
がピニングされるノード IP (nodeSelector
) に置き換える必要があります。これは、mode で作成されたrook-ceph-mon-*
サービスがないためです。
mon
を再起動します。変更を取得するには、元の
ceph-mon
コマンドで適切なmon
Pod を再起動する必要があります。mon
デプロイメント YAML ファイルのバックアップでoc replace
コマンドを使用します。# oc replace --force -f rook-ceph-mon-b-deployment.yaml
注記--force
オプションはデプロイメントを削除し、新たに作成します。クラスターのステータスを確認します。
ステータスは、クォーラムの
mon
が 1 つ表示されるはずです。ステータスが適切であれば、クラスターは再度正常であるはずです。
クォーラムにある 2 つの mon デプロイメントを削除します。
以下に例を示します。
# oc delete deploy <rook-ceph-mon-1> # oc delete deploy <rook-ceph-mon-2>
この例では、削除するデプロイメントは
rook-ceph-mon-a
およびrook-ceph-mon-c
です。Operator を再起動します。
rook Operator を再び起動し、クラスターの健全性の監視を再開します。
注記多数のリソースがすでに存在するエラーを無視するのは安全です。
# oc -n openshift-storage scale deployment rook-ceph-operator --replicas=1
Operator は
mons
をさらに追加し、mon
数に応じて再びクォーラムサイズを増やします。