k8s的容器監測探針


大部分的應用程序我們在部署的時候都會適當的添加監控,對於運行載體容器則更應該如此。kubernetes提供了 liveness probes來檢查我們的應用程序。它是由節點上的kubelet定期執行的。

首先說一下Pod的整個生命階段:

  • Pending:表示集群系統正在創建Pod,但是Pod中的container還沒有全部被創建,這其中也包含集群為container創建網絡,或者下載鏡像的時間;
  • Running:表示pod已經運行在一個節點商量,並且所有的container都已經被創建。但是並不代表所有的container都運行,它僅僅代表至少有一個container是處於運行的狀態或者進程出於啟動中或者重啟中;
  • Succeeded:所有Pod中的container都已經終止成功,並且沒有處於重啟的container;
  • Failed:所有的Pod中的container都已經終止了,但是至少還有一個container沒有被正常的終止(其終止時的退出碼不為0)

對於liveness probes的結果也有幾個固定的可選項值:

  • Success:表示通過檢測
  • Failure:表示沒有通過檢測
  • Unknown:表示檢測沒有正常進行

Liveness Probe的種類:

  • ExecAction:在container中執行指定的命令。當其執行成功時,將其退出碼設置為0;
  • TCPSocketAction:執行一個TCP檢查使用container的IP地址和指定的端口作為socket。如果端口處於打開狀態視為成功;
  • HTTPGetAcction:執行一個HTTP默認請求使用container的IP地址和指定的端口以及請求的路徑作為url,用戶可以通過host參數設置請求的地址,通過scheme參數設置協議類型(HTTP、HTTPS)如果其響應代碼在200~400之間,設為成功。

當前kubelet擁有兩個檢測器,他們分別對應不通的觸發器(根據觸發器的結構執行進一步的動作):

  • Liveness Probe:表示container是否處於live狀態。如果 LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨后kubelet將kill掉 container,並根據RestarPolicy進行進一步的操作。默認情況下LivenessProbe在第一次檢測之前初始化值為 Success,如果container沒有提供LivenessProbe,則也認為是Success;
  • ReadinessProbe:表示container是否以及處於可接受service請求的狀態了。如 果ReadinessProbe失敗,endpoints controller將會從service所匹配到的endpoint列表中移除關於這個container的IP地址。因此對於Service匹配到的 endpoint的維護其核心是ReadinessProbe。默認Readiness的初始值是Failure,如果一個container沒有提供 Readiness則被認為是Success。

對於LivenessProbe和ReadinessProbe用法都一樣,擁有相同的參數和相同的監測方式。

  • initialDelaySeconds:用來表示初始化延遲的時間,也就是告訴監測從多久之后開始運行,單位是秒
  • timeoutSeconds: 用來表示監測的超時時間,如果超過這個時長后,則認為監測失敗

當前對每一個Container都可以設置不同的restartpolicy,有三種值可以設置:

  • Always: 只要container退出就重新啟動
  • OnFailure: 當container非正常退出后重新啟動
  • Never: 從不進行重新啟動

如果restartpolicy沒有設置,那么默認值是Always。如果container需要重啟,僅僅是通過kubelet在當前節點進行container級別的重啟。

最后針對LivenessProbe如何使用,請看下面的幾種方式,如果要使用ReadinessProbe只需要將livenessProbe修改為readinessProbe即可:

apiVersion: v1
kind: Pod
metadata:
  name: probe-exec
  namespace: coocla
spec:
  containers:
  - name: nginx
    image: nginx
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/health
      initialDelaySeconds: 5
      timeoutSeconds: 1
---
apiVersion: v1
kind: Pod
metadata:
  name: probe-http
  namespace: coocla
spec:
  containers:
  - name: nginx
    image: nginx
    livenessProbe:
      httpGet:
        path: /
        port: 80
        host: www.baidu.com
        scheme: HTTPS
      initialDelaySeconds: 5
      timeoutSeconds: 1
---
apiVersion: v1
kind: Pod
metadata:
  name: probe-tcp
  namespace: coocla
spec:
  containers:
  - name: nginx
    image: nginx
    livenessProbe:
      initialDelaySeconds: 5
      timeoutSeconds: 1
      tcpSocket:
        port: 80

關於kubectl資源創建的語法可以參考: kubernetes技術學習之—Construct語法

我們使用上面的construct創建資源:

kubectl create -f probe.yaml
kubectl get event


免責聲明!

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



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