ここではKubernetesのPodにおける「Probe」を紹介します。
Contents
Probeとは
Probeとは、人間でいう「健康診断」のようなものです。このProbeの結果に応じて、コンピュータはPodの制御を行います。
Probe は kubelet により定期的に実行されるコンテナの診断です。診断を行うために、kubeletはコンテナに実装された Handlerを呼びます。
Podのライフサイクル | Kubernetes
ここでkubeletが呼ぶハンドラは、①コンテナ内で特定のコマンドを実行する「ExecAction」、②Podの特定ポートにTCPによるコネクションチェックを行う「TCPSocketAction」、③Podの特定のエンドポイントに対してHTTP GETリクエストを送信する「HTTPGetAction」の3種類があります。これらProbeの結果は「Success」「Failure」「Unknown」のいずれかです。
ここから、具体的なProbeの種類について紹介していきたいと思います。
Probeあれこれ
livenessProbe
コンテナが動いているかを示します。 livenessProbe に失敗すると、kubeletはコンテナを殺します、そしてコンテナはrestart policyに従います。 コンテナにlivenessProbeが設定されていない場合、デフォルトの状態は
Success
です。
livenessProbeは「コンテナは起動しているが、ずっとデットロック状態で処理が進まなくなっている」といった状況などを迅速に把握するために利用します。Manifestファイルでは、spec.containersがとるコンテナのリストで以下のように指定します。コードは公式よりお借りしました。
apiVersion: v1kind: Podmetadata: labels: test: liveness name: liveness-execspec: containers: - name: liveness image: k8s.gcr.io/busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600 livenessProbe:exec: # 「ExecAction」でProbeを行う command: # "cat /tmp/healthy"をコンテナ内で実行 - cat - /tmp/healthyinitialDelaySeconds: 5 # 最初のProbe実行前に5秒待つperiodSeconds: 5
readinessProbe
コンテナがリクエスト応答する準備ができているかを示します。 readinessProbeに失敗すると、エンドポイントコントローラーにより、ServiceからそのPodのIPアドレスが削除されます。 initial delay前のデフォルトのreadinessProbeの初期値は
Failure
です。 コンテナにreadinessProbeが設定されていない場合、デフォルトの状態はSuccess
です。
後述するstartupProbeは「起動したとき」のみのProbeですが、readinessProbeは全てのライフサイクル、つまりPodが起動している間はずっとProbeを繰り返し実行し続けるという特徴があります。また、このProbeは一時的にアプリケーションが使えないことを検知するものなので、readinessProbeに失敗した時の挙動も「Podの削除」ではなく「ServiceからそのPodのIPアドレス削除」となっています。
containers: - name: goproxy image: k8s.gcr.io/goproxy:0.1 ports: - containerPort: 8080 readinessProbe:tcpSocket: # 「TCPSocketAction」でProbeする port: 8080initialDelaySeconds: 5periodSeconds: 10
startupProbe
コンテナ内のアプリケーションが起動したかどうかを示します。 startupProbeが設定された場合、完了するまでその他のすべてのProbeは無効になります。 startupProbeに失敗すると、kubeletはコンテナを殺します、そしてコンテナはrestart policyに従います。 コンテナにstartupProbeが設定されていない場合、デフォルトの状態は
Success
です。
これは例えば「オートスケールで立ち上がったばかりのPodにはユーザからのHTTPリクエストを流さない」といったユースケースで利用できます。
containers: - name: sample-server image: hoge:latest ports:- containerPort: 5000 startupProbe:httpGet: # 「HTTPGetAction」でProbeする path: /heartbeat port: 5000failureThreshold: 60periodSeconds: 3
ここで、システムはfailureThreshold * periodSecondsの秒数(上の例では180秒)はアプリケーションの起動を待ち続け、その時間以内で素早く起動した場合はそれが検知でき次第、他のProbeも有効になります。
参考
- コンテナのProbe
- Liveness Probe、Readiness ProbeおよびStartup Probeを使用する
- KubernetesのLivenessProbe, ReadinessProbe, StartupProbeのベストプラクティス
Kubernetes完全ガイド 第2版 (top gear) [ 青山真也 ]価格:4,400円 (2022/5/26 06:17時点) 感想(0件) |