はじめに
KubernetesにおけるLiveness ProbeとReadiness Probeについて解説し、実際に設定してPodを動かしてみたいと思います。
LivenessProbe/ReadinessProbeとは
LivenessProbe、ReadinessProbeは共に、Kubernetesにおけるコンテナのライフサイクル管理に関する設定となっています。つまり、コンテナが正しくリクエストを処理できるかを検出するための設定になります。
検出するための判断は下記が利用できます。
- コマンド実行
- 特定のポートに対する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ステータスを返すようになっています。
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はコンテナがリクエストを受け付けられるかチェック