kuberbetes Pod 健康檢查

判斷 Pod 健康狀態的兩種方式

  • livenessProbe 存活性探針
  • readinessProbe 就緒性探針
1.livenessProbe 存活性探針

用於判斷容器是否存活,即 Running 狀態。如果 livenessProbe 探針檢測到容器不健康,則 kubelet 會殺死容器,並根據容器的重啓策略進行容器的重啓。如果容器沒有定義 livenessProbe 探針,則 livenessProbe 返回狀態永遠爲 Success。

2.readinessProbe 就緒性探針

用於判斷容器服務(service)是否可用,即 Ready 狀態。如果 Ready 狀態,則表示Service 與 Pod EndPoint 建立了關聯,並且將其保存到 EndPoint 列表中,以供服務調用;如果狀態變爲 Failure , Kubernetes 會將其從 EndPoint 列表中移除,保證通過 Service 訪問時不會將流量路由到不健康的 Pod 上,等到狀態恢復到 Ready 狀態再將其對應的 EndPoint 加入EndPoint 列表中。如果容器沒有定義 readinessProbe 探針,則 readiness 返回狀態永遠爲 Success。

探針的配置方式

通過 kubectl 定期對容器進行診斷,判斷容器狀態是否健康或者存活。

livenessProbe 和 readinessProbe 探測方式
  • ExecAction
  • TCPSocketAction
  • HTTPGetAction
三種探針的可能返回結果
  • Success:探測成功
  • Failure:探測失敗,更具重啓策略重啓容器
  • Unknow:探測失敗(未找到),不採取任何行動

enjoy coding!
ExecAction

在容器中執行自定義命令以判斷容器是否健康,命令退出時返回碼爲 0 ,則表示健康,其他值表示不健康。

例子:

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: innerpeacez/k8s.gcr.io-busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 20; rm -rf /tmp/healthy; sleep 60
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10
      periodSeconds: 5

這個例子中,busybox 鏡像其中之後執行了 touch /tmp/healthy 創建出 /tmp/healthy 目錄,30 s 後刪除這個目錄,livenessProbe 設置了 initialDelaySeconds: 10,會在容器啓動之後 10s 後進行初次探測,返回結果不出意外爲 Success ,表示容器健康。使用以下命令查看 Pod Event

kubectl describe  pod liveness-exec

在這裏插入圖片描述
一段時間後你可能會看到以下結果,顯示目錄不存在了。原因是periodSeconds: 5設置了 5s 後再次探測,但是目錄已經被刪除了,所以探測返回結果爲:Failure
在這裏插入圖片描述

TCPSocketAction

通過容器的 IP 和 port 進行 TCP 檢查,如果能夠建立 TCP 連接,則表示容器健康。

例子:

apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcpsocket
  labels:
    app: liveness-tcpsocket
spec:
  containers:
  - name: liveness-tcpsocket
    image: innerpeacez/k8s.gcr.io-goproxy:0.1
    ports:
    - containerPort: 8080
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

執行命令:

vim livenessProbe-tcpSocket.yaml # 將上面內容粘貼進來

kubectl apply -f livenessProbe-tcpSocket.yaml

例子中,livenessProbe 會與容器中的 localhost:8080 建立 TCP 連接,進行健康檢查。因爲容器啓動時,容器端口被設定爲 8080,所以可以建立 TCP 連接,livenessProbe 健康檢查返回 Success 。我們可以手動將 tcpSocket 檢查端口設置爲 8081 ,此時將無法建立 TCP 連接,可以通過下面的命令查看 Pod Event。

kubectl describe  pod liveness-tcpsocket

在這裏插入圖片描述
修改成 8081 再次查看 Pod Event
在這裏插入圖片描述
可以看出 unhealthy ,證明 tcpsocket 檢查返回值爲 failure

HTTPGetAction

通過容器的 IP Port 以及訪問路徑,發送 HTTP 請求進行調用,如果返回的狀態碼範圍爲 [200 , 400) ,則表示容易健康。

