kubernetes容器探針檢測


系列目錄

kubernetes提供了livenessProbe(可用性探針)readinessProbe(就緒性探針)對容器的健康性進行檢測,當然這僅僅簡單的關於可用性方面的探測,實際上我們不僅僅要對容器進行健康檢測,還要對容器內布置的應用進行健康性檢測,這不在本篇討論之列,后面會有專門篇幅來討論結合APM工具,grafana和prometheus的應用檢測預警機制.

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:用來表示初始化延遲的時間,也就是告訴監測從多久之后開始運行,單位是秒

periodSeconds:檢測的間隔時間,kubernetes每隔一段時間會檢測一次,默認為10秒,最小為1秒

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

檢測方式

  • exec-命令

在用戶容器內執行一次命令,如果命令執行的退出碼為0,則認為應用程序正常運行,其他任務應用程序運行不正常。

……
  livenessProbe:
    exec:
      command:
      - cat
      - /home/laizy/test/hostpath/healthy
……
  • TCPSocket
    將會嘗試打開一個用戶容器的Socket連接(就是IP地址:端口)。如果能夠建立這條連接,則認為應用程序正常運行,否則認為應用程序運行不正常。

  • HTTPGet

調用容器內Web應用的web hook,如果返回的HTTP狀態碼在200和399之間,則認為應用程序正常運行,否則認為應用程序運行不正常。每進行一次HTTP健康檢查都會訪問一次指定的URL。

……
  httpGet: #通過httpget檢查健康,返回200-399之間,則認為容器正常
    path: / #URI地址
    port: 80 #端口號
    #host: 127.0.0.1 #主機地址
    scheme: HTTP #支持的協議,http或者https
  httpHeaders:’’ #自定義請求的header
……
  • 部署實例
cat << EOF > inessprobe.yaml
apiVersion: v1 
kind: ReplicationController 
metadata: 
  name: inessprobe
  labels: 
    project: lykops
    app: inessprobe
    version: v1  
spec:
  replicas: 6
  selector: 
    project: lykops
    app: inessprobe
    version: v1
    name: inessprobe
  template: 
    metadata:
      labels: 
        project: lykops
        app: inessprobe
        version: v1
        name: inessprobe
    spec:
      restartPolicy: Always 
      containers:
      - name: inessprobe
        image: web:apache 
        imagePullPolicy: Never 
        command: ['sh',"/etc/run.sh" ] 
        ports:
        - containerPort: 80
          name: httpd
          protocol: TCP
        readinessProbe:
          httpGet:
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 120 
          periodSeconds: 15 
          timeoutSeconds: 5
        livenessProbe: 
          httpGet: 
            path: /
            port: 80
            scheme: HTTP
          initialDelaySeconds: 180 
          timeoutSeconds: 5 
          periodSeconds: 15 
EOF
 
cat << EOF > inessprobe-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: inessprobe
  labels:
    project: lykops
    app: inessprobe
    version: v1
spec:
  selector:
    project: lykops
    app: inessprobe
    version: v1
  ports:
  - name: http
    port: 80
    protocol: TCP
EOF
 
kubectl create -f inessprobe-svc.yaml
kubectl create -f inessprobe.yaml
  • 參數說明:

initialDelaySeconds:容器啟動后第一次執行探測是需要等待多少秒。

periodSeconds:執行探測的頻率。默認是10秒,最小1秒。

timeoutSeconds:探測超時時間。默認1秒,最小1秒。

successThreshold:探測失敗后,最少連續探測成功多少次才被認定為成功。默認是1。對於liveness必須是1。最小值是1。

failureThreshold:探測成功后,最少連續探測失敗多少次才被認定為失敗。默認是3。最小值是1。


免責聲明!

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



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