mutao.net

いわゆる雑記。

Podの終了

kubernetes.io

API server内のPodは、猶予期間を越えるとPodが「死んでいる」と見なされるように更新される。 削除中のPodに対してkubectl describeコマンドを使用すると、Podは「終了中」と表示される。 Podが実行されているNode上で、Podが終了しているとマークされている(正常な終了期間が設定されている)とkubeletが認識するとすぐに、kubeletはローカルでPodの終了プロセスを開始します。 Pod内のコンテナの1つがpreStopフックを定義している場合は、コンテナの内側で呼び出される。猶予期間が終了した後も preStopフックがまだ実行されている場合は、一度だけ猶予期間を延長される(2秒)。 備考: preStopフックが完了するまでにより長い時間が必要な場合は、terminationGracePeriodSecondsを変更する必要があります。 kubeletはコンテナランタイムをトリガーして、コンテナ内のプロセス番号1にTERMシグナルを送信する。 備考: Pod内のすべてのコンテナが同時にTERMシグナルを受信するわけではなく、シャットダウンの順序が問題になる場合はそれぞれにpreStopフックを使用して同期することを検討する。

久々に読んだら全然わからん...となってしまったので思い出しながらメモ。

終了処理はSIGTERM、SIGKILL(猶予期間terminationGracePeriodSecondsを超えた場合)の順に実行される。また並行してServiceからの除外処理は非同期で行われる。

Serviceの除外処理とは、kube-proxyによりiptabelsが更新されることにより、新規の接続がなくなること。

終了開始とともにServiceから除外されないため、終了処理中にServiceからの新規接続を受け入れてしまう期間が発生してしまう。

それを防ぐためにpreStopを設定する。

preStopを設定することにより、SIGTERM処理の前に任意のコマンド、例えばsleepを入れることにより一定期間待機させることが可能。

SIGKILLはterminationGracePeriodSecondsを超えたときに送信される。

terminationGracePeriodSecondsはデフォルトで30秒。もしpreStop処理がterminationGracePeriodSecondsを超えてしまうような設定は避けるべき。

図示するとこうなる。