1. 程式人生 > >Kubernetes中Pod健康檢查

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

,容器健康檢查(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:請求埠