Kubernetes中Pod健康檢查
目錄
- 1、何為健康檢查
- 2、探針分類
- 2.1、LivenessProbe探針(存活性探測)
- 2.2、ReadinessProbe探針(就緒型探測)
- 3、探針實現方法
- 3.1、Container Exec
- 3.2、HTTP Check
- 3.3、TCP Socket Check
- 4、探測行為引數
1、何為健康檢查
Kubernetes架構中,每個節點都會有kubelet
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:請求埠