【Kubernetes】PODの安全な起動・終了について

f:id:tm200:20210611174228p:plain

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のラベル名>