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