kubernetes容器探針檢測

系列目錄html

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

pod生命週期階段

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

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

  • Success:表示經過檢測apache

  • Failure:表示沒有經過檢測api

  • Unknown:表示檢測沒有正常進行網絡

Liveness Probe的種類:app

ExecAction:在container中執行指定的命令。當其執行成功時,將其退出碼設置爲0;
TCPSocketAction:執行一個TCP檢查使用container的IP地址和指定的端口做爲socket。若是端口處於打開狀態視爲成功;socket

HTTPGetAcction:執行一個HTTP默認請求使用container的IP地址和指定的端口以及請求的路徑做爲url,用戶能夠經過host參數設置請求的地址,經過scheme參數設置協議類型(HTTP、HTTPS)若是其響應代碼在200~400之間,設爲成功。tcp

當前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。