【Kubernetes】LivenessProbeとReadinessProbeを試してみる

スポンサーリンク

はじめに

KubernetesにおけるLiveness ProbeとReadiness Probeについて解説し、実際に設定してPodを動かしてみたいと思います。

LivenessProbe/ReadinessProbeとは

LivenessProbe、ReadinessProbeは共に、Kubernetesにおけるコンテナのライフサイクル管理に関する設定となっています。つまり、コンテナが正しくリクエストを処理できるかを検出するための設定になります。

Podのライフサイクル
このページではPodのライフサイクルについて説明します。Podは定義されたライフサイクルに従いPendingフェーズから始まり、少なくとも1つのプライマリーコンテナが正常に開始した場合はRunningを経由し、次に失敗により終了したコンテナの有無に応じて、SucceededまたはFailedフェーズを経由します。Pod...

検出するための判断は下記が利用できます。

  • コマンド実行
  • 特定のポートに対するTCPチェック
  • 特定のポートとパスに対するHTTP Getリクエスト

LivenessProbe

LivenessProbeは、コンテナが動いているかを判断します。動いていない場合はコンテナが再起動されます。

コンテナに不具合があったときにクラッシュできない場合に利用されます。

設定例は下記です。

livenessProbe:
  httpGet:                # HTTPによるチェック
    path: /healthz
    port: 8080
  initialDelaySeconds: 30 # 最初にチェックするまでの待機時間
  periodSeconds: 60       # チェックする頻度

ReadinessProbe

ReadinessProbeは、コンテナがリクエストに応答できるかを判断します。応答できない場合はリクエストが送られてこないようになります。

コンテナ起動時にファイルなどを読み込み時間がかかる場合に利用されます。

設定例は下記です。LivenessProbeと項目は同じになります。

readinessProbe:
  httpGet:                # HTTPによるチェック
    path: /healthz
    port: 8080
  initialDelaySeconds: 30 # 最初にチェックするまでの待機時間
  periodSeconds: 60       # チェックする頻度

LivenessProbeを使ってみる

LivenessProbeを使ってみます。

作成するPodのマニフェストpod-liveness.ymlは下記の通りです。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

イメージとして利用しているk8s.gcr.io/livenessは始めの10秒は200ステータスが返しますが、その後は500ステータスを返すようになっています。

Liveness Probe、Readiness ProbeおよびStartup Probeを使用する
このページでは、LivenessProbe、ReadinessProbeおよびStartupProbeの使用方法について説明します。kubeletは、LivenessProbeを使用して、コンテナをいつ再起動するかを認識します。例えば、アプリケーション自体は起動しているが、処理を継続することができないデッドロック状態を...

Podを作成します。

kubectl apply -f pod-liveness.yaml

Podの詳細からEventsを確認するとUnhealthyとなっているメッセージがあり、LivenessProbeが失敗していることがわかります。
その後コンテナを再起動していることがわかります。

❯ kubectl describe pod liveness-http
Name:         liveness-http
Namespace:    default

          :
          :

Events:
  Type     Reason     Age               From               Message
  ----     ------     ----              ----               -------
  Normal   Scheduled  42s               default-scheduler  Successfully assigned default/liveness-http to docker-desktop
  Normal   Pulled     41s               kubelet            Successfully pulled image "k8s.gcr.io/liveness" in 1.2591876s
  Normal   Pulled     20s               kubelet            Successfully pulled image "k8s.gcr.io/liveness" in 1.5981415s
  Warning  Unhealthy  4s (x6 over 28s)  kubelet            Liveness probe failed: HTTP probe failed with statuscode: 500
  Normal   Killing    4s (x2 over 22s)  kubelet            Container liveness-container failed liveness probe, will be restarted
  Normal   Pulling    4s (x3 over 42s)  kubelet            Pulling image "k8s.gcr.io/liveness"
  Normal   Created    2s (x3 over 40s)  kubelet            Created container liveness-container
  Normal   Started    2s (x3 over 40s)  kubelet            Started container liveness-container
  Normal   Pulled     2s                kubelet            Successfully pulled image "k8s.gcr.io/liveness" in 1.4489923s

ReadinessProbeを使ってみる

次に、ReadinessProbeを使ってみます。

作成するPodのマニフェストpod-readiness.ymlは下記の通りです。
内容はLivenessProbeとほぼ同じです。
initialDelaySecondsを20秒にしています。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: readiness
  name: readiness-http
spec:
  containers:
  - name: readiness-container
    image: k8s.gcr.io/liveness
    args:
    - /server
    readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 20
      periodSeconds: 5

Podを作成します。

kubectl apply -f pod-readiness.yaml

Podの詳細からEventsを確認すると20秒たったところでUnhealthyとなりReadinessProbeが失敗していることがわかります。

❯ kubectl describe pod readiness-http
Name:         readiness-http
Namespace:    default

          :
          :

Events:
  Type     Reason     Age   From               Message
  ----     ------     ----  ----               -------
  Normal   Scheduled  28s   default-scheduler  Successfully assigned default/readiness-http to docker-desktop
  Normal   Pulling    28s   kubelet            Pulling image "k8s.gcr.io/liveness"
  Normal   Pulled     26s   kubelet            Successfully pulled image "k8s.gcr.io/liveness" in 1.7735424s
  Normal   Created    26s   kubelet            Created container readiness-container
  Normal   Started    26s   kubelet            Started container readiness-container
  Warning  Unhealthy  4s    kubelet            Readiness probe failed: HTTP probe failed with statuscode: 500

Podのステータスを見てみるとREADYが0/1となり、リクエストを受けなくなっています。

❯ kubectl get pod
NAME             READY   STATUS    RESTARTS   AGE
readiness-http   0/1     Running   0          22s

まとめ

  • LivenessProbeはコンテナが動いているかチェック
  • ReadinessProbeはコンテナがリクエストを受け付けられるかチェック

参考

タイトルとURLをコピーしました