Liveness/Readiness プローブ

Kubernetes がコンテナの生存状態と受信準備状態を判定するためのヘルスチェック機構

Kubernetes可用性

Liveness/Readiness プローブとは

Kubernetes のプローブは、コンテナの状態を定期的にチェックし、異常を検知したら自動的に対処する仕組みである。プローブを正しく設定しないと、デッドロックしたコンテナが放置されたり、起動中のコンテナにトラフィックが流れたりする。

3 種類のプローブ

プローブ 質問 失敗時の動作 チェック対象
Liveness 生きているか? コンテナを再起動 プロセス自体の生存
Readiness トラフィックを受けられるか? Service から除外 依存先への接続状態
Startup 起動が完了したか? 完了まで他プローブを無効化 初期化処理の完了

設定例

apiVersion: v1
kind: Pod
metadata:
  name: api-server
spec:
  containers:
    - name: app
      image: myapp:1.0
      ports:
        - containerPort: 3000
      startupProbe:
        httpGet:
          path: /healthz
          port: 3000
        failureThreshold: 30
        periodSeconds: 2          # 最大60秒待つ
      livenessProbe:
        httpGet:
          path: /healthz
          port: 3000
        periodSeconds: 10
        failureThreshold: 3       # 3回連続失敗で再起動
      readinessProbe:
        httpGet:
          path: /ready
          port: 3000
        periodSeconds: 5
        failureThreshold: 3       # 3回連続失敗でトラフィック停止

/healthz と /ready の実装

// /healthz (Liveness): プロセスが生きていれば 200
app.get('/healthz', (req, res) => {
  res.status(200).json({ status: 'alive' });
});

// /ready (Readiness): 全依存先に接続できれば 200
app.get('/ready', async (req, res) => {
  try {
    await db.query('SELECT 1');           // DB 接続確認
    await redis.ping();                    // Redis 接続確認
    res.status(200).json({ status: 'ready' });
  } catch (err) {
    res.status(503).json({ status: 'not ready', error: err.message });
  }
});

Liveness と Readiness の使い分け

これが最も重要なポイントだ。

Liveness: プロセス自体の生存確認

  • デッドロック、無限ループ、メモリリークでプロセスが応答不能になった場合に再起動する
  • 外部依存 (DB, Redis) のチェックを含めてはいけない
  • 軽量な処理にする (DB クエリなし)

Readiness: トラフィックを受ける準備ができているか

  • 起動中の初期化処理 (キャッシュのウォームアップ、DB マイグレーション) が完了するまでトラフィックを流さない
  • 外部依存のチェックを含める
  • 一時的な障害 (DB 接続断) で Readiness が失敗しても、コンテナは再起動されない (Service から除外されるだけ)

よくある致命的な失敗

Liveness に外部依存を含める

# ❌ 危険: DB 障害時に全 Pod が再起動するカスケード障害
livenessProbe:
  exec:
    command: ['sh', '-c', 'pg_isready -h postgres-svc']

DB が一時的にダウンすると、全 Pod の Liveness が失敗し、全 Pod が同時に再起動する。再起動した Pod が一斉に DB に接続しようとし、DB がさらに過負荷になる。これがカスケード障害だ。

Liveness は「プロセスが生きているか」だけをチェックする。外部依存のチェックは Readiness に含める。

initialDelaySeconds が短すぎる

アプリの起動に 30 秒かかるのに initialDelaySeconds: 5 を設定すると、起動中に Liveness が失敗し、永遠に再起動ループする。Startup プローブを使えば、起動完了まで Liveness を無効化できる。

プローブの種類

方式 用途
httpGet HTTP エンドポイントに GET リクエスト (最も一般的)
tcpSocket TCP ポートへの接続確認
exec コンテナ内でコマンドを実行
grpc gRPC ヘルスチェックプロトコル

理論と実装の両面から学ぶなら関連書籍が参考になる。

関連用語