マネージドノードプール機能を有効にすると、ノードの自動修復をオンにできます。これにより、Container Service for Kubernetes (ACK) は継続的にノードのヘルス状態を監視し、問題を検出した際に自己修復タスクをトリガーするため、手動でのノードメンテナンスの運用負荷が軽減されます。ただし、一部の障害は自動回復には複雑すぎる、または深刻すぎるため、特定の問題については手動での介入が必要になる場合があります。
仕組み
ノードの自動修復は、障害検出、通知、オプションの GPU 障害分離、自動修復の 4 段階のワークフローに従います。
障害の診断と検出:ACK は ack-node-problem-detector (NPD) アドオンを使用してノードの例外をチェックします。ノードが異常な状態になり、その状態が指定された期間続いた場合、ACK はそのノードが故障したと判断します。
障害通知:障害が検出されると、ACK はノードの Condition と Kubernetes イベントを生成します。イベントセンターでアラートを設定して通知を受け取ることができます。
(専有 GPU の場合) エラー隔離 GPU 例外が検出されると、 ACK は異常な GPU カードを隔離します。 > 詳細については、「GPU 例外の検出と自動隔離」をご参照ください。
ノードの自動修復プロセス:修復プロセスは例外の種類によって異なります。
システムおよび Kubernetes アドオンの例外:ACK は、kubelet やコンテナーランタイムの再起動などにより、障害のあるシステムおよび Kubernetes アドオンを修復します。[システム/Kubernetes コンポーネント障害時のノードの再起動] が許可されており、初期修復が失敗した場合、ACK はノードをスケジュール不可としてマークし、ドレインし、再起動します。ノードが回復すると、再度スケジュール可能になります。詳細なプロセスについては、「システムおよび Kubernetes アドオンの異常」をご参照ください。
ノードインスタンスの例外:ACK は障害のあるノードに Taint を追加し、オプションで ([権限を取得した後にのみノードを修復] が有効な場合) 権限付与を待ち、ノードをドレインし、ノードの再起動やハードウェア修復などの修復アクションを実行します。ノードが回復すると、ACK は Taint を削除します。詳細なプロセスについては、「ノードインスタンスの異常」をご参照ください。
シリアル修復の動作
ACK は、連鎖的な中断を防ぐための安全メカニズムとして、ノードをシリアルに (1 つずつ) 修復します。
クラスターに複数のノードプールが含まれている場合、ACK は一度に 1 つのノードプールずつ修復します。
ノードプールに複数の異常なノードが含まれている場合、ACK はそれらを 1 つずつ修復します。あるノードの修復に失敗した場合、ACK はそのノードプール内の他のすべての障害ノードに対する自動修復プロセスを停止します。
事前準備
前提条件
この機能では、ノードの例外を検出するために ack-node-problem-detector アドオンが、ノードプールイベントのアラートを受信するためにイベントセンターが必要です。詳細については、「イベント監視」をご参照ください。
この機能は ACK マネージドクラスターでのみ利用可能で、マネージドノードプールと Lingjun ノードプールでサポートされています。
段階的リリースの機能
以下の機能は段階的にリリースされており、展開スケジュールが異なる場合があります。これらの機能を使用するには、チケットを送信してアクセスをリクエストしてください。
ノードインスタンス例外の自動修復:これは許可リスト制です。
Lingjun ノードプールのノード自動修復:これは許可リスト制です。
アラートルールセット:ノードの自動修復を有効にした後、アラート管理を有効にし、[クラスターノード自動修復アラートルールセット] と [クラスター GPU 監視アラートルールセット] をアクティブ化することを推奨します。これにより、例外が発生した際にアラートを確実に受信できます。対応するルールセットは段階的にリリースされており、まだ表示されない場合があります。> ルールセットを有効にする方法については、「Container Service のアラート管理」をご参照ください。
NPD バージョン:ノードインスタンス例外の自動修復には、NPD バージョン 1.2.26 以降が必要です。バージョン 1.2.26 は現在、段階的にリリースされています。
ノードの自動修復の設定
新規または既存のノードプールのマネージド構成を通じて、ノードの自動修復を有効化および設定します。ノードプールと Lingjun ノードプールの手順は似ています。以下の手順では、標準ノードプールを例として使用します。
新規ノードプール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。
[ノードプール] ページで、[ノードプールの作成] をクリックします。[マネージドノードプールの設定] セクションで、[カスタムノード管理] を選択します。[自動修復] を有効にし、修復オプション [システム/Kubernetes コンポーネント障害時のノードの再起動] を設定します。画面の指示に従って、ノードプールの作成を完了します。設定オプションの完全な説明については、「ノードプールの作成と管理」をご参照ください。ノードの再起動と権限付与に関する重要な考慮事項については、以下のセクションをご参照ください。

