Kubernetes中配置livenessProbe、ReadinessProbe和StartupProbe
livenessProbe、readinessProbe和startupProbe作用
kubelet使用livenessProbe(存活探針)來判斷何時(shí)重啟容器。例如,當(dāng)程序中產(chǎn)生死鎖的時(shí)候,程序還在運(yùn)行,通過livenessProbe可以檢測(cè)到程序已不能正常提供服務(wù)。這種情況下重啟容器可以讓程序恢復(fù)可用的狀態(tài)(雖然程序中存在會(huì)導(dǎo)致死鎖的bug)。如果沒有配置livenessProbe,則默認(rèn)狀態(tài)為Success。
kubelet使用readinessProbe(就緒探針)來判斷容器何時(shí)準(zhǔn)備好了接受流量。當(dāng)Pod中的所有容器都準(zhǔn)備好時(shí),Pod就被認(rèn)為準(zhǔn)備好了。最重要的用途是用來控制哪些pod被用作服務(wù)的后端。當(dāng)一個(gè)Pod未準(zhǔn)備好時(shí),在負(fù)載均衡中會(huì)被移除。如果沒有配置readinessProbe,則默認(rèn)狀態(tài)為Success。
Kubernetes從1.17版本開始新增了startupProbe(啟動(dòng)探針),kubelet使用startupProbe來判斷容器應(yīng)用程序何時(shí)啟動(dòng)。如果配置了startupProbe,等啟動(dòng)成功后才會(huì)進(jìn)行l(wèi)ivenessProbe和readinessProbe。這樣可以避免應(yīng)用程序在啟動(dòng)過程被livenessProbe和readinessProbe影響。如果沒有配置startupProbe,則默認(rèn)狀態(tài)為Success。
k8s中的四種健康檢查方式
livenessProbe、readinessProbe和startupProbe都可以稱為健康檢查,這幾種健康檢查類型都支持四種檢查方式:exec命令、httpGet、tcpSocket和grpc。其中exec命令行方式通用性最強(qiáng),適用于大部分場(chǎng)景,tcpSocket方式適用于TCP類型的服務(wù),httpGet方式適用于http類型的服務(wù),grpc方式適用于grpc類型的服務(wù)。
- exec:可以將自定義的健康檢查方法封裝成命令行(CLI)工具使用exec來執(zhí)行,如果檢測(cè)結(jié)果是正常,命令行返回0值,否則返回非0值。
- httpGet:通過容器的IP地址、端口及服務(wù)提供的http接口路徑,發(fā)起一個(gè)HTTP Get請(qǐng)求,如果響應(yīng)的狀態(tài)碼大于等于200且小于400,則認(rèn)為服務(wù)是健康的。
- tcpSocket:通過容器的IP地址和端口,發(fā)起一個(gè)tcp請(qǐng)求,能建立連接則認(rèn)為服務(wù)是健康的。
- grpc:通過容器的IP地址和端口,發(fā)起一個(gè)grpc請(qǐng)求(前提是服務(wù)實(shí)現(xiàn)了grpc健康檢查協(xié)議),返回服務(wù)健康的結(jié)果正常則認(rèn)為服務(wù)是健康的。
配置探針的常用可選參數(shù)如下:
參數(shù)名稱 | 默認(rèn)值 | 最小值 | 描述 |
initialDelaySeconds | 0秒 | 0秒 | 容器啟動(dòng)后多久開始進(jìn)行第一次探測(cè)。 |
periodSeconds | 10秒 | 1秒 | 探測(cè)頻度,頻率過高會(huì)對(duì)pod帶來較大的額外開銷,頻率過低則無法及時(shí)反映容器真實(shí)情況。 |
timeoutSeconds | 1秒 | 1秒 | 探測(cè)超時(shí)時(shí)間。 |
failureThreshold | 3 | 1 | 處于成功狀態(tài)時(shí),探測(cè)連續(xù)失敗幾次可被認(rèn)為失敗。 |
successThreshold | 1 | 1 | 處于失敗狀態(tài)時(shí),探測(cè)連續(xù)成功幾次,被認(rèn)為成功。 |
配置示例
livenessProbe、readinessProbe和startupProbe的配置方法基本類似,下面就以配置livenessProbe為例。
exec方式
httpGet方式
tcpSocket方式
grpc方式
更多關(guān)于健康檢查配置的說明可以參考kubernetes官方文檔:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/。