對pod的健康檢查可以通過兩類探針來檢查: LivenessProbe 和 ReadinessProbe
LivenessProbe探針:用於判斷容器是否存活(running狀態),如果LivenessProbe探針探測到容器不健康,則kubelet將殺掉該容器,並根據容器的重啟策略做相應的處理。
如果一個容器不包含LivenessProbe探針,那么kubelet認為該容器的LivenessProbe探針返回的值永遠是"Success"。
ReadinessProbe: 用於判斷容器是否啟動完成(ready狀態),可以接收請求。如果ReadinessProbe探針檢測到失敗,則Pod的狀態將被修改。Endpoint Controller將從Service的
Endpoint中刪除包含該內容所在pod的Endpoint
kubelet定期執行LivenessProbe探針來診斷容器IDE健康狀況。LivenessProbe有三種實現方式:
1、ExecAction: 在容器內部執行一個命令,如果該命令的返回碼為0,則表明容器健康。
如: 通過執行 “cat /tmp/health”判斷容器運行是否正常。而pod創建后,在創建/tmp/health文件的10秒后刪除該文件,健康檢查的初始探測時間(initialDelaySeconds)15秒,
探測結果為fail,導致kubelet殺掉該容器並重啟。
[root@salt php-redis]# cat test.yaml apiVersion: v1 kind: pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness image: gcr.io/google_containers/busybox args: - /bin/sh - -c - echo ok > /tmp/health; sleep 10; rm -rf /tmp/health; sleep 600 livenessProbe: exec: command: - cat - /tmp/health initialDelaySeconds: 15 timeoutSeconds: 1
2、TCPSocketAction: 通過容器的IP地址和端口號執行TCP檢查,如果能夠建立TCP鏈接,則表明容器健康
如:通過與容器的localhost:80 建立TCP連接進行健康檢查。
[root@salt php-redis]# cat test-TCP.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-healthcheck spec: containers: - name: naginx image: nginx ports: - containerPort: 80 livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 30 timeoutSeconds: 1
3、HTTPGetAction: 通過容器的IP地址、端口號及路徑調用HTTP Get方法,如果響應的狀態碼大於等於200且小於400,則認為容器狀態健康。
如: kubelet定時發送HTTP請求到localhost:80/_status/healthz來進行容器應用的健康檢查。
[root@salt php-redis]# cat test-http.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-healthcheck spec: containers: - name: nginx image: nginx ports: - containerPort: 80 livenessProbe: httpGet: path: /_status/healthz port: 80 initialDelaySeconds: 30 timeoutSconds: 1
對於每種探測方式,都需要設置initialDelaySeconds和timeoutSeconds兩個參數,他們的含義分別為:
initialDelaySeconds: 啟動容器后進行首次健康檢查的等待時間,單位為秒
timeoutSeconds: 健康檢查發送請求后等待響應的超時時間,單位為秒。當超時發生時,kubelet會認為容器已經無法提供服務,會重啟該容器。