Kubernetes Pod健康檢查機制


一、Pod的整個生命階段

  • Pending:正在創建的Pod,但是Pod中的容器還沒有完全被創建完成,這其中包含集群為容器創建網絡,或者下載鏡像的過程

  • Running:Pod內所有的容器都已經被創建,且至少一個容器正在處於運行狀態、正在啟動狀態或者重啟狀態

  • Successed:Pod中所有容器都執行成功后退出,並且沒有處於重啟的容器

  • Faild:Pod中所有容器都已退出,但是至少還有一個容器退出時為失敗狀態

  • Unknow:由於一些原因,Pod的狀態無法獲取,通常是與Pod通信時錯誤導致的

 

二、Pod重啟策略

  • Always:只要容器失效退出就重啟容器

  • onFailure:當容器以非正常退出后重新啟動容器

  • Never:無論容器狀態如何,都不重新啟動容器

 

三、Pod的活性與就緒探針

1、Pod探針機制

在Kubernetes中Pod是最小的計算單元,而一個Pod又由多個容器組成,相當於每個容器就是一個應用,應用在運行期間,可能因為某也意外情況致使程序掛掉。那么如何監控這些容器狀態穩定性,保證服務在運行期間不會發生問題,發生問題后進行重啟等機制,就成為了重中之重的事情,考慮到這點 kubernetes 推出了活性探針機制。

有了活性探針后能保證程序在運行中如果掛掉能夠自動重啟,但是還有個經常遇到的問題,比如說,在 Kubernetes 中啟動 Pod,顯示明明 Pod 已經啟動成功,且能訪問里面的端口,但是卻返回錯誤信息。還有就是在執行滾動更新時候,總會出現一段時間,Pod 對外提供網絡訪問,但是訪問卻發生 404,這兩個原因,都是因為 Pod 已經成功啟動,但是 Pod 的的容器中應用程序還在啟動中導致,考慮到這點 Kubernetes 推出了就緒探針機制。

 

2、Pod兩種探針

  • LivenessProbe(存活探針):存活探針的主要作用是,用指定的方式進入容器檢測容器中的應用是否正常運行,如果檢測失敗,則認為容器不健康,那么 kubelet 將根據 Pod 中設置的 restartPolicy 策略來判斷,Pod是否要進行重啟,如果容器配置中沒有配置 livenessProbe 存活探針, kubelet 將認為存活探針一直為成功狀態

  • ReadinessProbe(就緒探針):用於判斷容器中應用是否完成,當探測成功后才使Pod對外提供網絡訪問,設置容器 Ready 狀態為 true ,如果探測失敗,則設置容器的 Ready 狀態為 false 。對於被Service管理的Pod,ServicePodEndPoind 的關聯關系也將基於Pod是否為 Ready 狀態進行設置,如果Pod運行過程中 Ready 狀態變為 false,則系統自動從 Service 關聯的 EndPoint 列表中移除,如果Pod恢復為 Ready 狀態,將再被加回 EndPoint 列表,通過這種機制就能防止將流量轉發到不可用的Pod上。

 

3、Pod探針的探測方式與結果

目前LivenessProbe和ReadinessProbe兩種探針都支持下面三種探測方法:

  • ExecAction:在容器中執行指定的命令,如果能成功執行,則探測成功

  • HTTPGetAction:通過容器的IP地址、端口號及路徑調用HTTP Get方法,如果響應的狀態碼200-400,則認為容器探測成功

  • TCPSocketAction:通過容器IP地址和端口號執行TCP檢查,如果能建立TCP連接,則探測成功

     

    探針探測結果有以下值:

  • Success:表示通過檢測

  • Failure:表示未通過檢測

  • Unknow:表示檢測沒有正常進行

4、Pod探針的相關屬性

兩種探針有許多字段可選,可以用來更加精確的控制LivenessProbe和ReadinessProbe兩種探針的探測:

  • initialDelaySeconds:Pod啟動后首次進行檢查的等待時間,單位“秒”

  • periodSeconds:檢查的間隔時間,默認為10s,單位“秒”

  • timeoutSeconds:探針執行檢測請求后,等待響應的超時時間,默認為1s,單位“秒”

  • successThreshold:探針檢測失敗后認為成功的最小連接成功次數,默認為1s,在liveness探針中必須為1s,最小為1s

  • failureThreshold:探測失敗的重試次數,重試一定次數后將認為失敗,在readiness探針中,Pod會被標記為未就緒,默認3s,最小值1s

5、兩種探針的區別

