1. 程式人生 > 其它 >k8s初級實戰07--配置 存活&就緒&啟動探針

k8s初級實戰07--配置 存活&就緒&啟動探針

技術標籤:K8S & Dockerk8s 探針livenessProbestartupProbereadinessProbe

k8s初級實戰07--k8s初級實戰07--配置 存活&就緒&啟動探針

1 基礎概念

Probe(探針) 是由 kubelet 對容器執行的定期診斷。 要執行診斷,kubelet 呼叫由容器實現的 Handler (處理程式)。有三種類型的處理程式:

  1. ExecAction: 在容器內執行指定命令。如果命令退出時返回碼為 0 則認為診斷成功。
  2. TCPSocketAction: 對容器的 IP 地址上的指定埠執行 TCP 檢查。如果埠開啟,則診斷被認為是成功的。
  3. HTTPGetAction: 對容器的 IP 地址上指定埠和路徑執行 HTTP Get 請求。如果響應的狀態碼大於等於 200 且小於 400,則診斷被認為是成功的。

針對執行中的容器,kubelet 可以選擇是否執行以下三種探針,以及如何針對探測結果作出反應。

  1. kubelet 使用存活探測器來知道什麼時候要重啟容器。 例如,存活探測器可以捕捉到死鎖(應用程式在執行,但是無法繼續執行後面的步驟)。 這樣的情況下重啟容器有助於讓應用程式在有問題的情況下更可用。
  2. kubelet 使用就緒探測器可以知道容器什麼時候準備好了並可以開始接受請求流量, 當一個 Pod 內的所有容器都準備好了,才能把這個 Pod 看作就緒了。 這種訊號的一個用途就是控制哪個 Pod 作為 Service 的後端。 在 Pod 還沒有準備好的時候,會從 Service 的負載均衡器中被剔除的。
  3. kubelet 使用啟動探測器可以知道應用程式容器什麼時候啟動了。 如果配置了這類探測器,就可以控制容器在啟動成功後再進行存活性和就緒檢查, 確保這些存活、就緒探測器不會影響應用程式的啟動。 這可以用於對慢啟動容器進行存活性檢測,避免它們在啟動執行之前就被殺掉。

2 常用方法

  1. 定義存活命令(ExecAction)

    vim exec-liveness.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image
    : busybox:1.31 args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5 $ kubectl -n test-online apply -f exec-liveness.yaml pod/liveness-exec created

    建立後,通過lens前端發現基本上每隔一分鐘都會因為探針失敗而重啟一次。 在這裡插入圖片描述

  2. 定義一個存活態 HTTP 請求介面

    vim  http-liveness.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-http
    spec:
      containers:
      - name: liveness
        image: k8s.gcr.io/liveness
        args:
        - /server
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            httpHeaders:
            - name: Custom-Header
              value: Awesome
          initialDelaySeconds: 3
          periodSeconds: 3
    
    該案例中healthz邏輯為:前10s返回200,隨後返回500
    http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
        duration := time.Now().Sub(started)
        if duration.Seconds() > 10 {
            w.WriteHeader(500)
            w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
        } else {
            w.WriteHeader(200)
            w.Write([]byte("ok"))
        }
    })
    
    $ kubectl -n test-online apply -f http-liveness.yaml 
    pod/liveness-http created
    

    httpGet 探針中,任何大於或等於 200 並且小於 400 的返回程式碼標示成功,其它返回程式碼都標示失敗。
    大於 10s 的時候,curl直接返回error:

    $ curl 10.244.2.99:8080/healthz
    error: 11.181814335
    
  3. 定義 TCP 的存活探測

    vim tcp-liveness.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: tcp-liveness
      labels:
        app: tcp-liveness
    spec:
      containers:
      - name: tcp-liveness
        image: k8s.gcr.io/goproxy:0.1
        ports:
        - containerPort: 8080
        readinessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20
    
    $ kubectl -n test-online apply -f tcp-liveness.yaml 
    pod/tcp-liveness created
    

    tcpSocket 型別的存活探測是使用 TCP 套接字,通過配置,kubelet 會嘗試在指定埠和容器建立套接字連結。 如果能建立連線,這個容器就被看作是健康的,如果不能則這個容器就被看作是有問題的。
    容器啟動5s後開始就緒檢測,檢測成功後標記為繼續狀態;
    容器啟動15s後開始存活檢測,檢測失敗就會重啟容器。

  4. 使用啟動探測器保護慢啟動容器
    實際中,為了防止存活探針誤殺正在啟動的容器,一般可以給容器配置一個啟動探針,啟動探針檢測成功後才能繼續執行存活檢測。

    ports:
    - name: liveness-port
      containerPort: 8080
      hostPort: 8080
    
    livenessProbe:
      httpGet:
        path: /healthz
        port: liveness-port
      failureThreshold: 1
      periodSeconds: 10
    
    startupProbe:
      httpGet:
        path: /healthz
        port: liveness-port
      failureThreshold: 30
      periodSeconds: 10
    

    以上啟動探針會每10s檢測一次容器liveness-port,最多檢測30次,若某次檢測成功,則允許存活探針接管檢測;若30次都沒有檢測成功,則重啟容器。

3 注意事項

  1. 就緒探測器在容器的整個生命週期中保持執行狀態。

4 說明

概念->工作負載->Pods->Pod 的生命週期->容器狀態
任務->配置 Pods 和容器->配置存活、就緒和啟動探測器