Kubernetes完全ガイド 第10 章 ヘルスチェックとコンテナのライフサイクル
ヘルスチェック
Liveness Probe: Podが正常に動作しているかの確認。Podを再起動する
失敗した場合、PodのrestartPolicy(default: Always)に従ってコンテナの再起動
Readiness Probe: Podがサービスインする準備ができているかの確認。トラフィックを流さない
失敗した場合、PodがREADYではなくなる
type: LoadBalancerのServiceでは各NodeへのヘルスチェックはICMPによる簡易的なチェックのみ
そのためReadiness等の設定は重要
チェック方式
exec: コマンド実行。終了コードで判定
httpGet: HTTP GETリクエスト。ステータスコードで判定
tcpSocket: TCPセッションの確立を検証
ヘルスチェックの間隔
initialDelaySeconds
periodSeconds
timeoutSeconds
successThreshold
failureThreshold
restartPolicy
Always: Podが停止すると常にPodを再起動させる
OnFailure: Podの停止が終了コード0以外の場合にPodを再起動させる
Never: Podが停止してもPodを再起動させない
Init Container
Pod内でメインとなるコンテナを起動する前に別のコンテナを起動する
spec.initContainersは複数指定でき、上から一つずつコンテナが起動される。なので順序が必要な処理を実行できる
ユースケース
リポジトリからファイルを取得する
コンテナの起動を遅延させる
設定ファイルを動的に生成する
Serviceが作成されているかの確認
postStart / preStop
コンテナ起動後と停止直前に任意のコマンドを実行可能
postStart は spec.containers[].command の実行とほぼ同じタイミングで、厳密には非同期に実行される
Podの安全な停止とタイミング
Podの削除要求が kube api server に届くと、非同期に「preStop処理 + SIGTERM処理」と「Serviceからの除外設定」が行われる
Serviceからの除外が完了する前に、preStop処理+SIGTERM処理でプロセスが停止すると、リクエストでエラーが発生する可能性
preStopで遅延させたり
SIGTERMでリクエストを受けつつ停止処理を行うなどが効果的
Podにはspec.terminationGracePeriodSeconds (デフォルトは30秒)という設定値がある
この期間内に「preStop + SIGTERM処理」を終わらせる必要がある
この期間後にSIGKILLシグナルが送られる
preStopだけでterminationGracePeriodSecondsの時間を使い切った場合は、2秒のみSIGTERM処理の時間が確保される
kubectl でPodを削除する場合は、--grace-period オプションで変更できる
リソースを削除した時の挙動
ReplicaSetなどの親リソースが削除された際には、子リソースとなるPodなどを削除するためにガベージコレクションを行う
metadata.ownerReferences 以下に情報が保存されている
ReplicaSetを削除した時の挙動
Background(デフォルト)
ReplicaSetを直ちに削除し、Podはガベージコレクタがバックグランドで非同期に削除
Foreground
ReplicaSetを直ちに削除はせず、deletionTimestamp, metadata.finalizers = foregroundDeletion を設定
ガベージコレクタが各PodでblockOwnerDeletion=trueのものを削除する
すべて消し終わったあとにReplicaSetを削除する
Orphan
ReplicaSet削除時にPodの削除を行わない