kubernetes的三種探針startupprobe,ReadinessProbe,LivenessProbe記錄


kubernetes的三種探針

startupprobe: k8s1.16版本后新加的探測方式,用於判斷容器內應用程序是否已經啟動,如果配置了startuprobe,就會先禁用其他的探測,直到它成功為止,成功后將不再進行探測。


ReadinessProbe: 一般用於探測容器內的程序是否健康,它的返回值如果為success,那么就代表這個容器已經完成啟動,並且程序已經是可以接受流量的狀態.


LivenessProbe:用於探測容器是否運行,如果探測失敗,kubelet會根據配置的重啟策略進行相應的處理,如果沒有配置該探針,默認就是success!

pod探針的檢測方式

startupProbe   啟動檢查
livenessProbe  存活檢查
readinessProbe 就緒檢查


# startupProbe  啟動檢查
----------------------------------
startupProbe:                     #健康檢查方式:[readinessProbe,livenessProbe,StartupProbe]
  failureThreshold: 3             #檢測失敗3次表示未就緒
  httpGet:                        #請求方式
    path: /ready                  #請求路徑
    port: 8182                    #請求端口
    scheme: HTTP                  #請求協議
  periodSeconds: 10               #檢測間隔
  successThreshold: 1             #檢查成功為2次表示就緒
  timeoutSeconds: 1               #檢測失敗1次表示未就緒
----------------------------------


# livenessProbe 存活檢查

#案例1:
----------------------------------
livenessProbe:                  #健康檢查方式:[readinessProbe,livenessProbe,StartupProbe]
  failureThreshold: 5           #檢測失敗5次表示未就緒
  httpGet:                      #請求方式
    path: /health               #請求路徑
    port: 8080                  #請求端口
    scheme: HTTP                #請求協議
  initialDelaySeconds: 60       #初始化時間
  periodSeconds: 10             #檢測間隔
  successThreshold: 1           #檢查成功為2次表示就緒
  timeoutSeconds: 5             #檢測失敗1次表示未就緒
  
  
livenessProbe:                  #健康檢查方式:[readinessProbe,livenessProbe,StartupProbe]
  failureThreshold: 5           #檢測失敗5次表示未就緒
  httpGet:                      #請求方式
    path: /health               #請求路徑
    port: 8080                  #請求端口
  initialDelaySeconds: 60       #初始化時間
  periodSeconds: 10             #檢測間隔
  successThreshold: 1           #檢查成功為2次表示就緒
  timeoutSeconds: 5             #檢測失敗1次表示未就緒
  
----------------------------------

案例2:
----------------------------------
livenessProbe:
httpGet:
  path: /healthz
  port: liveness-port
failureThreshold: 1                
periodSeconds: 60                  
terminationGracePeriodSeconds: 60  #寬限時間,不能用於設置就緒態探針,它將被 API 服務器拒絕。
----------------------------------



# readinessProbe  就緒檢查
----------------------------------
案例1[get方式]:
readinessProbe:                   #健康檢查方式:[readinessProbe,livenessProbe,StartupProbe]
  failureThreshold: 3             #檢測失敗3次表示未就緒
  httpGet:                        #請求方式
    path: /ready                  #請求路徑
    port: 8181                    #請求端口
    scheme: HTTP                  #請求協議
  periodSeconds: 10               #檢測間隔
  successThreshold: 1             #檢查成功為2次表示就緒
  timeoutSeconds: 1               #檢測失敗1次表示未就緒
  
案例2 [檢查文件內容]:
readinessProbe:                #檢查方式
  exec:                        #使用命令檢查
    command:                   #指令
    - cat                      #指令
    - /etc/hosts               #指令
  initialDelaySeconds: 5       #容器啟動后要等待多少秒后存活和就緒探測器才被初始化,默認是 0 秒,最小值是 0。
  timeoutSeconds: 2            #檢測失敗1次表示未就緒
  successThreshold: 3          #檢查成功為2次表示就緒
  failureThreshold: 2          #檢測失敗重試次數
  periodSeconds: 5             #檢測間隔
----------------------------------

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


#注意:
配置了 startupProbe 之后,livenessProbe和readinessProbe參數將會被暫時禁用,直到程序被檢測到啟動完成了livenessProbe,readinessProbe才會被啟用
在程序啟動較慢的時候可以配置startupProbe參數。

啟動案例

StartupProbe案例[檢測容器內進程是否完成啟動]

參考文檔: https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

apiVersion: v1 # 必選,API的版本號
kind: Pod       # 必選,類型Pod
metadata:       # 必選,元數據
  name: nginx01   # 必選,符合RFC 1035規范的Pod名稱
  labels:       # 可選,標簽選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend # 可以寫多個
  annotations:  # 可選,注釋列表,可以寫多個
    app: nginx
