[Kubernetes]容器健康檢查和恢復機制
阿新 • • 發佈:2018-10-07
file ima star 同時 bob bsp ber pan 出現
在Kubernetes中,可以為Pod裏的容器定義一個健康檢查探針(Probe),這樣Kubernetes會根據這個Probe的返回值決定這個容器的狀態,而不是直接以容器是否允許(來自Docker返回的信息)作為依據。
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: test-liveness-exec spec: containers: - name: liveness image: 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的容器在啟動之後做的第一件事是在/tmp目錄下創建一個healthy文件,以此作為自己已經正常運行的標識,而30s過後它會把這個文件刪除掉。同時還定義了一個livenessProbe,類型是exec,它會在容器啟動後執行指定的命令:“cat /tmp/healthy”,如果這個文件存在,這條命令返回值就是0,Pod就會認為這個容器不僅已經啟動,而且是健康的,這個健康檢查在啟動5s後開始執行,每5s執行一次。
$ kubectl create -f test-liveness-exec.yaml $ kubectl get pod NAME READY STATUS RESTARTS AGE test-liveness-exec 1/1 Running 0 10s ####30s後 $ kubectl describe pod test-liveness-exec FirstSeen LastSeen Count From SubobjectPath Type Reason Message--------- -------- ----- ---- ------------- -------- ------ ------- 2s 2s 1 {kubelet worker0} spec.containers{liveness} Warning Unhealthy Liveness probe failed: cat: can‘t open ‘/tmp/healthy‘: No such file or directory $ kubectl get pod test-liveness-exec NAME READY STATUS RESTARTS AGE liveness-exec 1/1 Running 1 1m
可以看到,健康檢查報告容器不健康,但是Pod保存了running狀態,這是為什麽呢?
認真看可以發現。RESTARTS字段已經變成1了,即這個異常的容器已經被Kubernetes重啟了,在這個過程中,Pod保存Running狀態不變。Kubernetes沒有Docker的Stop語義,所以雖然是重啟,實際卻是重新創建了容器,這個功能就是Kubernetes裏的Pod恢復機制(restartPolicy),它是Pod的Spec部分的一個標準字段(pod.spec.restartPolicy),默認值為Always,即任何時候這個容器發送了異常,一定會被重新創建。
Pod的恢復過程,永遠都是發送在當前節點上,而不會跑到別的節點上去,即如果這個宿主機宕機了,這個pod也不會主動遷移到其他節點上去。如果想讓Pod出現在其他可用節點上,就必須用Deployment這樣的控制器來管理Pod。
[Kubernetes]容器健康檢查和恢復機制