【k8s】Probeとは?概要とその種類を解説

ここではKubernetesのPodにおける「Probe」を紹介します。

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も有効になります。

参考

Kubernetes完全ガイド 第2版 (top gear) [ 青山真也 ]価格:4,400円
(2022/5/26 06:17時点)
感想(0件)