10.6.3. マシンライフサイクルフックによるクォーラム保護
Machine API Operator を使用する OpenShift Container Platform クラスターで etcd のクォーラムを保護するために、etcd Operator はマシン削除フェーズのライフサイクルフックを使用してクォーラム保護メカニズムを実装します。
preDrain ライフサイクルフックを使用することにより、etcd Operator は、コントロールプレーンマシン上の Pod がいつ drain され、削除されるかを制御できます。etcd クォーラムを保護するために、etcd Operator は、etcd メンバーをクラスター内の新しいノードに移行するまで、そのメンバーの削除を防ぎます。
このメカニズムにより、etcd クラスターの具体的な運用上の知識がなくても、etcd Operator によって etcd クォーラムのメンバーを正確に制御できるようになり、Machine API Operator によってコントロールプレーンマシンを安全に作成および削除できるようになります。
10.6.3.1. クォーラム保護処理順序によるコントロールプレーンの削除 リンクのコピーリンクがクリップボードにコピーされました!
コントロールプレーンマシンセットを使用するクラスター上でコントロールプレーンマシンが置き換えられると、クラスターには一時的に 4 つのコントロールプレーンマシンが存在します。4 番目のコントロールプレーンノードがクラスターに参加すると、etcd Operator は代替ノードで新しい etcd メンバーを開始します。etcd Operator は、古いコントロールプレーンマシンが削除対象としてマークされていることを確認すると、古いノード上の etcd メンバーを停止し、代替の etcd メンバーをクラスターのクォーラムに参加するように昇格させます。
コントロールプレーンマシンの Deleting フェーズは、以下の順序で続行されます。
- コントロールプレーンマシンは削除される予定です。
-
コントロールプレーンマシンは
Deletingフェーズに入ります。 preDrainライフサイクルフックを満たすために、etcd Operator は次のアクションを実行します。-
etcd Operator は、4 番目のコントロールプレーンマシンが etcd メンバーとしてクラスターに追加されるまで待機します。この新しい etcd メンバーの状態は
Runningですが、etcd リーダーから完全なデータベース更新を受信するまではreadyができていません。 - 新しい etcd メンバーが完全なデータベース更新を受け取ると、etcd Operator は新しい etcd メンバーを投票メンバーに昇格させ、古い etcd メンバーをクラスターから削除します。
この移行が完了すると、古い etcd Pod とそのデータは安全に削除されるため、
preDrainライフサイクルフックが削除されます。-
etcd Operator は、4 番目のコントロールプレーンマシンが etcd メンバーとしてクラスターに追加されるまで待機します。この新しい etcd メンバーの状態は
-
コントロールプレーンマシンのステータス条件
DrainableがTrueに設定されます。 マシンコントローラーは、コントロールプレーンマシンによってサポートされているノードを drain しようとします。
-
drain が失敗した場合、
Drainedは、Falseに設定され、マシンコントローラーはノードの drain を再度試行します。 -
drain に成功すると、
DrainedはTrueに設定されます。
-
drain が失敗した場合、
-
コントロールプレーンマシンのステータス条件
DrainedがTrueに設定されます。 -
他の Operator が
preTerminateライフサイクルフックを追加していない場合、コントロールプレーンのマシンステータス条件TerminableはTrueに設定されます。 - マシンコントローラーは、インフラストラクチャープロバイダーからインスタンスを削除します。
-
マシンコントローラーは
Nodeオブジェクトを削除します。
etcd クォーラム保護の preDrain ライフサイクルフックを示す YAML スニペット
apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
...
spec:
lifecycleHooks:
preDrain:
- name: EtcdQuorumOperator
owner: clusteroperator/etcd
...
ここでは、以下のようになります。
spec.lifecycleHooks.preDrain.name-
preDrainライフサイクルフックの名前を指定します。 spec.lifecycleHooks.preDrain.owner-
preDrainライフサイクルフックを管理するフック実装コントローラーを指定します。