操作場景
健康檢查是指容器運行過程中,根據用戶需要,定時檢查容器健康狀況。若不配置健康檢查,如果容器內應用程序異常,Pod將無法感知,也不會自動重啟去恢復。最終導致雖然Pod狀態顯示正常,但Pod中的應用程序異常的情況。
Kubernetes提供了三種健康檢查的探針:
- 存活探針: livenessProbe,用于檢測容器是否正常,類似于我們執行ps命令檢查進程是否存在。如果容器的存活檢查失敗,集群會對該容器執行重啟操作;若容器的存活檢查成功則不執行任何操作。
- 就緒探針: readinessProbe,用于檢查用戶業務是否就緒,如果未就緒,則不轉發流量到當前實例。一些程序的啟動時間可能很長,比如要加載磁盤數據或者要依賴外部的某個模塊啟動完成才能提供服務。這時候程序進程在,但是并不能對外提供服務。這種場景下該檢查方式就非常有用。如果容器的就緒檢查失敗,集群會屏蔽請求訪問該容器;若檢查成功,則會開放對該容器的訪問。
- 啟動探針 :startupProbe,用于探測應用程序容器什么時候啟動了。 如果配置了這類探測器,就可以控制容器在啟動成功后再進行存活性和就緒檢查, 確保這些存活、就緒探針不會影響應用程序的啟動。 這可以用于對啟動慢的容器進行存活性檢測,避免它們在啟動運行之前就被殺掉。
檢查方式
- HTTP 請求檢查
HTTP 請求方式針對的是提供HTTP/HTTPS服務的容器,集群周期性地對該容器發起HTTP/HTTPS GET請求,如果HTTP/HTTPS response返回碼屬于200~399范圍,則證明探測成功,否則探測失敗。使用HTTP請求探測必須指定容器監聽的端口和HTTP/HTTPS的請求路徑。
例如:提供HTTP服務的容器,HTTP檢查路徑為:/health-check;端口為:80;主機地址可不填,默認為容器實例IP,此處以172.16.0.186為例。那么集群會周期性地對容器發起如下請求:GET //172.16.0.186:80/health-check。
圖 HTTP請求檢查

TCP 端口檢查
對于提供TCP通信服務的容器,集群周期性地對該容器建立TCP連接,如果連接成功,則證明探測成功,否則探測失敗。選擇TCP端口探測方式,必須指定容器監聽的端口。
例如:我們有一個nginx容器,它的服務端口是80,我們對該容器配置了TCP端口探測,指定探測端口為80,那么集群會周期性地對該容器的80端口發起TCP連接,如果連接成功則證明檢查成功,否則檢查失敗。
圖 TCP端口檢查

執行命令檢查
命令檢查是一種強大的檢查方式,該方式要求用戶指定一個容器內的可執行命令,集群會周期性地在容器內執行該命令,如果命令的返回結果是0則檢查成功,否則檢查失敗。
對于上面提到的TCP端口檢查和HTTP請求檢查,都可以通過執行命令檢查的方式來替代:
對于TCP端口探測,我們可以寫一個程序來對容器的端口進行connect,如果connect成功,腳本返回0,否則返回-1。
對于HTTP請求探測,我們可以寫一個腳本來對容器進行wget。
wget //127.0.0.1:80/health-check
并檢查response 的返回碼,如果返回碼在200~399 的范圍,腳本返回0,否則返回-1。如下圖:
圖 執行命令檢查

注意
?必須把要執行的程序放在容器的鏡像里面,否則會因找不到程序而執行失敗。
如果執行的命令是一個shell腳本,由于集群在執行容器里的程序時,不在終端環境下,因此不能直接指定腳本為執行命令,需要加上腳本解析器。比如腳本是 **/data/scripts/health_check.sh** ,那么我們使用執行命令檢查時,指定的程序應該是 **sh /data/scripts/health_check.sh** 。究其原因是集群在執行容器里的程序時,不在終端環境下。
公共參數說明
表 公共參數說明
| 參數 | 參數說明 |
|---|---|
| 檢測周期(periodSeconds) | 探針檢測周期,單位為秒。例如,設置為30,表示每30秒檢測一次。 |
| 延遲時間(initialDelaySeconds) | 延遲檢查時間,單位為秒,此設置與業務程序正常啟動時間相關。 例如,設置為30,表明容器啟動后30秒才開始健康檢查,該時間是預留給業務程序啟動的時間。 |
| 超時時間(timeoutSeconds) | 超時時間,單位為秒。例如, 設置為10,表明執行健康檢查的超時等待時間為10秒,如果超過這個時間,本次健康檢查就被視為失敗。 若設置為0或不設置,默認超時等待時間為1秒。 |
| 成功閾值(successThreshold) | 探測失敗后,將狀態轉變為成功所需要的最小連續成功次數。 例如,設置為1時,表明健康檢查失敗后,健康檢查需要連續成功1次,才認為工作負載狀態正常。默認值是 1,最小值是 1。 存活和啟動探測的這個值必須是 1。 |
| 最大失敗次數(failureThreshold) | 當探測失敗時重試的次數。 存活探測情況下的放棄就意味著重新啟動容器。就緒探測情況下的放棄 Pod 會被打上未就緒的標簽。 默認值是 3。最小值是 1。 |
YAML示例
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: nginx:alpine
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 80
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet:
path: /healthz
port: 80
failureThreshold: 30
periodSeconds: 10