一、探針類型
Kubernetes(k8s)中的探針是一種健康檢查機(jī)制,用于監(jiān)測Pod內(nèi)容器的運(yùn)行狀況。主要包括以下三種類型的探針:
1、存活探針(Liveness Probe)
2、就緒探針(Readiness Probe)
3、啟動(dòng)探針(Startup Probe)(自1.16版本引入)
二、探針功能
1、啟動(dòng)探針(StartupProbe)
Kubernetes (k8s) 的啟動(dòng)探針(StartupProbe)主要用于檢測容器內(nèi)的應(yīng)用是否已經(jīng)成功啟動(dòng)并完成初始化任務(wù)。它的主要作用有以下幾點(diǎn):
-
延緩其他探針生效: 在容器啟動(dòng)初期,啟動(dòng)探針先于存活探針(LivenessProbe)和就緒探針(ReadinessProbe)生效。當(dāng)啟動(dòng)探針配置存在時(shí),kubelet不會(huì)執(zhí)行存活和就緒探針,直到啟動(dòng)探針成功為止。這對(duì)于某些啟動(dòng)時(shí)間較長或者啟動(dòng)過程中有復(fù)雜初始化序列的應(yīng)用程序來說非常重要,可以避免在應(yīng)用還未完全啟動(dòng)時(shí)就被誤判為不健康或就緒,進(jìn)而被錯(cuò)誤地重啟或流量過早涌入。
-
防止頻繁重啟: 若應(yīng)用啟動(dòng)期間,存活探針或就緒探針就開始工作,而此時(shí)應(yīng)用可能還沒有完全啟動(dòng)成功,這兩個(gè)探針可能會(huì)因?yàn)閼?yīng)用未能及時(shí)響應(yīng)而觸發(fā)容器重啟,造成不必要的服務(wù)中斷和循環(huán)重啟。啟動(dòng)探針的存在可以有效地防止此類情況的發(fā)生。
-
確保應(yīng)用穩(wěn)定: 啟動(dòng)探針使得Kubernetes能夠在應(yīng)用真正啟動(dòng)完畢后才將其視為健康的,并開始接受流量,從而保障了集群中應(yīng)用服務(wù)的穩(wěn)定性。
2、就緒探針(Readiness Probe)
Kubernetes(k8s)中的就緒探針(Readiness Probe)主要作用是檢測容器是否已經(jīng)準(zhǔn)備好對(duì)外提供服務(wù)。具體來說:
-
狀態(tài)評(píng)估: 就緒探針會(huì)定期對(duì)容器進(jìn)行檢查,以確定容器內(nèi)應(yīng)用程序是否完成了必要的初始化工作,并且能夠處理來自外部的請(qǐng)求或流量。
-
流量路由控制: 當(dāng)就緒探針成功時(shí),表示該容器內(nèi)部的應(yīng)用程序已處于可接受請(qǐng)求的狀態(tài),此時(shí)kubelet會(huì)將該容器標(biāo)記為“就緒”狀態(tài),Service將會(huì)將其IP地址添加到后端服務(wù)列表中,允許Service開始將網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)至這個(gè)Pod。
-
避免無效請(qǐng)求: 如果就緒探針失敗,則意味著容器可能還在啟動(dòng)過程中、正在重啟服務(wù)、或者由于某種原因暫時(shí)無法正常響應(yīng)請(qǐng)求。在這種情況下,kubelet會(huì)將容器從Service的后端池中移除,確保不會(huì)向其發(fā)送任何用戶請(qǐng)求,從而避免了因應(yīng)用未準(zhǔn)備完畢而引起的錯(cuò)誤響應(yīng)和用戶體驗(yàn)下降。
-
平滑過渡: 通過就緒探針,Kubernetes可以實(shí)現(xiàn)滾動(dòng)更新或部署過程中的平滑過渡,新版本的容器在通過就緒探針驗(yàn)證前,不會(huì)承擔(dān)任何實(shí)際流量,直到它們完全啟動(dòng)并做好處理請(qǐng)求的準(zhǔn)備。
總之,就緒探針是Kubernetes中用于保證服務(wù)質(zhì)量的關(guān)鍵機(jī)制之一,它使得集群能夠根據(jù)容器的實(shí)際運(yùn)行狀況動(dòng)態(tài)調(diào)整流量分配,確保系統(tǒng)的整體穩(wěn)定性和可用性。
3、存活探針(Readiness Probe)
Kubernetes(k8s)中的存活探針(Liveness Probe)主要作用是檢測容器內(nèi)主進(jìn)程或服務(wù)是否仍然運(yùn)行正常且響應(yīng)健康檢查。具體來說:
-
監(jiān)控狀態(tài): 存活探針會(huì)定期對(duì)容器內(nèi)的應(yīng)用進(jìn)行檢查,以判斷其是否處于“存活”狀態(tài),即應(yīng)用程序沒有崩潰、死鎖或其他不可恢復(fù)的錯(cuò)誤。
-
自動(dòng)恢復(fù): 當(dāng)存活探針檢測失敗時(shí),kubelet將認(rèn)為該容器內(nèi)的主進(jìn)程已經(jīng)不再健康或者已停止提供預(yù)期的服務(wù)。此時(shí),kubelet會(huì)根據(jù)Pod的重啟策略來決定是否應(yīng)該重新啟動(dòng)這個(gè)容器。通過這種方式,存活探針可以幫助實(shí)現(xiàn)故障自愈,及時(shí)恢復(fù)服務(wù)的可用性。
-
避免僵死進(jìn)程: 如果一個(gè)容器由于內(nèi)部錯(cuò)誤而進(jìn)入不可用狀態(tài)但并未退出,存活探針能夠識(shí)別出這種情況,并觸發(fā)容器重啟,從而避免資源被僵死進(jìn)程占用。
-
保持服務(wù)質(zhì)量: 通過持續(xù)監(jiān)控和及時(shí)重啟不健康的容器,存活探針有助于確保整個(gè)集群的服務(wù)質(zhì)量,減少因單個(gè)容器異常導(dǎo)致的整體服務(wù)失效的可能性。
總之,在Kubernetes中,存活探針是一種關(guān)鍵的健康管理機(jī)制,用于確保容器內(nèi)應(yīng)用程序始終維持在可接受的工作狀態(tài),當(dāng)出現(xiàn)問題時(shí)能迅速采取行動(dòng)修復(fù)問題。
三、探針探測周期
在Kubernetes(k8s)中,探針包括存活探針(Liveness Probe)、就緒探針(Readiness Probe)和啟動(dòng)探針(Startup Probe),它們執(zhí)行的時(shí)間點(diǎn)不同:
-
啟動(dòng)探針(Startup Probe):
- 啟動(dòng)探針僅在容器啟動(dòng)階段執(zhí)行,探測成功后就不在探測。
- 在容器啟動(dòng)后等待
initialDelaySeconds
開始探測。 - 當(dāng)容器成功通過啟動(dòng)探針檢查,即連續(xù)成功達(dá)到
successThreshold
次數(shù)時(shí),kubelet會(huì)停止執(zhí)行啟動(dòng)探針,并開始執(zhí)行存活探針和就緒探針。
-
存活探針(Liveness Probe):
- 在容器啟動(dòng)并完成啟動(dòng)探針之后開始執(zhí)行。
- 在容器啟動(dòng)后等待
initialDelaySeconds
開始執(zhí)行。如果配置了啟動(dòng)探針(Startup Probe),在啟動(dòng)探針成功后等待initialDelaySeconds開始探測。
- 存活探針在整個(gè)容器生命周期內(nèi)持續(xù)進(jìn)行健康檢查,除非被暫時(shí)禁用或容器重啟。
-
就緒探針(Readiness Probe):
- 與存活探針類似,也是在容器啟動(dòng)并可能完成啟動(dòng)探針之后開始執(zhí)行。
- 在容器啟動(dòng)后等待
initialDelaySeconds
開始執(zhí)行。如果配置了啟動(dòng)探針(Startup Probe),在啟動(dòng)探針成功后等待initialDelaySeconds開始探測。
- 就緒探針在整個(gè)容器生命周期內(nèi)持續(xù)進(jìn)行健康檢查,除非被暫時(shí)禁用或容器重啟。
四、探針的實(shí)現(xiàn)方式
- HTTP GET 請(qǐng)求: Kubernetes通過向容器內(nèi)指定的端口發(fā)送一個(gè)HTTP GET請(qǐng)求來檢查應(yīng)用的狀態(tài)。如果收到的HTTP響應(yīng)碼在200-399范圍內(nèi),則認(rèn)為該探測成功。
livenessProbe:
httpGet:
path: /health-check
port: 8080
httpHeaders: # 可選,用于設(shè)置自定義HTTP頭部
- name: Custom-Header
value: Value
- TCP Socket 檢查: Kubernetes嘗試與容器上指定的端口建立TCP連接。如果能夠成功建立連接,則說明探測成功。
livenessProbe:
tcpSocket:
port: 8080
- 執(zhí)行命令: 在容器內(nèi)部執(zhí)行一個(gè)命令,并根據(jù)命令退出時(shí)返回的狀態(tài)碼判斷容器是否正常運(yùn)行。通常情況下,如果命令返回0,則表示成功。
livenessProbe:
exec:
command:
- cat
- /tmp/health
五、探針的配置參數(shù)
Kubernetes(k8s)中的探針都支持一些通用的參數(shù)來定義它們的行為。以下是這些探針通常使用的配置參數(shù):
livenessProbe:
# 類型選擇器,可以選擇 httpGet、tcpSocket 或 exec 中的一種
httpGet: # HTTP GET 請(qǐng)求方式
path: /health # 要請(qǐng)求的路徑
port: 8080 # 要請(qǐng)求的端口
httpHeaders: # 可選,HTTP 請(qǐng)求頭列表
- name: X-Custom-Header
value: Awesome
tcpSocket: # TCP Socket 檢查方式
port: 8080 # 要連接的端口
exec: # 執(zhí)行命令檢查方式
command:
- cat
- /tmp/healthy
# 基本探測間隔參數(shù):
initialDelaySeconds: 30 # 容器啟動(dòng)后延遲多少秒開始執(zhí)行第一次探測,默認(rèn)為0秒
periodSeconds: 10 # 探測的時(shí)間間隔,即每隔多少秒執(zhí)行一次,默認(rèn)為10秒(最小值1秒)
# 控制何時(shí)判斷容器健康或不健康的閾值參數(shù):
timeoutSeconds: 1 # 探測超時(shí)時(shí)間,默認(rèn)為1秒(最小值1秒)
successThreshold: 1 # 在連續(xù)失敗之后需要多少次連續(xù)成功才能認(rèn)為容器是健康的,默認(rèn)為1
failureThreshold: 3 # 連續(xù)失敗多少次才觸發(fā)相應(yīng)動(dòng)作(如重啟容器對(duì)于存活探針)
readinessProbe: # 就緒探針配置類似
startupProbe: # 啟動(dòng)探針配置也相似,不過主要用于檢測應(yīng)用是否完成啟動(dòng)過程
啟動(dòng)探針在Kubernetes 1.16版本以后引入,其配置參數(shù)與存活探針和就緒探針基本相同,但主要作用是在容器啟動(dòng)階段確定應(yīng)用程序是否已經(jīng)準(zhǔn)備就緒,一旦啟動(dòng)探針確認(rèn)應(yīng)用程序啟動(dòng)成功,就會(huì)停止執(zhí)行并切換到其他探針繼續(xù)進(jìn)行監(jiān)控。
六、探針使用
1、啟動(dòng)探針(Startup Probe):推薦配置
-
不需要配置的情況:對(duì)于那些啟動(dòng)速度快、無需復(fù)雜初始化或依賴檢查就能立即對(duì)外提供服務(wù)的應(yīng)用程序來說,啟動(dòng)探針可能不是必需的。在這種情況下,可以僅依賴存活探針(Liveness Probe)和就緒探針(Readiness Probe)來確保容器運(yùn)行狀態(tài)和服務(wù)可用性。
-
建議配置的情況:然而,對(duì)于那些啟動(dòng)時(shí)間較長或者有復(fù)雜的初始化過程,需要一定時(shí)間才能準(zhǔn)備好對(duì)外提供服務(wù)的應(yīng)用程序來說,配置啟動(dòng)探針是很有幫助的。啟動(dòng)探針可以在應(yīng)用啟動(dòng)過程中阻止kubelet進(jìn)行不必要的健康檢查(如存活探針和就緒探針),直到應(yīng)用程序完成必要的啟動(dòng)步驟并真正準(zhǔn)備就緒為止。
綜上所述,雖然啟動(dòng)探針不是Kubernetes中每個(gè)Pod都必須設(shè)置的部分,但在特定應(yīng)用場景下,為了更精確地管理Pod的生命周期和流量引入時(shí)機(jī),合理配置啟動(dòng)探針是非常有益的。
2、存活探針(Liveness Probe):強(qiáng)烈推薦配置
-
不需要配置的情況:對(duì)于一些簡單、始終運(yùn)行且沒有潛在狀態(tài)問題的應(yīng)用程序來說,如果不設(shè)置存活探針可能也不會(huì)影響其正常運(yùn)行。在這種情況下,如果容器一旦啟動(dòng)就會(huì)持續(xù)提供服務(wù),并且在出現(xiàn)任何故障時(shí)都會(huì)自行退出或重啟,那么可以不使用存活探針。
-
建議配置的情況:然而,對(duì)于大多數(shù)生產(chǎn)環(huán)境中的復(fù)雜應(yīng)用,尤其是那些長時(shí)間運(yùn)行后可能會(huì)遇到內(nèi)部錯(cuò)誤導(dǎo)致無法響應(yīng)請(qǐng)求或者進(jìn)入死鎖狀態(tài)的應(yīng)用,配置存活探針是非常重要的。通過存活探針,Kubernetes 能夠及時(shí)檢測到這類問題并自動(dòng)重啟容器,從而保證服務(wù)的高可用性和穩(wěn)定性。
總結(jié)起來,雖然不是每個(gè) Pod 必須都要設(shè)置存活探針,但在實(shí)際部署中強(qiáng)烈推薦針對(duì)可能出現(xiàn)僵死狀態(tài)的應(yīng)用進(jìn)行健康檢查以確保容器始終處于可提供服務(wù)的狀態(tài)。
3、就緒探針(Readiness Probe):推薦配置
-
不需要配置的情況:對(duì)于那些啟動(dòng)后立即就能處理客戶端請(qǐng)求且不涉及任何額外初始化或依賴檢查的應(yīng)用程序,可以不設(shè)置就緒探針。在這種情況下,應(yīng)用一旦運(yùn)行起來就可以被路由流量。
-
建議配置的情況:然而,對(duì)于許多生產(chǎn)級(jí)別的復(fù)雜應(yīng)用來說,特別是在啟動(dòng)過程中需要加載數(shù)據(jù)、建立連接或者完成其他預(yù)熱操作才能對(duì)外提供服務(wù)時(shí),配置就緒探針是至關(guān)重要的。通過就緒探針,Kubernetes 可以確保只有準(zhǔn)備完畢并能夠正確響應(yīng)請(qǐng)求的容器才會(huì)被添加到 Service 的負(fù)載均衡池中,從而避免將流量導(dǎo)向還未完全準(zhǔn)備好的 Pod,提高服務(wù)質(zhì)量和用戶體驗(yàn)。
總之,雖然不是每個(gè)Pod都必須設(shè)置就緒探針,但在大多數(shù)實(shí)際部署場景下,為了更好地管理服務(wù)可用性狀態(tài)和防止未就緒容器接受外部請(qǐng)求,推薦為具有明顯初始化過程的應(yīng)用程序設(shè)置就緒探針。
七、探針組合使用
1、啟動(dòng)探針+存活探針
現(xiàn)象:啟動(dòng)探針在pod啟動(dòng)后等待initialDelaySeconds后開始探測,探測成功后就會(huì)退出,pod會(huì)立馬進(jìn)入就緒狀態(tài)即endpoints中加入pod的地址即可接收流量。啟動(dòng)探針探測失敗次數(shù)達(dá)到failureThreshold后才會(huì)重啟pod。啟動(dòng)探針成功退出后存活探針等待initialDelaySeconds后啟動(dòng)。存活探針在pod運(yùn)行期間如探測失敗達(dá)到failureThreshold后則重啟pod。
缺點(diǎn):對(duì)于一些項(xiàng)目啟動(dòng)后還需要一些初始化的工作,如不配置就緒探針,啟動(dòng)探針探測成功后會(huì)立即接收流量,此時(shí)項(xiàng)目還未初始化完成會(huì)造成項(xiàng)目無法處理請(qǐng)求。
2、就緒探針+存活探針
現(xiàn)象:就緒探針和存活探針分別等待各自的initialDelaySeconds后開始探測,就緒探針探測成功pod進(jìn)入就緒狀態(tài)即endpoints中加入pod的地址即可接收流量,探測失敗failureThreshold后將從endpoints中去掉pod的地址即停止接收流量。存活探針如探測失敗達(dá)到failureThreshold后則重啟pod。
缺點(diǎn):對(duì)于一些啟動(dòng)時(shí)間比較長的項(xiàng)目,如不配置啟動(dòng)探針可能會(huì)造成存活探針探測失敗而導(dǎo)致pod頻繁重啟。
3、啟動(dòng)探針+就緒探針+存活探針
現(xiàn)象:啟動(dòng)探針在pod啟動(dòng)后等待initialDelaySeconds后開始探測,探測成功后就會(huì)退出,此時(shí)pod不會(huì)進(jìn)入就緒狀態(tài)。就緒探針等待initialDelaySeconds后開始探測,探測成功后pod進(jìn)入就緒狀態(tài)即endpoints中加入pod的地址即可接收流量,探測失敗則流量無法進(jìn)入。同時(shí)存活探針等待initialDelaySeconds后也開始探測,如探測失敗達(dá)到failureThreshold后則重啟pod。文章來源:http://www.zghlxwxcb.cn/news/detail-802094.html
八、推薦配置
#由于啟動(dòng)探針探測成功后就會(huì)退出,所以為了保證項(xiàng)目成功且快速啟動(dòng),可以將initialDelaySeconds、periodSeconds設(shè)置小,failureThreshold設(shè)置大
startupProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 20
timeoutSeconds: 5
successThreshold: 1
#就緒探針在啟動(dòng)探針探測成功后執(zhí)行,可以預(yù)留30s等待其他初始化工作
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
periodSeconds: 5
failureThreshold: 3
timeoutSeconds: 5
successThreshold: 1
#存活探針探測失敗會(huì)導(dǎo)致pod重啟,因此將failureThreshold設(shè)置比就緒探針大,這樣如果項(xiàng)目有問題可以先切斷流量
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
periodSeconds: 5
failureThreshold: 10
timeoutSeconds: 5
successThreshold: 1
?文章來源地址http://www.zghlxwxcb.cn/news/detail-802094.html
到了這里,關(guān)于k8s探針詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!