TechLunch

The free lunch is over.

Kubernetes入門4: Liveness and Readiness Probesを使ってみる

Kubernetes上で実行されるアプリケーションコンテナの状態を確認する仕組みとして、Liveness and Readiness Probesがあります。それぞれ、

  • Liveness probe
    • 失敗するとコンテナを再起動する
  • Readiness probe
    • 失敗するとコンテナにトラフィックを流さなくなる(コンテナの再起動はしない)

という特徴があります。

今回は、Kubernetes TasksのConfigure Liveness and Readiness Probesを試してみました。

Liveness Probeの例がいくつか載っていますが、この記事では「Linuxコマンド」のみ実行しています。

Linuxコマンドで状態確認

設定ファイルは次の通りです。

# https://k8s.io/examples/pods/probe/exec-liveness.yaml
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 -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

この設定ファイルでは、コンテナ一つのPodが定義されており、そのコンテナは起動後に、touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; というコマンドを実行しています。このコマンドでは、指定ディレクトリにファイルを作成し、30秒後に削除しています。

一方、liveness probeの設定をみると、5秒ごとに cat /tmp/healthy コマンドを実行し、ファイルの存在確認を行っています。そのため、30秒後にはコマンドが失敗し、コンテナの再起動を試みることになるはずです。

Podを実行。

$ kubectl create -f https://k8s.io/examples/pods/probe/exec-liveness.yaml

30秒後にPodの状態確認。

$ kubectl describe pod liveness-exec
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
<snip>
  Warning  Unhealthy  49s (x3 over 59s)  kubelet, test_node    Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
  Normal   Killing    18s                kubelet, test_node    Killing container with id docker://liveness:Container failed liveness probe.. Container will be killed and recreated.
<snip>

Liveness probeにより、コンテナの異常を検知し、コンテナ再起動を行っていることがわかります。

Readiness probeについても、元のドキュメントyamlファイルが載っていますので、興味がある方はご参照ください。