既存のノードプール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。
ノードプールリストで、対象のノードプールを見つけます。[操作] 列で、
> [マネージドノードプールの有効化] (通常のノードプールの場合) または [マネージドノードプールの設定] (マネージドノードプールの場合) をクリックします。[マネージドノードプールの設定] セクションで、[カスタムノード管理] を選択します。[自動修復] を有効にし、修復オプション [システム/Kubernetes コンポーネント障害時のノードの再起動] を設定します。画面の指示に従って設定を送信します。設定オプションの完全な説明については、「ノードプールの作成と管理」をご参照ください。ノードの再起動と権限付与に関する重要な考慮事項については、以下のセクションをご参照ください。
システムおよび Kubernetes アドオンの異常
詳細な修復プロセス
ACK は、ノードの condition などの情報に基づいて修復タスクを開始します。kubectl describe node コマンドを実行して、condition フィールドでノードのステータスを確認できます。
ACK がシステムまたは Kubernetes アドオンの例外を検出し、それが指定されたしきい値を超えて持続する場合、自動的に修復プロセスを開始します:
ACK は、障害のあるシステムおよび Kubernetes アドオンの修復を試みます。たとえば、kubelet やコンテナーランタイムを再起動する場合があります。
[システム/Kubernetes コンポーネントの障害時にノードを再起動] が許可されており、初期修復操作が失敗した場合、ACK は以下の手順を実行します:
ACK は、障害のあるノードを自動的にスケジュール不可としてマークします。
ACK は、再起動が必要な障害ノードをドレインします。ドレイン操作は 30 分後にタイムアウトします。ノードをドレインする際、ACK は設定された Pod Disruption Budget (PDB) を尊重しながら Pod を退避させます。高いサービス可用性を確保するために、ワークロードを異なるノードにまたがって複数のレプリカでデプロイすることを推奨します。また、重要なサービスには PDB を設定して、同時中断を制御してください。ドレインが失敗した場合でも、ACK は後続のステップに進みます。
ACK はノードを再起動します。
ノードのステータスが正常に戻ると、ACK はノードを再度スケジュール可能にします。プロセス開始前にノードがすでにスケジュール不可だった場合、ACK は修復後に自動的にスケジュール可能にはしません。
自動修復をトリガーする条件
| ノードの Condition | 説明 | リスクレベル | しきい値 | 修復アクション |
|---|---|---|---|---|
KubeletNotReady(KubeletHung) | kubelet が予期せず停止し、ノードが NotReady ステータスを報告しています。 | 高 | 180 秒 | 1. kubelet を再起動します。 2. [システム/Kubernetes コンポーネント障害時のノードの再起動] が許可されている場合、ECS インスタンスを再起動します。 |
KubeletNotReady(PLEG) | PLEG のヘルスチェックが失敗し、ノードが NotReady ステータスを報告しています。 | 中 | 180 秒 | 1. containerd または Docker を再起動します。 2. kubelet を再起動します。 3. [システム/Kubernetes コンポーネント障害時のノードの再起動] が許可されている場合、ECS インスタンスを再起動します。 |
KubeletNotReady(SandboxError) | PodSandbox が見つからず、kubelet が正しく起動できません。 | 高 | 180 秒 | 1. 対応するサンドボックスコンテナーを削除します。 2. kubelet を再起動します。 |
RuntimeOffline | containerd または Docker が停止し、ノードが利用できなくなっています。 | 高 | 90年代 | 1. containerd または Docker を再起動します。 2. [システム/Kubernetes コンポーネント障害時のノードの再起動] が許可されている場合、ECS インスタンスを再起動します。 |
NTPProblem | 時刻同期サービス (ntpd または chronyd) が異常です。 | 高 | 10 秒 | ntpd または chronyd を再起動します。 |
SystemdOffline | Systemd の状態が異常で、コンテナーの起動または停止ができません。 | 高 | 90年代 | [システム/Kubernetes コンポーネント障害時のノードの再起動] が許可されている場合、ECS インスタンスを再起動します。 |
ReadonlyFilesystem | ノードのファイルシステムが読み取り専用になっています。 | 高 | 90年代 | [システム/Kubernetes コンポーネント障害時のノードの再起動] が許可されている場合、ECS インスタンスを再起動します。 |
ノードインスタンスの異常
「事前準備」に記載されている準備が完了していることを確認してください。
詳細な修復プロセス
Lingjun ノードで障害が発生し、ハードウェア修復が必要な場合、修復プロセスによってノードが再デプロイされ、ローカルディスク上のすべてのデータが消去されます。このシナリオでは、ノードプールに対して [権限を取得した後にのみノードを修復] を有効にして、修復を承認する前にデータをバックアップできるようにすることを推奨します。
ACK は、ノードインスタンスの例外が発生してから 5 分後に、以下の修復プロセスを自動的にトリガーします。
例外を検出した後、ACK は障害のあるノードに以下の Taint を追加します:
キー:
alibabacloud.com/node-needrepair値:
Unschedulable効果:
NoSchedule
[権限を取得した後にのみノードを修復] が有効な場合、ACK は続行する前にユーザーの承認を待ちます。> 異常なノード上のワークロードを先に処理する必要がある場合は、[権限を取得した後にのみノードを修復] を有効にすることを推奨します。ACK はユーザーが承認した後にのみ修復を開始します。
ACK は、障害のあるノードに自動的にラベル
alibabacloud.com/node-needrepair=Inquiringを追加します。まず、ノード上で実行されている Pod を処理したり、データをバックアップしたりできます。完了したら、
alibabacloud.com/node-needrepairラベルを削除するか、その値をApproved(alibabacloud.com/node-needrepair=Approved) に設定して修復を承認します。ユーザーの承認を受けると、ACK は次のステップに進みます。
[権限を取得した後にのみノードを修復] が有効でない場合、ACK は例外を検出した後、自動的に次のステップに進みます。
ACK はノードをドレインします。ドレイン操作は 30 分後にタイムアウトします。ノードをドレインする際、ACK は設定された PDB を尊重しながら Pod を退避させます。高いサービス可用性を確保するために、ワークロードを異なるノードにまたがって複数のレプリカでデプロイすることを推奨します。また、重要なサービスには PDB を設定して、同時中断を制御してください。ドレインが失敗した場合でも、ACK は後続のステップに進みます。
ACK は、ノードの再起動やハードウェア修復などの修復アクションを実行します。
ACK は、ノードのステータスが正常に戻ったかどうかを確認します。
障害が解決された場合、ACK は Taint を削除し、ノードは正常な状態に戻ります。
障害が持続するか、修復プロセスが失敗した場合、Taint は削除されません。ACK は定期的にイベント通知を送信します。イベントを確認してトラブルシューティングを行うか、してください。
(専用 GPU の場合) GPU カードのステータスが正常に戻ると、ACK はその隔離を解除します。
自動修復をトリガーする条件 (GPU 関連)
Lingjun ノードでハードウェア修復が実行された場合、修復が成功した後、手動でノードをノードプールから削除する必要があります。その後、修復されたデバイスを既存ノードとして追加することで、ノードプールに再追加します。詳細と重要な考慮事項については、「ノードの削除」および「既存の Lingjun ノードの追加」をご参照ください。
以下の表は、修復アクションごとにグループ化された、自動修復をトリガーする GPU 関連のノードの Condition を示しています。
ハードウェア修復が必要な条件
以下の条件はオフラインでの介入が必要であり、ハードウェア修復が行われます。
| ノードの Condition | 説明 |
|---|---|
NvidiaXID74Error | 致命的な NVLink ハードウェアエラーを示します。この深刻な障害はオフラインでの修復が必要です。 |
NvidiaXID79Error | GPU が「バスから脱落した」こと、つまりシステムによって検出されなくなったことを示します。この深刻なハードウェア障害はオフラインでの修復が必要です。 |
NvidiaRemappingRowsFailed | GPU が行リマッピングの実行に失敗しました。 |
NvidiaDeviceLost | GPU がバスから脱落したか、その他の理由でアクセスできなくなりました。 |
NvidiaInfoRomCorrupted | infoROM が破損しています。 |
NvidiaPowerCableErr | デバイスの外部電源ケーブルが正しく接続されていません。 |
ノードの再起動が必要な条件
以下の条件は、ノードを再起動することで解決されます。
| ノードの Condition | 説明 |
|---|---|
NvidiaXID95Error | 非封じ込め ECC エラーを示します。GPU 上のすべてのアプリケーションが影響を受けます。アプリケーションを再起動する前に GPU をリセットする必要があります。 |
NvidiaXID48Error | ダブルビット ECC エラー (DBE) を示します。この修正不可能なエラーをクリアするには、GPU のリセットまたはノードの再起動が必要です。 |
NvidiaXID119Error | GSP コアが RPC メッセージに応答するのを待っている間にタイムアウトが発生しました。 |
NvidiaXID140Error | 未回復の ECC エラーを示します。ドライバーが GPU メモリ内で修正不可能なエラーを検出したため、GPU のリセットが必要です。 |
NvidiaXID120Error | GPU の GSP コアで実行されているコードでエラーが発生しました。 |
NvidiaPendingRetiredPages | GPU には保留中のリタイアページがあり、有効にするには GPU のリセットが必要です。 |
NvidiaRemappingRowsRequireReset | GPU には修正不可能で非封じ込めのエラーがあり、回復には GPU のリセットが必要です。 |
NvidiaXID44Error | コンテキストスイッチ中にグラフィックスエンジンで障害が発生したことを示します。この修正不可能なエラーには、GPU のリセットまたはノードの再起動が必要です。 |
NvidiaXID61Error | 内部マイクロコントローラーのブレークポイントまたは警告を示します。この修正不可能なエラーには、GPU のリセットまたはノードの再起動が必要です。 |
NvidiaXID62Error | 内部マイクロコントローラーの停止を示します。この修正不可能なエラーには、GPU のリセットまたはノードの再起動が必要です。 |
NvidiaXID69Error | グラフィックスエンジンのクラスエラーを示します。この修正不可能なエラーには、GPU のリセットまたはノードの再起動が必要です。 |
これらの項目 (生成されるノードの Condition やイベントを生成するかどうかなど) の詳細については、「GPU の例外検出と自動分離」をご参照ください。
自動修復プロセス中のノードステータス
ACK コンソールのノードステータスは、修復の現在の状態を反映しています:
| ステータス | 意味 |
|---|---|
| [修復中] | 修復タスクが進行中です。 |
| 正常 | 修復が完了し、障害は解決済みです。 |
| [リカバリー失敗] | 修復は完了しましたが、障害は継続中です。 |
[リカバリー失敗] 状態のノードは、根本的な障害が解決されるまで、別の自動修復操作をトリガーしません。
ノード自動修復イベントの表示
ACK がノードの自動修復操作をトリガーすると、対応するイベントが [イベントセンター] に記録されます。クラスターの詳細ページで、[操作] > [イベントセンター] を選択して、自動回復の記録と実行された特定のアクションを表示できます。「イベント監視」で説明されているように、これらのイベントをサブスクライブできます。
| イベント | レベル | 説明 |
|---|---|---|
NodeRepairStart | Normal | ノードの自動修復が開始されました。 |
NodeRepairAction | Normal | kubelet の再起動など、ノードの自動修復アクションが実行されました。 |
NodeRepairSucceed | Normal | ノードの自動修復が成功しました。 |
NodeRepairFailed | Warning | ノードの自動修復が失敗しました。トラブルシューティングについては、以下の「よくある質問」セクションをご参照ください。 |
NodeRepairIgnore | Normal | ECS インスタンスが実行状態ではなかったため、ノードの自動修復はスキップされました。 |
よくある質問
ノードの自動修復が失敗した場合はどうすればよいですか?
一部の障害は複雑なため、自動修復ですべての障害を解決できるわけではありません。自動修復タスクが失敗した場合、またはタスク完了後も障害が解決しない場合、ACK はノードのステータスを [修復に失敗しました] に設定します。ノードが修復されない場合、ACK は、最初の障害が解決されるまで、そのノードプール内の他の障害が発生したノードに対する自動修復プロセスを停止します。チケットを起票して、テクニカルサポートにお問い合わせください。
関連ドキュメント
NPD を有効にし、イベントセンターを通じてクラスターイベントを監視することを推奨します。詳細については、「イベント監視」をご参照ください。
GPU の障害検出の詳細については、「GPU の例外検出と自動分離」および「GPU ノードの問題の診断」をご参照ください。
障害のあるノードを削除して再追加することでノードの問題を解決するには、予期しない動作を防ぐために ACK コンソール に記載されている手順に従ってください。詳細については、「ノードの削除」および「既存ノードの追加」をご参照ください。