1. 程式人生 > >[Kubernetes]容器健康檢查和恢復機制

[Kubernetes]容器健康檢查和恢復機制

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: cant 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]容器健康檢查和恢復機制