例子:

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: innerpeacez/k8s.gcr.io-liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

執行命令:

vim livenessProbe-httpget.yaml # 將上面內容粘貼進來

kubectl apply -f livenessProbe-httpget.yaml

同時可以執行以下命令查看 Event

kubectl describe pod liveness-http
readinessProbe 探測

方式和 livenessProbe 是一樣的,所以上述設置 livenessProbe 的地方同時也可以設置 readinessProbe 。如:

livenessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 10
  periodSeconds: 5
readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 10
  periodSeconds: 5
livenessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 20
readinessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 20
livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
    httpHeaders:
    - name: Custom-Header
      value: Awesome
  initialDelaySeconds: 3
  periodSeconds: 3
readinessProbe:
  httpGet:
    path: /healthz
    port: 8080
    httpHeaders:
    - name: Custom-Header
      value: Awesome
  initialDelaySeconds: 3
  periodSeconds: 3

livenessProbe 和 readinessProbe 相關配置

如上述的 initialDelaySeconds ,表示初次進行探測的時間,以下是完整的配置列表

configure probe description
initialDelaySeconds 容器啓動後,探測開始之前的時間(單位爲:s)
periodSeconds 探測頻率,默認值爲:10s. 最小值爲 1s
timeoutSeconds 探測請求發出後,等待響應的時間(單位爲:s),超時會觸發重啓容器。默認值爲:1s ,最小值爲:1s
successThreshold 探測失敗後,再次判斷容器健康的探測次數。默認值爲:1 ,最小值爲:1。
failureThreshold 容器啓動後,探測失敗,kubernetes 在重啓容器前,嘗試再次判斷容器是否健康的次數,即失敗重試。如果設置在 readiness 中,則 Service 對應的 EndPoint 列表中將不會存在 此 Pod 對應的 End Point。默認值爲:3 ,最小值爲 1。

不同類型探針的相關配置

ExecAction

只存在 command ,即只能以執行自定義命令的方式進行探測。

TCPSocketAction

只需要設置需要建立 TCP 連接的 port。

HTTPGetAction
configure http probe description
host 主機名,默認爲Pod IP
scheme 請求方式 (HTTP 或者 HTTPS ), 默認值爲: HTTP
path 訪問路徑
httpHeaders 請求頭
port 訪問容器的端口號,範圍 :[1,65535)

Pod readiness gate

除了上述的兩種方式,在 kubernetes 1.14 中 readiness gate 發佈了 stable 版本。這個屬性在 1.11 時加入,當時命令爲 Pod ready++

例子:

Kind: Pod
...
spec:
  readinessGates:
    - conditionType: "www.example.com/feature-1"
status:
  conditions:
    - type: Ready  # this is a builtin PodCondition
      status: "False"
      lastProbeTime: null
      lastTransitionTime: 2018-01-01T00:00:00Z
    - type: "www.example.com/feature-1"   # an extra PodCondition
      status: "False"
      lastProbeTime: null
      lastTransitionTime: 2018-01-01T00:00:00Z
  containerStatuses:
    - containerID: docker://abcd...
      ready: true
...

根據官網的文檔,我們可以在 spec 定義期望 readinessGates 來檢測 Pod 是否健康,需要在 status.conditions 設置 type: "www.example.com/feature-1" 自定義一個 condition ,如果不設置,默認爲 false , 並且這個condition 的 status 可以被外部修改,也就是說我們可以外部設置這個 Pod 是否能夠被 Service 調度到。

設置了 readinessGates 之後判斷一個 Pod 是否健康的條件
  • Pod 中所有的容器都爲 ready 狀態
  • 設置的所有的 ReadinessGates 狀態都爲 true

只有滿足以上兩個條件,這個 Pod 參可能被認爲可暴露的,也就是說 Service 對應的 EndPoint 列表中才會包含這個 Pod 對應的 EndPoint。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章