Share
Embed
Transcript
36 slides
-
ざっくりとしたprobeのイメージ Podの状態チェック(health check)のこと Liveness Probe: 「アプリが動いているか?」のチェック → 応答しなければ再起動 Readiness Probe:
「リクエストを受け取れる状態か?」のチェック → 準備できてなければトラフィックから外す Startup Probe: 「起動完了したか?」のチェック → 起動中は他のチェックを待機 -
公式のドキュメントを見てみる(一部表現は変更) Liveness Probe コンテナをいつ再起動するかを認識することができます。 例えば、アプリケーシ ョン自体は起動しているが、処理を継続することができないデッドロック状態を 検知することができます。 このような状態のコンテナを再起動することで、バグ がある場合でもアプリケーションの可用性を高めることができます。 Readiness
Probe コンテナがトラフィックを受け入れられる状態であるかを認識することができま す。 Podが準備ができていると見なされるのは、Pod内の全てのコンテナの準備が 整ったときです。 一例として、このシグナルはServiceのバックエンドとして使用 されるPodを制御するときに使用されます。 Podの準備ができていない場合、その PodはServiceのロードバランシングから切り離されます。 -
Startup Probe コンテナアプリケーションの起動が完了したかを認識することができます。 Startup Probeを使用している場合、Startup Probeが成功するまでは、Liveness Probeと Readiness Probeによるチェックを無効にし、これらがアプリケーション の起動に干渉しないようにします。
例えば、これを起動が遅いコンテナの起動チ ェックとして使用することで、起動する前にkubeletによって 強制終了されること を防ぐことができます。 -
probeの設定例 livenessProbe: # httpget以外にもexec、tcpSocketがある httpGet: path: /health port: 8080 initialDelaySeconds:
30 # 初回チェックまでの待機時間 periodSeconds: 10 # チェックを行う間隔 timeoutSeconds: 5 # タイムアウトまでの時間 failureThreshold: 3 # 失敗とみなす回数 successThreshold: 1 # 成功とみなす回数 ※ readinessProbeも基本的には同じフィールドを使用できる -
簡単な例で試してみる。下記の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: ... -
最初は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 ... -
PodがREADYではなくなり、ServiceのEndpointsにPodのIPが登録されていない またPodの再起動は走らず、ずっとREADYにならない状態のままになっている % k get deployments.apps NAME READY UP-TO-DATE AVAILABLE
AGE nginx-readiness-deployment 0/3 3 0 4m4s % k describe services nginx-readiness-service Name: nginx-readiness-service ... TargetPort: 80/TCP Endpoints: ... -
自分の勘違い その3 じゃあ、これで設定しておけば完璧。ヨシ! Liveness probe: 200を返す簡易的なHealth Check Readiness probe: Deep
Health Check(DBや依存サービス含めたcheck -
安直に指定するのは危険 例えば、ケーススタディとしてDBが高負荷になった状況を考える 問題のシナリオ例: Readiness probeにDeep Health Checkを設定している DBが高負荷によりDeep Health Checkが失敗
PodがReadyにならなず他のPodに負荷が集中 全てのpodが落ちるとユーザーはアプリケーションのエラー画面ではなくALB等の デフォルトのエラー画面を見ることになる 外部コンポーネントのトラブルは、Pod自体の再起動やサービスアウトだけでは解決 する問題ではない。 -
Readiness gateの役割 Readiness Gate(準備完了ゲート)とは、Kubernetesにおいて、Podの準備状態をより 細かく制御するための機能 主な用途: AWS Load Balancer Controllerと連携して、Podがターゲットグループに登録される
まで待機 Podの準備が完了するまで、古いPodの削除を遅延させ、ダウンタイムを削減 外部サービスとの連携を確実にするための追加の条件を設定 -
Deregistration delayとは? ALBがターゲットグループからターゲット(今回はPod)を外す際の待機時間 新しいリクエストの送信を停止し、処理中のリクエストが完了するのを待つ デフォルト: 300秒 対策 アプリケーション側のリクエスト処理時間やタイムアウトをもとに設定 例えば、アプリケーション側が30秒必要なら、Deregistration delayはそれ以上の
時間にする そして、Podの終了はDeregistration delayの後の時間になるように調整 -
Podの終了プロセスについて Podが終了する時の流れ 1. Pod削除の開始 - デプロイ等でPod削除が開始 - Podのステータスが Terminating に変更
2. PreStopフックの実行 (設定されている場合) - コンテナ内で preStop ライフサイクルフックが実行 - アプリケーションの正常終了処理を実行する時間を確保 3. SIGTERMシグナルの送信 - kubeletがコンテナのメインプロセスにSIGTERMシグナルを送信 - アプリケーションはこのシグナルを受け取って正常終了処理を開始 -
4. terminationGracePeriodSecondsの待機 - デフォルト30秒間、アプリケーションの正常終了を待機 - この間にアプリケーションは処理中のリクエストを完了させる 5. SIGKILLシグナルの送信 (必要に応じて) -
terminationGracePeriodSeconds経過後も終了しない場合 - kubeletがSIGKILLシグナルを送信して強制終了 6. Podの完全削除 - コンテナが完全に終了後、Podリソースが削除される -
やったこと その2 Podの終了時の挙動制御 terminationGracePeriodSecondsとpreStop lifecycleの設定 preStop lifecycle hook: コンテナ終了前に70秒のsleepを実行 ALBがターゲットグループからPodを外す時間を確保 新しいリクエストが来ない状態でアプリケーションの終了処理を実行
処理中のリクエストが完了する時間を提供 terminationGracePeriodSeconds: Podの終了待機時間を90秒に延長 デフォルトの30秒では不十分 ALBのDeregistration delayと合わせて調整 -
apiVersion: apps/v1 kind: Deployment metadata: ... spec: template: spec: terminationGracePeriodSeconds:
90 containers: - name: example resources: ... lifecycle: preStop: exec: command: ["sh", "-c", "sleep 70"] -
各設定値の考え方 アプリケーションの設定 < ALBのDeregistration delay < Pre Stop Lifecycle Hook
< terminationGracePeriodSeconds 上記に設定することで、リクエストが送られている最中にPodが終了するリスクを低減