Kubernetes中Pod健康檢查


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時,可通過livenessreadiness兩種方式來探測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、探針實現方法

LivenessProbeReadinessProbe都可配置以下三種探針實現方式:

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:請求端口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM