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

Categories:Kubernetes

ここでは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: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  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/healthy
      initialDelaySeconds: 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: 8080
      initialDelaySeconds: 5
      periodSeconds: 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: 5000
            failureThreshold: 60
            periodSeconds: 3

ここで、システムはfailureThreshold * periodSecondsの秒数(上の例では180秒)はアプリケーションの起動を待ち続け、その時間以内で素早く起動した場合はそれが検知でき次第、他のProbeも有効になります。

参考

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

返信がありません

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です