1、何為健康檢查
Kubernetes架構中,每個節點都會有kubelet
,容器健康檢查(Container Probe)的任務就是由Kubelet
定期執行的。
Kubelet會通過調用Pod中容器的Handler
來執行檢查動作,Handler
有以下三種類型:
- ExecAction:在容器中執行特定的命令,命令退出返回0(命令執行返回值:$?)表示成功
- TCPSocketAction:根據容器IP地址及特定的端口進行TCP檢查,端口訪問/開放/暴露表示成功
- HTTPGetAction:根據容器IP、端口及訪問路徑發起一次HTTP請求,如果返回狀態碼在200到400之間表示成功
每種檢查動作都可能會有三種返回狀態:
- Success:表示通過健康檢查
- Failure:表示沒有通過健康檢查
- Unknown:表示檢查動作失敗
2、探針分類
創建Pod時,可通過liveness
和readiness
兩種方式來探測Pod內容器的運行情況。
2.1、LivenessProbe探針(存活性探測)
判斷容器是否健康(Running狀態)並反饋給Kubelet。其實有很多應用長時間的后台運行后會逐漸的轉為不可用狀態,並且僅能通過重啟Pod操作恢復,那么存活性
探針機制就可以發現此類問題,並依據探測結果結合重啟策略觸發后續的執行。
kubernetes存活性探針支持的檢測方法為三種:ExecAction、TCPSocketAction和HTTPGetAction
如果一個容器沒有LivenessProbe探針,那么kubelet就會認為該容器的LivenessProbe探針返回的值永遠都會是Success。
2.2、ReadinessProbe探針(就緒型探測)
判斷容器服務是否可用(Ready狀態)能否對外提供服務,只有達到了Ready狀態的Pod才能接收請求,當容器里跑的業務起來之后容器的狀態才能為Ready,負責認為容器探測失敗,如果探測失敗,則系統會將Service后端Endpoint列表中移除其Pod IP,后續再恢復到Ready,則探測成功會將其Pod IP加回Endpoint列表。
3、探針實現方法
LivenessProbe
和ReadinessProbe
都可配置以下三種探針實現方式:
ReadinessProbe
的配置和LivenessProbe
類似,只需要將yaml中的livenessProbe
修改為readinessProbe
3.1、Container Exec
創建一個容器,通過檢查一個文件是否存在來判斷容器運行是否正常,如果文件存在則會返回狀態碼為0,容器運行30秒后,會將文件刪除,LivenessProbe檢查失敗則將重啟容器。
apiVersion: v1
kind: Pod
metadata:
name: exec
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
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
檢測到目錄不存在
[root@k8s-master01 health]# kubectl describe pod exec |grep "Liveness"
Liveness: exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3
Warning Unhealthy 4s (x3 over 14s) kubelet, k8s-node01 Liveness probe failed: cat: /tmp/healthy: No such file or directory
3.2、HTTP Check
創建一個Nginx容器,通過訪問/index.html來判斷服務是否存活,通過手動移除該文件的方式,能導致檢查失敗,從而重啟容器
apiVersion: v1
kind: Pod
metadata:
name: httpget
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /index.html # 訪問路徑
port: 80 # 容器端口
initialDelaySeconds: 5
periodSeconds: 5
手動將nginx容器的index.html文件移除
[root@k8s-master01 health]# kubectl exec -it httpget bash
root@httpget:/# mv /usr/share/nginx/html/index.html /tmp/
當index.html訪問返回狀態碼不為200時,就會重啟容器
[root@k8s-master01 health]# kubectl describe pod httpget |grep "Liveness"
Liveness: http-get http://:80/index.html delay=5s timeout=1s period=5s #success=1 #failure=3
Warning Unhealthy 59s (x3 over 69s) kubelet, k8s-node01 Liveness probe failed: HTTP probe failed with statuscode: 404
3.3、TCP Socket Check
通過對IP地址(請求連接的目標IP地址,默認為Pod IP)和端口號進行TCP檢查,如果可以建立TCP連接的話,則認為容器健康,它會比基於HTTP檢測方式更加的高效(HTTP是七層,TCP是四層),更節約資源,但是精確度微低,能建立成功並不代表頁面可展示。
apiVersion: v1
kind: Pod
metadata:
name: tcpSocket
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 3
4、探測行為參數
initiaDelaySeconds // 容器啟動之后多久開始檢測,默認為0秒
periodSeconds // 每隔多久檢測一次,默認為10秒,最小為1秒
failureThreshold // 檢測失敗幾次后則認為健康檢測失敗,默認為3次
successThreshold // 從檢測錯誤到成功需要幾次才認為健康檢測成功,默認為1次
timeoutSeconds // 執行檢測命令的最長時間,默認為1秒,最小為1秒
httpGet的屬性
host:主機名或IP
scheme:鏈接類型,HTTP或HTTPS,默認為HTTP
path:請求路徑
httpHeaders:自定義請求頭
port:請求端口