説明
readiness probe は、コンテナーがリクエストを処理する準備ができているか確認します。適切な検査なしに実行状態だけを基準にすると、初期化中や一時的に処理できないコンテナーへトラフィックが送られる場合があります。
readiness の失敗は通常の Service ルーティングで準備済みエンドポイントから除外するためのもので、コンテナーを再起動しません。再起動を判断する liveness と初期化時間を確保する startup probe は目的が異なるため、ワークロードに合わせて選んでください。
想定される影響
- 準備できていないインスタンスへリクエストが送られ、エラーになる場合があります。
- 不正確な検査は正常なインスタンスを除外したり、異常なインスタンスへ送信を続けたりする場合があります。
対処方法
- HTTP、TCP、exec などの対応する方式で実際の処理能力を確認する
readiness_probeを、サービスのコンテナーに構成してください。 - 初期化と一時障害を考慮して遅延、間隔、閾値を調整し、ローリング更新と復旧をテストしてください。liveness が必要かは別途判断してください。
例
ポート 80 で /nginx_status を実際に提供する nginx 設定が別途必要な例です。既定のイメージがこのパスを自動提供すると考えないでください。実際のデプロイには保守されているイメージを使ってください。
変更前
hcl
resource "kubernetes_pod" "pod" {
metadata {
name = "terraform-example"
}
spec {
container {
image = "nginx:1.7.9"
name = "example"
liveness_probe {
http_get {
path = "/nginx_status"
port = 80
}
}
}
}
}
変更後
hcl
resource "kubernetes_pod" "pod" {
metadata {
name = "terraform-example"
}
spec {
container {
image = "nginx:1.7.9"
name = "example"
readiness_probe {
http_get {
path = "/nginx_status"
port = 80
}
initial_delay_seconds = 10
}
liveness_probe {
http_get {
path = "/nginx_status"
port = 80
}
}
}
}
}
補足:
- 変更前: liveness だけがあり、アプリケーションの準備状態を別途確認していません。
- 変更後: HTTP readiness 検査を追加します。遅延時間の指定だけでは準備状態を確認できません。