spec:   # 必選,用於定義容器的詳細信息
  containers:   # 必選,容器列表
  - name: nginx01 # 必選,符合RFC 1035規范的容器名稱
    image: nginx:latest    # 必選,容器所用的鏡像的地址
    imagePullPolicy: Always     # 可選,鏡像拉取策略
    command: # 可選,容器啟動執行的命令
    - nginx
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
    ports:  # 可選,容器需要暴露的端口號列表
    - name: http    # 端口名稱
      containerPort: 80     # 端口號
      protocol: TCP # 端口協議,默認TCP
    env:    # 可選,環境變量配置列表
    - name: TZ      # 變量名
      value: Asia/Shanghai # 變量的值
    - name: LANG
      value: en_US.utf8
    startupProbe: # 可選,檢測容器內進程是否完成啟動。注意三種檢查方式同時只能使用一種。
      httpGet:      # httpGet檢測方式,生產環境建議使用httpGet實現接口級健康檢查,健康檢查由應用程序提供。
            path: /api/successStart # 檢查路徑
            port: 80
  restartPolicy: Always   # 可選,默認為Always
root@k8s-master01[23:26:10]:~$ kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-startupprobe   0/1     Running   1          79s

創建后會無法啟動,原因是無法檢測到這個地址,通過日志可以看到:
2021/06/25 23:26:02 [error] 7#7: *3 open() "/usr/share/nginx/html/api/successStart" failed (2: No such file or directory), client: 192.168.3.84, server: localhost, request: "GET /api/successStart HTTP/1.1", host: "172.17.125.25:80"

ReadinessProbe案例 [可以提供服務的狀態]

參考文檔: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

apiVersion: v1 # 必選,API的版本號
kind: Pod       # 必選,類型Pod
metadata:       # 必選,元數據
  name: nginx-read   # 必選,符合RFC 1035規范的Pod名稱
  labels:       # 可選,標簽選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend # 可以寫多個
  annotations:  # 可選,注釋列表,可以寫多個
    app: nginx
spec:   # 必選,用於定義容器的詳細信息
  containers:   # 必選,容器列表
  - name: nginx-read # 必選,符合RFC 1035規范的容器名稱
    image: nginx:latest    # 必選,容器所用的鏡像的地址
    imagePullPolicy: Always     # 可選,鏡像拉取策略
    command: # 可選,容器啟動執行的命令
    - nginx
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
    ports:  # 可選,容器需要暴露的端口號列表
    - name: http    # 端口名稱
      containerPort: 80     # 端口號
      protocol: TCP # 端口協議,默認TCP
    env:    # 可選,環境變量配置列表
    - name: TZ      # 變量名
      value: Asia/Shanghai # 變量的值
    - name: LANG
      value: en_US.utf8
    readinessProbe:
      httpGet:
             path: /
             port: 80
  restartPolicy: Always   # 可選,默認為Always
kubectl apply -f  readinessProbe-pod.yaml 

LivenessProbe檢測容器中的應用是否正常運行

參考文檔:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

apiVersion: v1 # 必選,API的版本號
kind: Pod       # 必選,類型Pod
metadata:       # 必選,元數據
  name: nginx-live   # 必選,符合RFC 1035規范的Pod名稱
  labels:       # 可選,標簽選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend # 可以寫多個
  annotations:  # 可選,注釋列表,可以寫多個
    app: nginx
spec:   # 必選,用於定義容器的詳細信息
  containers:   # 必選,容器列表
  - name: nginx-live # 必選,符合RFC 1035規范的容器名稱
    image: nginx:latest    # 必選,容器所用的鏡像的地址
    imagePullPolicy: Always     # 可選,鏡像拉取策略
    command: # 可選,容器啟動執行的命令
    - nginx
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
    ports:  # 可選,容器需要暴露的端口號列表
    - name: http    # 端口名稱
      containerPort: 80     # 端口號
      protocol: TCP # 端口協議,默認TCP
    env:    # 可選,環境變量配置列表
    - name: TZ      # 變量名
      value: Asia/Shanghai # 變量的值
    - name: LANG
      value: en_US.utf8
    livenessProbe:
      httpGet:
        path: /
        port: 80
kubectl apply -f  livenessProbe.yaml

#檢查 nginx-live pod是否正常
root@k8s-master01[23:41:31]:~$ kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
nginx-live           1/1     Running   0          35s
nginx-read           1/1     Running   0          10m
nginx-startupprobe   0/1     Running   9          16m

混合配置

readinessProbe+livenessProbe案例

apiVersion: v1 # 必選,API的版本號
kind: Pod       # 必選,類型Pod
metadata:       # 必選,元數據
  name: nginx-read   # 必選,符合RFC 1035規范的Pod名稱
  labels:       # 可選,標簽選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend # 可以寫多個
  annotations:  # 可選,注釋列表,可以寫多個
    app: nginx