總的來說 ReadinessProbe 和 LivenessProbe 是使用相同探測的方式,只是探測后對 Pod 的處置方式不同:

  • ReadinessProbe:但檢測失敗后,將Pod的IP:Port從對應Service關聯的EndPoint地址列表中刪除

  • LivenessProbe:當檢測失敗后將容器殺死,並根據Pod的重啟策略來決定對應措施

 

四、探針使用示例

1、LivenessProbe探針使用示例

(1)通過Exec方式做健康檢測

apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - echo ok >  /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 1000
    livenessProbe:
      initialDelaySeconds: 15
      periodSeconds: 3
      exec:
        command:
        - cat
        - /tmp/healthy

 

通過執行 cat /tmp/healthy 來判斷一個容器是否正常運行。再創建 /tmp/healthy文件10s后將其刪除,而LivenessProbe健康檢測的初始時間(initialDelaySeconds)為15s,探測結果為fail,將導致kubelet殺掉容器並重啟它

 

(2)通過HTTPGetAction方式做健康探測

apiVersion: v1
kind: Pod
metadata:
  name: liveness-http
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: mydlqclub/springboot-helloworld:0.0.1
    livenessProbe:
      initialDelaySeconds: 20
      periodSeconds: 5
      timeoutSeconds: 10
      httpGet:
        scheme: HTTP
        port: 8081
        path: /actuator/health

 

探測結果的HTTP 狀態碼如果為200 - 400,則表示探測成功。如果探測失敗,則會殺死Pod進行重啟操作

httpGet探測方法有如下可選的控制字段

  • scheme:用於測試連接的協議,默認為HTTP

  • host:要連接的主機名,默認為Pod IP

  • port:容器上要訪問端口號或名稱

  • path:HTTP 服務器上的訪問URL

  • httpHeaders:自定義http請求Headers,http允許重復Headers

 

(3)通過TCP方式做健康探測

apiVersion: v1
kind: Pod
metadata:
  name: liveness-tcp
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: nginx:1.19.0
    ports:
    - containerPort: 80
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 20
      periodSeconds: 10
      timeoutSeconds: 1

 

TCP 檢查方式和 HTTP 檢查方式非常相似,在容器啟動 initialDelaySeconds 參數設定的時間后,kubelet 將發送第一個 livenessProbe 探針,嘗試連接容器的 80 端口,如果連接失敗則將殺死 Pod 重啟容器。

 

2、ReadinessProbe探針使用示例

Pod 的 ReadinessProbe 探針使用方式和 LivenessProbe 探針探測方法一樣,也是支持三種,只是一個是用於探測應用的存活,一個是判斷是否對外提供流量的條件。

apiVersion: v1
kind: Service
metadata:
  name: springboot
  labels:
    app: springboot
spec:
  type: NodePort
  ports:
  - name: server
    port: 8080
    targetPort: 8080
    nodePort: 31180
  - name: managerment
    port: 8081
    targetPort: 8081
    nodePort: 31181
  selector:
    app: springboot
​
---
apiVersion: v1
kind: Pod
metadata:
  name: springboot
  labels:
    app: springboot
spec:
  containers:
  - name: springboot
    image: mydlqclub/springboot-helloworld:0.0.1
    ports:
    - name: server
      containerPort: 8080
    - name: managerment
      containerPort: 8081
    readinessProbe:
      httpGet:
        scheme: HTTP
        port: 8081
        path: /actuator/health
      initialDelaySeconds: 20
      periodSeconds: 10
      timeoutSeconds: 10

 

3、ReadinessProbe+LivenessProbe配合使用示例

apiVersion: v1
kind: Service
metadata:
  name: rlprobe
  labels:
    app: rlprobe
spec:
  type: NodePort
  ports:
  - name: server
    port: 8080
    targetPort: 8080
    nodePort: 32280
  - name: managerment
    port: 8081
    targetPort: 8081
    nodePort: 32281
  selector:
    app: rlprobe
​
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rlprobe
  labels:
    app: rlprobe
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rlprobe
  template:
    metadata:
      name: rlprobe
      labels:
        app: rlprobe
    spec:
      containers:
      - name: rl
        image: mydlqclub/springboot-helloworld:0.0.1
        ports:
        - name: server
          containerPort: 8080
        - name: managerment
          containerPort: 8081
​
        readinessProbe:
          httpGet:
            scheme: HTTP
            port: 8081
            path: /actuator/health
          initialDelaySeconds: 20
          periodSeconds: 5
          timeoutSeconds: 10
        livenessProbe:
          httpGet:
            scheme: HTTP
            port: 8081
            path: /actuator/health
          initialDelaySeconds: 20
          periodSeconds: 5
          timeoutSeconds: 10

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM