Kubernetes中Pod健康檢查
- 2020 年 3 月 26 日
- 筆記
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:請求埠