GKE on AWS でのノードのグレースフル シャットダウン

GKE on AWS では、バージョン 1.26 以降、グレースフル ノード シャットダウンが自動的に有効になります。この機能は、ノードのシャットダウンにおける Pod の適切な終了を管理します。適切な終了により、Pod は状態を保存し、ノードをシャットダウンする前にリソースを解放します。Pod を終了するこの方法により、データ損失のリスクを最小限に抑えることができます。また、シャットダウンされる Pod に依存する、またはそれらとやり取りしている他の Pod やサービスの中断のリスクも最小限に抑えることで、クラスタの復元力を高めることができます。

仕組み

ノードは、定期メンテナンス、ノードのスケーリング、ハードウェアの問題などのイベントによってシャットダウンします。kubelet コンポーネントは、そのイベントを検出し、一定の期間システムのシャットダウンを遅らせるように systemd へ指示することで、ノードの適切な終了プロセスを開始します。この遅延により、ノード上で実行されている Pod をドレインして強制排除する時間ができます。

ノードを適切に終了させる目的は、ノードがシャットダウンする前に非システム Pod と重要なシステム Pod を適切に終了することで、次のデフォルト設定が使用されます。

  • ShutdownGracePeriod: 30 秒
  • ShutdownGracePeriodCriticalPods: 15 秒

これらの設定により、非システム Pod では強制的に停止される前に、適切に終了するための 15 秒の猶予が与えられます。重要なシステム Pod では非システム Pod が終了した後さらに 15 秒の猶予が得られます。ただし、この機能はベスト エフォート型で動作するため、指定された 30 秒間ではノードが適切にシャットダウンされない可能性があります。

トリガーと制限事項

グレースフル ノード シャットダウンをトリガーするイベントには、次のような計画的なイベントがあります。

  • ユーザーからのコマンドによるシャットダウン
  • インスタンスの終了
  • 定期メンテナンス
  • クラスタのスケールダウン

これらのシナリオでは、kubelet がノード シャットダウン イベントを検出し、ノードの適切なシャットダウン プロセスを開始します。

一方、kubelet コンポーネントが依存する systemd 禁止のロック メカニズムがシャットダウン コマンドによってトリガーされない場合、グレースフル ノード シャットダウンは作動できません。このような状況の例としては、次のようなものが挙げられます。

  • ネットワークの切断
  • ハードウェアの誤動作
  • メモリや CPU などのリソースの不足
  • 予期しない停電。

このような場合、ノードが突然シャットダウンして、中断やデータ損失が発生する可能性があります。