當使用kuberentes的時候,一定會遇過Pod在啟動後過沒多久就掛掉然後又重新啟動的循環?你有沒有想過 kubernetes 是如何偵測 Pod 是否還活著?雖然Container 已經啟動,但是 kubernetes 如何知道Container 的進度是否準備好能與其他服務連線了呢?
Kubelet 使用 Liveness probe 功能來確定何時重啟 Container 。當應用處於運做,但無法做進一步操作,Liveness 將偵測到 Deadlock,重啟處於該狀態下的容器,使程式在存在 Bug 的情況下依然能繼續運作。
Kubelet 使用 Readiness probe 來確定 Conatiner 是否已可以連接。只有當 Pod 中的 COntainer 都處於就緒狀態時 kubelet 才會認定該Pod處於就緒狀態。該信號的作用是控制哪些 Pod 應該作為 service 的後端。如果Pod處於非就緒狀態,那麼它們將會被從service的load balancer中移除。
許多長時間運行的應用程序最終會轉換到 broken 狀態,除非重新啟動,否則無法恢復。 Kubernetes 提供了 liveness probe 來檢測並且恢復。
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
透過以上的定義yaml建立一個 Pod 並且裡邊包含一個 Container 。
在這邊操作時需要開啟兩個cmd,首先第一個cmd 請執行以下指令
/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
接下來開啟第二個cmd,建立Pod
$ kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/exec-liveness.yaml
結果顯示沒有失敗的 liveness probe:
$ kubectl describe pod liveness-exec
...
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Killing 44m (x624 over 15d) kubelet, minikube Killing container with id docker://liveness:Container failed liveness probe.. Container will be killed and recreated.
Warning Unhealthy 14m (x1894 over 15d) kubelet, minikube Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Warning BackOff 4m26s (x7271 over 15d) kubelet, minikube Back-off restarting failed container
過 30秒在重新查詢一次 Liveness-exec Pod 會發現已經重起了
$ kubectl describe pod liveness-exec
NAME READY STATUS RESTARTS AGE
liveness-exec 1/1 Running 1 5m