存活探針(Liveness)、就緒探針(Readiness)、啓動探針(Startup)、容器鉤子

一、探針

1.1 探針類型

LivenessProbe

用於判斷容器是否存活(running狀態),如果LivenessProbe探針探測到容器不健康,則kubelet殺掉該容器,並根據容器的重啓策略做相應的處理。如果一個容器不包含LivenessProbe探針,則kubelet認爲該容器的LivenessProbe探針返回的值永遠是“Success”。

ReadinessProbe

用於判斷容器是否啓動完成(ready狀態),可以接收請求。如果ReadinessProbe探針檢測到失敗,則Pod的狀態被修改。Endpoint Controller將從Service的Endpoint中刪除包含該容器所在Pod的Endpoint。

StartupProbe

指示容器中的應用是否已經啓動。如果提供了啓動探針(startup probe),則禁用所有其他探針,直到它成功爲止。如果啓動探針失敗,kubelet 將殺死容器,容器服從其重啓策略進行重啓。如果容器沒有提供啓動探針,則默認狀態爲成功Success。

1.2 探針動作

  • ExecAction:在容器內執行指定命令。如果命令退出時返回碼爲 0 則認爲診斷成功。
    livenessProbe:
      exec:
        command: ["cat /tmp/health"]
      initialDelaySeconds: 5
      periodSeconds: 5
  • TCPSocketAction:對指定端口上的容器的 IP 地址進行 TCP 檢查。如果端口打開,則診斷被認爲是成功的。
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 15
      periodSeconds: 20
  • HTTPGetAction:對指定的端口和路徑上的容器的 IP 地址執行 HTTP Get 請求。如果響應的狀態碼大於等於200 且小於 400,則診斷被認爲是成功的。
    livenessProbe:
      httpGet:
        # 當沒有定義 "host" 時,使用 "PodIP"
        # host: my-host
        # 當沒有定義 "scheme" 時,使用 "HTTP" scheme 只允許 "HTTP" 和 "HTTPS"
        # scheme: HTTPS
        path: /index.html
        port: 80
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 15
      timeoutSeconds: 1

1.3 探針配置

探針有很多配置字段,可以使用這些字段精確的控制存活和就緒檢測的行爲:

  • initialDelaySeconds:容器啓動後要等待多少秒後存活和就緒探測器才被初始化,默認是 0 秒,最小值是 0。
  • periodSeconds:執行探測的時間間隔(單位是秒)。默認是 10 秒。最小值是 1。
  • timeoutSeconds:探測的超時後等待多少秒。默認值是 1 秒。最小值是 1。
  • successThreshold:探測器在失敗後,被視爲成功的最小連續成功數。默認值是 1。存活探測的這個值必須是 1。最小值是 1。
  • failureThreshold:當 Pod 啓動了並且探測到失敗,Kubernetes 的重試次數。存活探測情況下的放棄就意味着重新啓動容器。就緒探測情況下的放棄 Pod 會被打上未就緒的標籤。默認值是 3。最小值是 1。

HTTP探針可以在 httpGet 上配置額外的字段:

  • host:連接使用的主機名,默認是 Pod 的 IP。也可以在 HTTP 頭中設置 “Host” 來代替。
  • scheme:用於設置連接主機的方式(HTTP 還是 HTTPS)。默認是 HTTP。
  • path:訪問 HTTP 服務的路徑。
  • httpHeaders:請求中自定義的 HTTP 頭。HTTP 頭字段允許重複。
  • port:訪問容器的端口號或者端口名。如果數字必須在 1 ~ 65535 之間。

對於 HTTP 探測,kubelet 發送一個 HTTP 請求到指定的路徑和端口來執行檢測。除非 httpGet 中的 host 字段設置了,否則 kubelet 默認是給 Pod 的 IP 地址發送探測。如果 scheme 字段設置爲了 HTTPS,kubelet 會跳過證書驗證發送 HTTPS 請求。大多數情況下,不需要設置host 字段。這裏有個需要設置 host 字段的場景,假設容器監聽 127.0.0.1,並且 Pod 的 hostNetwork 字段設置爲了 true。那麼 httpGet 中的 host 字段應該設置爲 127.0.0.1。可能更常見的情況是如果 Pod 依賴虛擬主機,你不應該設置 host 字段,而是應該在 httpHeaders 中設置 Host。

對於一次 TCP 探測,kubelet 在節點上(不是在 Pod 裏面)建立探測連接,這意味着你不能在 host 參數上配置 service name,因爲 kubelet 不能解析 service name。

1.4 實例

那麼官方提供的三種探針我們該如何組合使用呢?

1、首先,如果打算部署一個Java SpringBoot項目,我們假定他的項目啓動時間爲30秒左右,30秒後才能正常提供服務,那麼我們就應該在這個時間段設置一個啓動探針 StartupProbe

startupProbe:
  httpGet:
    path: /doc.html
    port: 40017
  initialDelaySeconds: 10
  failureThreshold: 10
  periodSeconds: 5

該容器啓動10秒後,startupProbe首先檢測,應用程序最多有 50 秒(10次 * 5秒 = 50s)完成啓動。一旦startupProbe成功一次,livenessProbe將接管,以對後續運行過程中容器死鎖提供快速響應。如果startupProbe從未成功,則容器將在50s後被殺死。

2、第二步加入就緒探針 ReadinessProbe 用來驗證該容器內的服務可以正常提供服務。

readinessProbe:
  httpGet:
    path: /doc.html
    port: 40017
  initialDelaySeconds: 10
  failureThreshold: 3
  periodSeconds: 5

這裏我們探測服務的40017端口是否啓動監聽。經過驗證,加上readinessProbe探針基本將宕機時間大幅縮減,readinessProbe會確保服務在你指定的探測命令執行成功的情況下才開始接受請求。
即便是服務的副本數只有1的情況下也不會出現長時間宕機,因爲只有新的pod被探活成功,纔會去停止舊有的一個pod,也即我們的服務被成功啓動前,舊有的pod會一直存在處理請求的。

3、第三步加入存活探針 LivenessProbe 來對服務的長時間健康檢測。

livenessProbe:
  httpGet:
    path: /doc.html
    port: 40017
  failureThreshold: 1
  periodSeconds: 10

livenessProbe的設計是爲了在 pod 啓動成功後進行健康探測。

二、鉤子

2.1 鉤子類型

PostStart

這個鉤子在創建容器之後立即執行。 但是,不能保證鉤子會在容器入口點之前執行。 沒有參數傳遞給處理程序。

PreStop

在容器終止之前是否立即調用此鉤子,取決於 API 的請求或者管理事件,類似活動探針故障、資源搶佔、資源競爭等等。 如果容器已經完全處於終止或者完成狀態,則對 preStop 鉤子的調用將失敗。 它是阻塞的,同時也是同步的,因此它必須在刪除容器的調用之前完成。 沒有參數傳遞給處理程序。

2.2 鉤子動作

容器可以通過實現和註冊該鉤子的處理程序來訪問該鉤子。 針對容器,有兩種類型的鉤子處理程序可供實現:

  • Exec - 執行一個特定的命令,在容器的 cgroups 和名稱空間中。 命令所消耗的資源根據容器進行計算。
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
  • HTTP - 對容器上的特定端點執行 HTTP 請求。
        lifecycle:
          preStop:
            httpGet:
              path: /prestop
              port: 8080
              scheme: HTTP
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章