1. 程式人生 > 其它 >容器探針-健康檢查

容器探針-健康檢查

目錄

官網

https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes

容器探針

探頭是通過週期性地執行的診斷 kubelet 上的容器。為了執行診斷,kubelet 呼叫容器實現的 Handler。有三種類型的處理程式:

  • ExecAction:在容器內執行指定的命令。如果命令退出時狀態程式碼為 0,則認為診斷成功。
  • TCPSocketAction:對指定埠上 Pod 的 IP 地址執行 TCP 檢查。如果埠開啟,則認為診斷成功。
  • HTTPGetActionGET在指定的埠和路徑上針對 Pod 的 IP 地址執行 HTTP請求。如果響應具有大於或等於 200 且小於 400 的狀態程式碼,則認為診斷成功。

每個探針具有以下三個結果之一:

  • Success:容器通過了診斷。
  • Failure:容器未通過診斷。
  • Unknown:診斷失敗,因此不應採取任何措施。

kubelet 可以選擇對正在執行的容器執行三種探測並做出反應:

  • livenessProbe:表示容器是否正在執行。如果活性探測失敗,kubelet 會殺死容器,並且容器會受到其
    重啟策略
    的約束。如果 Container 不提供活性探測,則預設狀態為Success
  • readinessProbe:表示容器是否準備好響應請求。如果就緒探測失敗,端點控制器會從與 Pod 匹配的所有服務的端點中刪除 Pod 的 IP 地址。初始延遲之前的預設就緒狀態是Failure。如果 Container 不提供就緒探測,則預設狀態為Success
  • startupProbe:表示容器內的應用程式是否啟動。如果提供了啟動探測器,則所有其他探測器都將被禁用,直到它成功。如果啟動探測失敗,kubelet 會殺死容器,並且容器會受到其重啟策略的約束。如果 Container 不提供啟動探測器,則預設狀態為Success

有關如何設定活動、就緒或啟動探測器的更多資訊,請參閱配置活動、就緒和啟動探測器

什麼時候應該使用活性探針?

功能狀態: Kubernetes v1.0 [stable]

如果您的容器中的程序在遇到問題或變得不健康時能夠自行崩潰,則您不一定需要活性探測;kubelet 會根據 Pod 的restartPolicy.

如果您希望容器在探測失敗時被restartPolicy終止並重新啟動,則指定一個活躍度探測,並指定Always 或 OnFailure。

什麼時候應該使用就緒探針?

功能狀態: Kubernetes v1.0 [stable]

如果您想僅在探測成功時才開始向 Pod 傳送流量,請指定就緒探測。在這種情況下,就緒探針可能與活性探針相同,但是規範中存在就緒探針意味著 Pod 將在不接收任何流量的情況下啟動,並且只有在探針開始成功後才開始接收流量。

如果您希望您的容器能夠自行關閉以進行維護,您可以指定一個準備就緒探測器,用於檢查與活躍度探測器不同的特定於準備狀態的端點。

如果您的應用嚴格依賴後端服務,您可以同時實現活躍度和就緒度探測。當應用程式本身健康時,活性探測通過,但就緒探測會額外檢查每個所需的後端服務是否可用。這有助於您避免將流量定向到只能以錯誤訊息響應的 Pod。

如果您的容器需要在啟動期間載入大資料、配置檔案或遷移,您可以使用 啟動探測器。但是,如果您想檢測失敗的應用程式和仍在處理其啟動資料的應用程式之間的差異,您可能更喜歡就緒探測。

注意:如果你想在 Pod 被刪除的時候能夠 Drain 請求,你不一定需要準備就緒探針;刪除時,無論是否存在就緒探針,Pod 都會自動將自身置於未就緒狀態。在等待 Pod 中的容器停止時,Pod 保持未就緒狀態。

什麼時候應該使用啟動探針?

功能狀態: Kubernetes v1.20 [stable]

啟動探針對於具有需要很長時間才能投入使用的容器的 Pod 很有用。您可以配置單獨的配置來在容器啟動時對其進行探測,而不是設定較長的活躍時間間隔,從而允許比活躍時間間隔更長的時間。

如果您的容器通常在 多個 開始 initialDelaySeconds + failureThreshold × periodSeconds,您應該指定一個啟動探針來檢查與 liveness 探針相同的端點。預設為 periodSeconds10 秒。然後,您應該將其設定failureThreshold得足夠高以允許容器啟動,而無需更改活性探測器的預設值。這有助於防止死鎖。

健康檢查方式

存活性探測

就緒性健康檢查:檢查容器是否能夠對外提供服務
存活性健康檢查:檢查容器是否正常執行

