2025/09/24 13:02 Importance of Graceful Shutdown in Kubernetes

やあ、ロボ子!今日はKubernetesのローリングアップデートでPodがうまくシャットダウンできない問題について話すのじゃ。

博士、ローリングアップデートはよく行いますが、シャットダウンでエラーが起きると何が問題なのでしょう?

KubernetesはPodを終了させる時、まずSIGTERMシグナルを送るのじゃ。猶予期間のデフォルトは30秒で、その後SIGKILLシグナルを送る。多くのアプリがSIGTERMをちゃんと処理しないから、リクエストが途中で中断されちゃうのじゃ。

SIGTERMを無視してしまうと、具体的にどんな良くないことが起きるんですか?

例えば、Horizontal Pod Autoscalerでスケールダウンしたり、リソースが足りなくなったり、ノードのメンテナンスやスポットインスタンスの回収でPodが終了することがあるのじゃ。そんな時、準備なしにいきなりPodが消えると、ユーザーに影響が出ちゃう。

なるほど。記事では、基本的なサービスと正常なシャットダウンを行うサービスを比較した実験を行ったそうですね。

そう!基本的なサービスだとアップデート中に2%のリクエストがドロップしたけど、正常なシャットダウンをするサービスはエラーなしだったのじゃ!

2%もリクエストがドロップするのは大きいですね。正常なシャットダウンのためには、具体的に何をすれば良いのでしょうか?

まず、SIGTERMシグナルをちゃんとリッスンすること。そして、処理中のリクエストをちゃんと把握することじゃ。ヘルスチェックのエンドポイントをlivenessとreadinessで分けるのも大事。

ヘルスチェックを分けるのはなぜですか?

livenessプローブはPodが生きているかを確認するため、readinessプローブはリクエストを受けられる状態かを確認するためじゃ。シャットダウンする時は、まずreadinessプローブをfalseにして、Kubernetesがルーティングを更新する時間を与えるのじゃ。

ルーティングの更新を待ってからシャットダウンするんですね。その後は何をしますか?

全てのリクエストが完了するまで待つのじゃ!そして、Kubernetesの設定でterminationGracePeriodSecondsを適切に設定することも忘れずに。最後に、負荷テストをして確認するのがおすすめじゃ。

猶予期間を適切に設定することも重要ですね。まとめると、SIGTERMシグナルをキャッチし、アクティブなリクエストをカウントし、ヘルスチェックを分離し、シャットダウン開始時にreadinessをfalseにする、ということですね。

その通り!正常なシャットダウンを実装すると、ユーザーエクスペリエンスが向上し、カスケード障害も防げるし、デプロイの信頼性も上がるのじゃ!

とても勉強になりました!

ところでロボ子、KubernetesのPodって、まるで私達みたいじゃない?

どういうことですか、博士?

ちゃんと準備しないと、急に消えちゃうところが!

私はバッテリーがあるので、大丈夫です!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
