6.2. マシン削除フェーズのライフサイクルフック
マシンのライフサイクルフックは、通常のライフサイクルプロセスが中断できる、マシンの調整ライフサイクル内のポイントです。マシンの Deleting
フェーズでは、これらの中断により、コンポーネントがマシンの削除プロセスを変更する機会が提供されます。
6.2.1. 用語と定義
マシンの削除フェーズのライフサイクルフックの動作を理解するには、次の概念を理解する必要があります。
- 調整
- 調整は、コントローラーがクラスターの実際の状態とクラスターを設定するオブジェクトをオブジェクト仕様の要件と一致させようとするプロセスです。
- マシンコントローラー
マシンコントローラーは、マシンの調整ライフサイクルを管理します。クラウドプラットフォーム上のマシンの場合、マシンコントローラーは OpenShift Container Platform コントローラーとクラウドプロバイダーのプラットフォーム固有のアクチュエーターを組み合わせたものです。
マシンの削除のコンテキストでは、マシンコントローラーは次のアクションを実行します。
- マシンによってバックアップされているノードをドレインします。
- クラウドプロバイダーからマシンインスタンスを削除します。
-
Node
オブジェクトを削除します。
- ライフサイクルフック
ライフサイクルフックは、通常のライフサイクルプロセスを中断できる、オブジェクトの調整ライフサイクル内の定義されたポイントです。コンポーネントはライフサイクルフックを使用してプロセスに変更を注入し、望ましい結果を達成できます。
マシンの
Deleting
フェーズには 2 つのライフサイクルフックがあります。
-
preDrain
ライフサイクルフックは、マシンによってサポートされているノードをドレインする前に解決する必要があります。 -
preTerminate
ライフサイクルフックは、インスタンスをインフラストラクチャープロバイダーから削除する前に解決する必要があります。
- フック実装コントローラー
フック実装コントローラーは、ライフサイクルフックと対話できる、マシンコントローラー以外のコントローラーです。フック実装コントローラーは、次の 1 つ以上のアクションを実行できます。
- ライフサイクルフックを追加します。
- ライフサイクルフックに応答します。
- ライフサイクルフックを削除します。
各ライフサイクルフックには 1 つのフック実装コントローラーがありますが、フック実装コントローラーは 1 つ以上のフックを管理できます。
6.2.2. マシン削除処理順序
OpenShift Container Platform 4.11 には、マシン削除フェーズ用の 2 つのライフサイクルフック (preDrain
と preTerminate
) があります。特定のライフサイクルポイントのすべてのフックが削除されると、調整は通常どおり続行されます。
図6.1 マシン削除のフロー
マシンの Deleting
フェーズは次の順序で続行されます。
既存のマシンは、次のいずれかの理由により削除される予定です。
-
cluster-admin
権限を持つユーザーは、oc delete machine
コマンドを使用します。 -
マシンは
machine.openshift.io/delete-machine
アノテーションを取得します。 - マシンを管理するマシンセットは、調整の一環としてレプリカ数を減らすために、そのマシンに削除のマークを付けます。
- クラスターオートスケーラーは、クラスターのデプロイメントニーズを満たすために不必要なノードを特定します。
- マシンの健全性チェックは、異常なマシンを置き換えるように設定されています。
-
-
マシンは
Deleting
フェーズに入ります。このフェーズでは、マシンは削除対象としてマークされていますが、API にはまだ存在しています。 preDrain
ライフサイクルフックが存在する場合、それを管理するフック実装コントローラーは指定されたアクションを実行します。すべての
preDrain
ライフサイクルフックが満たされるまで、マシンのステータス条件Drainable
はFalse
に設定されます。-
未解決の
preDrain
ライフサイクルフックはなく、マシンのステータス条件Drainable
がTrue
に設定されています。 マシンコントローラーは、マシンによってサポートされているノードをドレインしようとします。
-
ドレインが失敗した場合、
Drained
は、False
に設定され、マシンコントローラーはノードのドレインを再度試行します。 -
ドレインに成功すると、
Drained
はTrue
に設定されます。
-
ドレインが失敗した場合、
-
マシンのステータス条件
Drained
はTrue
に設定されます。 preTerminate
ライフサイクルフックが存在する場合、それを管理するフック実装コントローラーは指定されたアクションを実行します。すべての
preTerminate
ライフサイクルフックが満たされるまで、マシンのステータス条件Terminable
はFalse
に設定されます。-
未解決の
preTerminate
ライフサイクルフックはなく、マシンのステータス条件Terminable
がTrue
に設定されています。 - マシンコントローラーは、インフラストラクチャープロバイダーからインスタンスを削除します。
-
マシンコントローラーは
Node
オブジェクトを削除します。
6.2.3. 削除ライフサイクルフック設定
次の YAML スニペットは、マシンセット内の削除ライフサイクルフック設定の形式と配置を示しています。
preDrain
ライフサイクルフックを示す YAML スニペット
apiVersion: machine.openshift.io/v1beta1 kind: Machine metadata: ... spec: lifecycleHooks: preDrain: - name: <hook_name> 1 owner: <hook_owner> 2 ...
preTerminate
ライフサイクルフックを示す YAML スニペット
apiVersion: machine.openshift.io/v1beta1 kind: Machine metadata: ... spec: lifecycleHooks: preTerminate: - name: <hook_name> 1 owner: <hook_owner> 2 ...
ライフサイクルフックの設定例
次の例は、マシンの削除プロセスを中断する複数の架空のライフサイクルフックの実装を示しています。
ライフサイクルフックの設定例
apiVersion: machine.openshift.io/v1beta1 kind: Machine metadata: ... spec: lifecycleHooks: preDrain: 1 - name: MigrateImportantApp owner: my-app-migration-controller preTerminate: 2 - name: BackupFileSystem owner: my-backup-controller - name: CloudProviderSpecialCase owner: my-custom-storage-detach-controller 3 - name: WaitForStorageDetach owner: my-custom-storage-detach-controller ...
6.2.4. Operator 開発者向けのマシン削除ライフサイクルフックの例
Operator は、マシン削除フェーズのライフサイクルフックを使用して、マシン削除プロセスを変更できます。次の例は、Operator がこの機能を使用できる方法を示しています。
preDrain
ライフサイクルフックの使用例
- 積極的にマシンを入れ替える
-
Operator は、削除されたマシンのインスタンスを削除する前に、
preDrain
ライフサイクルフックを使用して、代替マシンが正常に作成され、クラスターに参加していることを確認できます。これにより、マシンの交換中の中断や、すぐに初期化されない交換用インスタンスの影響を軽減できます。 - カスタムドレインロジックの実装
Operator は、
preDrain
ライフサイクルフックを使用して、マシンコントローラーのドレインロジックを別のドレインコントローラーに置き換えることができます。ドレインロジックを置き換えることにより、Operator は各ノードのワークロードのライフサイクルをより柔軟に制御できるようになります。たとえば、マシンコントローラーのドレインライブラリーは順序付けをサポートしていませんが、カスタムドレインプロバイダーはこの機能を提供できます。カスタムドレインプロバイダーを使用することで、Operator はノードをドレインする前にミッションクリティカルなアプリケーションの移動を優先して、クラスターの容量が制限されている場合にサービスの中断を最小限に抑えることができます。
preTerminate
ライフサイクルフックの使用例
- ストレージの切り離しを確認する
-
Operator は、
preTerminate
ライフサイクルフックを使用して、マシンがインフラストラクチャープロバイダーから削除される前に、マシンに接続されているストレージが確実に切り離されるようにすることができます。 - ログの信頼性の向上
ノードがドレインされた後、ログエクスポータデーモンがログを集中ログシステムに同期するのに時間がかかります。
ロギング Operator は、
preTerminate
ライフサイクルフックを使用して、ノードがドレインするときと、マシンがインフラストラクチャープロバイダーから削除されるときとの間に遅延を追加できます。この遅延により、Operator は主要なワークロードが削除され、ログバックログに追加されないようにする時間が確保されます。ログバックログに新しいデータが追加されていない場合、ログエクスポータは同期プロセスに追いつくことができるため、すべてのアプリケーションログが確実にキャプチャーされます。
6.2.5. マシンライフサイクルフックによるクォーラム保護
Machine API Operator を使用する OpenShift Container Platform クラスターの場合、etcd Operator はマシン削除フェーズのライフサイクルフックを使用して、クォーラム保護メカニズムを実装します。
preDrain
ライフサイクルフックを使用することにより、etcd Operator は、コントロールプレーンマシン上の Pod がいつドレインされ、削除されるかを制御できます。etcd クォーラムを保護するために、etcd Operator は、etcd メンバーをクラスター内の新しいノードに移行するまで、そのメンバーの削除を防ぎます。
このメカニズムにより、etcd Operator は etcd クォーラムのメンバーを正確に制御できるようになり、マシン API Operator は etcd クラスターの特別な操作知識がなくても、コントロールプレーンマシンを安全に作成および削除できるようになります。
6.2.5.1. クォーラム保護処理順序によるコントロールプレーンの削除
OpenShift Container Platform 4.11 以降のクラスター上でコントロールプレーンマシンが置き換えられると、クラスターには一時的に 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
に設定されます。 マシンコントローラーは、コントロールプレーンマシンによってサポートされているノードをドレインしようとします。
-
ドレインが失敗した場合、
Drained
は、False
に設定され、マシンコントローラーはノードのドレインを再度試行します。 -
ドレインに成功すると、
Drained
はTrue
に設定されます。
-
ドレインが失敗した場合、
-
コントロールプレーンマシンのステータス条件
Drained
がTrue
に設定されます。 -
他の Operator が
preTerminate
ライフサイクルフックを追加していない場合、コントロールプレーンのマシンステータス条件Terminable
はTrue
に設定されます。 - マシンコントローラーは、インフラストラクチャープロバイダーからインスタンスを削除します。
-
マシンコントローラーは
Node
オブジェクトを削除します。
etcd クォーラム保護の preDrain
ライフサイクルフックを示す YAML スニペット
apiVersion: machine.openshift.io/v1beta1 kind: Machine metadata: ... spec: lifecycleHooks: preDrain: - name: EtcdQuorumOperator 1 owner: clusteroperator/etcd 2 ...