兩者維度不一樣
兩者處理方式不一樣:
	存活性檢查失敗:把容器刪掉
	就緒性檢查失敗:移除叢集(移除負載均衡)

用於判斷容器是否存活,即Pod是否為running狀態,如果LivenessProbe探針探測到容器不健康,則kubelet將kill掉容器,並根據容器的重啟策略判斷按照那種方式重啟,如果一個容器不包含LivenessProbe探針,則Kubelet認為容器的LivenessProbe探針的返回值永遠成功。存活性探測支援的方法有三種:ExecAction,TCPSocketAction,HTTPGetAction。

1.Exec

apiVersion: v1
kind: Pod
metadata:
  name: probe-exec
  namespace: defualt
spec:
  containers:
    - name: nginx
      image: nginx
      livenessProbe:
        exec:
          command:
            - cat
            - /tmp/health    
        initialDelaySeconds: 5
        timeoutSeconds: 1

2.TCPSocket

# TcpSocket 相當於 ping

apiVersion: v1
kind: Pod
metadata:
  name: probe-tcp
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx
    livenessProbe:
      initialDelaySeconds: 5
      timeoutSeconds: 1
      tcpSocket:
        port: 80

3.HTTPGet

apiVersion: v1
kind: Pod
metadata:
  name: probe-http
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx
    livenessProbe:
      httpGet:
				path: /index
        port: 80
        scheme: HTTP   
      initialDelaySeconds: 5
      timeoutSeconds: 1

4.引數詳解

# 檢查失敗最少測試,預設:3

kubectl explain deployment.spec.template.spec.containers.livenessProbe

delay=10s 	: 探測延時時間initialDelaySeconds
timeout=1s  :探測的超時時間
period=10s  :探測的頻率
success=1   :成功多少次才算成功
failure=1   :失敗多少次才算失敗

引數詳解:
failureThreshold:最少連續幾次探測失敗的次數,滿足該次數則認為fail
initialDelaySeconds:容器啟動之後開始進行存活性探測的秒數。不填立即進行
periodSeconds:執行探測的頻率(秒)。預設為10秒。最小值為1。
successThreshold:探測失敗後,最少連續探測成功多少次才被認定為成功,滿足該次數則認為success。(但是如果是liveness則必須是 1。最小值是 1。)
timeoutSeconds:每次執行探測的超時時間,預設1秒,最小1秒。

就緒性探測

就緒性健康檢查:檢查容器是否能夠對外提供服務
存活性健康檢查:檢查容器是否正常執行

用於判斷容器是否正常提供服務,即容器的Ready是否為True,是否可以接收請求,如果ReadinessProbe探測失敗,則容器的Ready將設定為False,控制器將此Pod的Endpoint從對應的service的Endpoint列表中移除,從此不再將任何請求排程此Pod上,直到下次探測成功。(剔除此pod,不參與接收請求不會將流量轉發給此Pod)

1.HTTPGet

通過訪問某個URL的方式探測當前POD是否可以正常對外提供服務

# 就緒性探測的特點是探測失敗,立即移出負載均衡(endprints ---> NotReadyAddresses)
kind: Pod
apiVersion: v1
metadata:
  name: readinessprobe-nginx
  namespace: default
  labels:
    provider: aliyun
    business: pms
    environmental: dev
spec:
  containers:
    - name: readinessprobe-nginx
      image: nginx
      imagePullPolicy: Always
      ports:
        - containerPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
      readinessProbe:
        httpGet:
          port: 80
          path: /demo.html

2.Exec

通過執行一條命令,探測服務是否可以正常對外提供服務。

kind: Pod
apiVersion: v1
metadata:
  name: exec-pod
spec:
  containers:
    - name: nginx
      imagePullPolicy: IfNotPresent
      image: nginx
      readinessProbe:
        exec:
          command:
            - cat
            - /usr/share/nginx/html/index.html

3.TCPSocket

通過ping某個埠的方式,探測服務是否可以正常對外提供服務。

kind: Pod
apiVersion: v1
metadata:
  name: exec-pod
spec:
  containers:
    - name: nginx
      imagePullPolicy: IfNotPresent
      image: nginx
      readinessProbe:
        tcpSocket:
          port: 80

總結

pod中所有容器的status=Running時,Pod的狀 態才會是Running狀態。

當存活性檢查檢測失敗的時候,kebulet會刪除容器,重新啟動一個新的容器。繼續檢查。
存活性探測:探測失敗,立即刪除容器
就緒性探測:探測失敗,立即移除負載均衡
選擇了IT,必定終身學習