注意
通常気にする必要のなさそうな小ネタです
最後まで追いきれてません
環境
kubernetes v1.10.5
本編
liveness probeについて
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
failするとkubeletがコンテナをkillするというのは書いてある通りでして、この場合コンテナの終了はexitCode:0で記録されています。
Last State: Terminated
Reason: Completed
Exit Code: 0
その後の挙動はpodに設定されたrestart policyによります。
Alwaysの場合はひたすら再起動を繰り返します。
Neverの場合は当然そのまま終了します。
exitCodeが0の正常終了なのでステータスはCompletedでした。
NAME READY STATUS RESTARTS AGE
test 0/1 Completed 0 38s
そうするとOnfailureの場合は…?
試しに動かしてみたところ(なんかちょっとバグっぽい)謎挙動でした。
以下検証
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
restartPolicy: OnFailure
containers:
- name: test
image: nginx
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 1
こんな感じのpodを立てて
$ kubectl exec test rm /usr/share/nginx/html/index.html
とやると数秒後に
0s 0s 1 test.156069c40d136031 Pod spec.containers{test} Normal Killing kubelet, ip-10-0-10-131.ap-northeast-1.compute.internal Killing container with id docker://test:Container failed liveness probe.. Container will be killed and recreated.
このようなイベントが発生してコンテナが作り直されました。
NAME READY STATUS RESTARTS AGE
test 1/1 Running 1 1m
restartsが1になってます。
exit codeは0でもlivenessがfailした場合はrestartされるみたいですね。
ところがコンテナが作り直されるたびにindex.htmlを消し続けたところ
NAME READY STATUS RESTARTS AGE
test 0/1 Completed 3 2m
終了してしまいました
条件はきちんと追ってないのですが、どうもrestart時にbackoffが入ると終了になってしまうような感じがします。
個人的には興味がありますがrestart policyがOnfailureでliveness probeを使うというケースがないので深追いせず終了にします。
ちなみにこの辺りを見ると
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#when-should-you-use-liveness-or-readiness-probes
If you’d like your Container to be killed and restarted if a probe fails, then specify a liveness probe, and specify a restartPolicy of Always or OnFailure.
とあるのでOnfailureの場合もrestartするのが正しい挙動のようですが、繰り返すと終了することについての記述は見当たりませんでした。