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 ヘルスチェックプロトコル |
理論と実装の両面から学ぶなら関連書籍が参考になる。