【Kubernetes】PODの安全な起動・終了について
KubernetesのPODを安全に起動・終了する方法をメモ。
アプリケーションのGraceful shutdownは言語によって異なる為、都度実装する事になります。
リンク
The Twelve-Factor App
現在のPJではThe Twelve-Factor Appに沿った開発が推奨されています。
PODの安全な起動・停止に関する考慮も重要です。
12factor.net
安全に停止させるには
deploymentのマニフェストにPreStop
を入れる事で、PODの破棄命令〜SIGTERMまでの時間を稼ぐ事ができます。
下記は単純にsleepしているだけですが、何かしらの処理を入れる事も可能です。
deployment.yaml
lifecycle: preStop: exec: command: ["/bin/sh", "-c", "sleep 20"]
起動時にアプリケーションのスタンバイが間に合わない場合
アプリケーションがReady状態になったかを確認するエンドポイントを設定する事ができます。
こちらもマニフェストに入れる事が可能です。
deployment.yaml
readinessProbe: initialDelaySeconds: 10 timeoutSeconds: 1 httpGet: path: /status port: 443 scheme: HTTPS
ローリングアップデート時のPOD数
PodDisruptionBudget
を作成する事により、クラスタ内に必ずPODが残るように退避しながらノードが入れ替わっていきます。
これにより、ローリングアップデート時にクラスタ内にPODが存在しないという状態を回避できます。
PDB設定例
apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: name: <任意のPDB名> spec: maxUnavaliable: 1 selector: matchLabels: app: <PODのラベル名>