livenessProbe、readinessProbe和startupProbe作用
kubelet使用livenessProbe(存活探針)來判斷何時重啟容器。例如,當程序中產(chǎn)生死鎖的時候,程序還在運行,通過livenessProbe可以檢測到程序已不能正常提供服務(wù)。這種情況下重啟容器可以讓程序恢復可用的狀態(tài)(雖然程序中存在會導致死鎖的bug)。如果沒有配置livenessProbe,則默認狀態(tài)為Success。
kubelet使用readinessProbe(就緒探針)來判斷容器何時準備好了接受流量。當Pod中的所有容器都準備好時,Pod就被認為準備好了。最重要的用途是用來控制哪些pod被用作服務(wù)的后端。當一個Pod未準備好時,在負載均衡中會被移除。如果沒有配置readinessProbe,則默認狀態(tài)為Success。
Kube.NETes從1.17版本開始新增了startupProbe(啟動探針),kubelet使用startupProbe來判斷容器應(yīng)用程序何時啟動。如果配置了startupProbe,等啟動成功后才會進行l(wèi)ivenessProbe和readinessProbe。這樣可以避免應(yīng)用程序在啟動過程被livenessProbe和readinessProbe影響。如果沒有配置startupProbe,則默認狀態(tài)為Success。
k8s中的四種健康檢查方式
livenessProbe、readinessProbe和startupProbe都可以稱為健康檢查,這幾種健康檢查類型都支持四種檢查方式:exec命令、httpGet、tcpSocket和grpc。其中exec命令行方式通用性最強,適用于大部分場景,tcpSocket方式適用于TCP類型的服務(wù),httpGet方式適用于http類型的服務(wù),grpc方式適用于grpc類型的服務(wù)。
- exec:可以將自定義的健康檢查方法封裝成命令行(CLI)工具使用exec來執(zhí)行,如果檢測結(jié)果是正常,命令行返回0值,否則返回非0值。
- httpGet:通過容器的IP地址、端口及服務(wù)提供的http接口路徑,發(fā)起一個HTTP Get請求,如果響應(yīng)的狀態(tài)碼大于等于200且小于400,則認為服務(wù)是健康的。
- tcpSocket:通過容器的IP地址和端口,發(fā)起一個tcp請求,能建立連接則認為服務(wù)是健康的。
- grpc:通過容器的IP地址和端口,發(fā)起一個grpc請求(前提是服務(wù)實現(xiàn)了grpc健康檢查協(xié)議),返回服務(wù)健康的結(jié)果正常則認為服務(wù)是健康的。
配置探針的常用可選參數(shù)如下:
參數(shù)名稱 |
默認值 |
最小值 |
描述 |
initialDelaySeconds |
0秒 |
0秒 |
容器啟動后多久開始進行第一次探測。 |
periodSeconds |
10秒 |
1秒 |
探測頻度,頻率過高會對pod帶來較大的額外開銷,頻率過低則無法及時反映容器真實情況。 |
timeoutSeconds |
1秒 |
1秒 |
探測超時時間。 |
failureThreshold |
3 |
1 |
處于成功狀態(tài)時,探測連續(xù)失敗幾次可被認為失敗。 |
successThreshold |
1 |
1 |
處于失敗狀態(tài)時,探測連續(xù)成功幾次,被認為成功。 |
配置示例
livenessProbe、readinessProbe和startupProbe的配置方法基本類似,下面就以配置livenessProbe為例。
exec方式
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
httpGet方式
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: registry.k8s.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
tcpSocket方式
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
App: goproxy
spec:
containers:
- name: goproxy
image: registry.k8s.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
grpc方式
apiVersion: v1
kind: Pod
metadata:
name: etcd-with-grpc
spec:
containers:
- name: etcd
image: registry.k8s.io/etcd:3.5.1-0
command: [ "/usr/local/bin/etcd", "--data-dir", "/var/lib/etcd", "--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
ports:
- containerPort: 2379
livenessProbe:
grpc:
port: 2379
initialDelaySeconds: 10
更多關(guān)于健康檢查配置的說明可以參考kubernetes官方文檔:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/。