Upgrade to Pro — share decks privately, control downloads, hide ads and more …

probeの勘違いから見直した、Pod運用のアレコレ

Avatar for j-maki j-maki
August 02, 2025
160

 probeの勘違いから見直した、Pod運用のアレコレ

Avatar for j-maki

j-maki

August 02, 2025
Tweet

Transcript

  1. ざっくりとしたprobeのイメージ Podの状態チェック(health check)のこと Liveness Probe: 「アプリが動いているか?」のチェック → 応答しなければ再起動 Readiness Probe:

    「リクエストを受け取れる状態か?」のチェック → 準備できてなければトラフィックから外す Startup Probe: 「起動完了したか?」のチェック → 起動中は他のチェックを待機
  2. 公式のドキュメントを見てみる(一部表現は変更) Liveness Probe コンテナをいつ再起動するかを認識することができます。 例えば、アプリケーシ ョン自体は起動しているが、処理を継続することができないデッドロック状態を 検知することができます。 このような状態のコンテナを再起動することで、バグ がある場合でもアプリケーションの可用性を高めることができます。 Readiness

    Probe コンテナがトラフィックを受け入れられる状態であるかを認識することができま す。 Podが準備ができていると見なされるのは、Pod内の全てのコンテナの準備が 整ったときです。 一例として、このシグナルはServiceのバックエンドとして使用 されるPodを制御するときに使用されます。 Podの準備ができていない場合、その PodはServiceのロードバランシングから切り離されます。
  3. probeの設定例 livenessProbe: # httpget以外にもexec、tcpSocketがある httpGet: path: /health port: 8080 initialDelaySeconds:

    30 # 初回チェックまでの待機時間 periodSeconds: 10 # チェックを行う間隔 timeoutSeconds: 5 # タイムアウトまでの時間 failureThreshold: 3 # 失敗とみなす回数 successThreshold: 1 # 成功とみなす回数 ※ readinessProbeも基本的には同じフィールドを使用できる
  4. 簡単な例で試してみる。下記のdeploymentとserviceを作ってみる apiVersion: apps/v1 kind: Deployment metadata: name: nginx-readiness-deployment ... spec:

    containers: - name: readiness image: registry.k8s.io/busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600 readinessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 10 periodSeconds: 5 livenessProbe: ...
  5. 最初はPodがREADYになり、ServiceのEndpointsにPodのIPが登録されていることが確 認できる % k get deployments.apps -w NAME READY UP-TO-DATE

    AVAILABLE AGE nginx-readiness-deployment 3/3 3 3 24s % k describe services nginx-readiness-service Name: nginx-readiness-service ... Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.0.169:80,10.244.0.170:80,10.244.0.171:80 ...
  6. 安直に指定するのは危険 例えば、ケーススタディとしてDBが高負荷になった状況を考える 問題のシナリオ例: Readiness probeにDeep Health Checkを設定している DBが高負荷によりDeep Health Checkが失敗

    PodがReadyにならなず他のPodに負荷が集中 全てのpodが落ちるとユーザーはアプリケーションのエラー画面ではなくALB等の デフォルトのエラー画面を見ることになる 外部コンポーネントのトラブルは、Pod自体の再起動やサービスアウトだけでは解決 する問題ではない。
  7. Readiness gateの役割 Readiness Gate(準備完了ゲート)とは、Kubernetesにおいて、Podの準備状態をより 細かく制御するための機能 主な用途: AWS Load Balancer Controllerと連携して、Podがターゲットグループに登録される

    まで待機 Podの準備が完了するまで、古いPodの削除を遅延させ、ダウンタイムを削減 外部サービスとの連携を確実にするための追加の条件を設定
  8. Podの終了プロセスについて Podが終了する時の流れ 1. Pod削除の開始 - デプロイ等でPod削除が開始 - Podのステータスが Terminating に変更

    2. PreStopフックの実行 (設定されている場合) - コンテナ内で preStop ライフサイクルフックが実行 - アプリケーションの正常終了処理を実行する時間を確保 3. SIGTERMシグナルの送信 - kubeletがコンテナのメインプロセスにSIGTERMシグナルを送信 - アプリケーションはこのシグナルを受け取って正常終了処理を開始
  9. 4. terminationGracePeriodSecondsの待機 - デフォルト30秒間、アプリケーションの正常終了を待機 - この間にアプリケーションは処理中のリクエストを完了させる 5. SIGKILLシグナルの送信 (必要に応じて) -

    terminationGracePeriodSeconds経過後も終了しない場合 - kubeletがSIGKILLシグナルを送信して強制終了 6. Podの完全削除 - コンテナが完全に終了後、Podリソースが削除される
  10. apiVersion: apps/v1 kind: Deployment metadata: ... spec: template: spec: terminationGracePeriodSeconds:

    90 containers: - name: example resources: ... lifecycle: preStop: exec: command: ["sh", "-c", "sleep 70"]
  11. 各設定値の考え方 アプリケーションの設定 < ALBのDeregistration delay < Pre Stop Lifecycle Hook

    < terminationGracePeriodSeconds 上記に設定することで、リクエストが送られている最中にPodが終了するリスクを低減