spec:   # 必選,用於定義容器的詳細信息
  containers:   # 必選,容器列表
  - name: nginx-read # 必選,符合RFC 1035規范的容器名稱
    image: nginx:latest    # 必選,容器所用的鏡像的地址
    imagePullPolicy: Always     # 可選,鏡像拉取策略
    command: # 可選,容器啟動執行的命令
    - nginx
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
    ports:  # 可選,容器需要暴露的端口號列表
    - name: http    # 端口名稱
      containerPort: 80     # 端口號
      protocol: TCP # 端口協議,默認TCP
    env:    # 可選,環境變量配置列表
    - name: TZ      # 變量名
      value: Asia/Shanghai # 變量的值
    - name: LANG
      value: en_US.utf8
    readinessProbe:
      exec:
        command:
        - cat
        - /etc/hosts
      initialDelaySeconds: 5
      timeoutSeconds: 2
      successThreshold: 3
      failureThreshold: 2
      periodSeconds: 5

    livenessProbe:                  #健康檢查方式:[readinessProbe,livenessProbe,StartupProbe]
      failureThreshold: 5           #檢測失敗5次表示未就緒
      httpGet:                      #請求方式
        path: /health               #請求路徑
        port: 8080                  #請求端口
        scheme: HTTP                ##請求協議
      initialDelaySeconds: 60       #初始化時間
      periodSeconds: 10             #檢測間隔
      successThreshold: 1           #檢查成功為2次表示就緒
      timeoutSeconds: 5             #檢測失敗1次表示未就緒

startupprobe+readinessProbe+ 混合案例

apiVersion: v1                # 必選,API的版本號
kind: Pod                     # 必選,類型Pod
metadata:                     # 必選,元數據
  name: read-startup          # 必選,符合RFC 1035規范的Pod名稱
  labels:                     # 可選,標簽選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend             # 可以寫多個
  annotations:                 # 可選,注釋列表,可以寫多個
    app: nginx
spec:                           # 必選,用於定義容器的詳細信息
  containers:                   # 必選,容器列表
  - name: read-startup          # 必選,符合RFC 1035規范的容器名稱
    image: nginx:latest         # 必選,容器所用的鏡像的地址
    imagePullPolicy: Always     # 可選,鏡像拉取策略
    command: # 可選,容器啟動執行的命令
    - nginx
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
    ports:                     # 可選,容器需要暴露的端口號列表
    - name: http               # 端口名稱
      containerPort: 80        # 端口號
      protocol: TCP            # 端口協議,默認TCP
    env:                       # 可選,環境變量配置列表
    - name: TZ                 # 變量名
      value: Asia/Shanghai     # 變量的值
    - name: LANG
      value: en_US.utf8
    readinessProbe:
      exec:
        command:
        - cat
        - /etc/hosts
      initialDelaySeconds: 5
      timeoutSeconds: 2
      successThreshold: 3
      failureThreshold: 2
      periodSeconds: 5

    startupProbe:
      httpGet:
        path: /
        port: 80
      failureThreshold: 30
      periodSeconds: 10

startupprobe+readinessProbe+ livenessProbe混合案例

apiVersion: v1                # 必選,API的版本號
kind: Pod                     # 必選,類型Pod
metadata:                     # 必選,元數據
  name: read-startup          # 必選,符合RFC 1035規范的Pod名稱
  labels:                     # 可選,標簽選擇器,一般用於過濾和區分Pod
    app: nginx
    role: frontend             # 可以寫多個
  annotations:                 # 可選,注釋列表,可以寫多個
    app: nginx
spec:                           # 必選,用於定義容器的詳細信息
  containers:                   # 必選,容器列表
  - name: read-startup          # 必選,符合RFC 1035規范的容器名稱
    image: nginx:latest         # 必選,容器所用的鏡像的地址
    imagePullPolicy: Always     # 可選,鏡像拉取策略
    command: # 可選,容器啟動執行的命令
    - nginx
    - -g
    - "daemon off;"
    workingDir: /usr/share/nginx/html       # 可選,容器的工作目錄
    ports:                     # 可選,容器需要暴露的端口號列表
    - name: http               # 端口名稱
      containerPort: 80        # 端口號
      protocol: TCP            # 端口協議,默認TCP
    env:                       # 可選,環境變量配置列表
    - name: TZ                 # 變量名
      value: Asia/Shanghai     # 變量的值
    - name: LANG
      value: en_US.utf8
    readinessProbe:
      exec:
        command:
        - cat
        - /etc/hosts
      initialDelaySeconds: 5
      timeoutSeconds: 2
      successThreshold: 3
      failureThreshold: 2
      periodSeconds: 5

    startupProbe:
      httpGet:
        path: /
        port: 80
      failureThreshold: 30
      periodSeconds: 10
      
    livenessProbe:
      httpGet:
        path: /healthz
        port: 80
      failureThreshold: 1
      periodSeconds: 10  

檢測時間計算

准確的時間計算:每次檢查的間隔是10秒,最長超時時間是5秒,也就是單次檢查應該是10 + 5 = 15秒(periodSeconds + timeoutSeconds),並不是10 * 5
所以最長的重啟時間為(10 + 5)* 5 
(periodSeconds + timeoutSeconds) * failureThreshold

此時又分為了兩種情況:
1.	首次啟動時:最長重啟時間需要加上initialDelaySeconds,因為需要等待initialDelaySeconds秒后才會執行健康檢查。最長重啟時間:(periodSeconds + timeoutSeconds) * failureThreshold + initialDelaySeconds
2.	程序啟動完成后:
    此時不需要計入initialDelaySeconds,最長重啟時間:(periodSeconds + timeoutSeconds) * failureThreshold


免責聲明!

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



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