要想Pod好
2023-10-14 143 發(fā)布于江蘇
版權(quán)
舉報(bào)
版權(quán)聲明:
本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開(kāi)發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《 阿里云開(kāi)發(fā)者社區(qū)用戶服務(wù)協(xié)議》和 《阿里云開(kāi)發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫 侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。
簡(jiǎn)介: 本文主要從以下6個(gè)方面介紹Pod的健康檢查:剛接觸K8S的糗事、Pod生命周期、重啟策略、健康檢查、如何選擇探針、實(shí)戰(zhàn),最后還會(huì)有知識(shí)點(diǎn)的總結(jié)和排查Pod問(wèn)題的總結(jié)。
要想Kubernetes里每個(gè)服務(wù)的可用性更高,那么對(duì)Pod的健康檢查是少不了的。Pod生命周期和健康檢查是我們最常接觸的基礎(chǔ)知識(shí),雖說(shuō)是基礎(chǔ)吧,但如果理解不好,出現(xiàn)問(wèn)題時(shí)很容易抓耳撓腮,揪頭發(fā)。
本文主要從以下6個(gè)方面介紹Pod的健康檢查:剛接觸K8S的糗事、Pod生命周期、重啟策略、健康檢查、如何選擇探針、實(shí)戰(zhàn),最后還會(huì)有知識(shí)點(diǎn)的總結(jié)和排查Pod問(wèn)題的總結(jié)。
1、剛接觸K8S的糗事
回想2019年我剛開(kāi)始接觸Kubernetes時(shí),碰到Pod一直起不來(lái)的情況,就開(kāi)始抓瞎。后來(lái)漸漸地掌握了一些排查方法之后,這種情況才得以緩解。
隨著時(shí)間推移,又碰到了問(wèn)題。有一天在部署某個(gè)springboot微服務(wù)時(shí),在開(kāi)發(fā)測(cè)試環(huán)境部署了好多次,只有幾次能成功啟動(dòng),大部分的部署未能成功啟動(dòng)。但是生產(chǎn)環(huán)境卻每次都能成功部署。當(dāng)時(shí)這個(gè)問(wèn)題困擾了我很久。現(xiàn)在想來(lái)也是蠻有意思的。
相信很多你已經(jīng)猜出來(lái)答案了,對(duì),跟我們今天要講的健康檢查有關(guān)。
2、Pod生命周期
談健康檢查之前,首先得一起回顧下Pod的生命周期 或者 說(shuō)是Pod的狀態(tài)。
Pod 的生命周期,從 Pending 狀態(tài)開(kāi)始, 如果Pod中至少有一個(gè)應(yīng)用容器正常啟動(dòng),則進(jìn)入 Running狀態(tài),之后,如果Pod中的容器正常退出則進(jìn)入 Succeeded狀態(tài),如果Pod中的容器非正常終止則進(jìn)入 Failed 狀態(tài)。
Pending狀態(tài):此時(shí)Pod已經(jīng)被K8S接受并且創(chuàng)建,但是Pod內(nèi)還沒(méi)有容器被創(chuàng)建,這個(gè)過(guò)程包括:等待Pod被調(diào)度的時(shí)間、下載鏡像的時(shí)間。 Running狀態(tài):此時(shí)Pod已經(jīng)運(yùn)行在某個(gè)節(jié)點(diǎn)上,Pod內(nèi)所有容器都已經(jīng)創(chuàng)建,并且有容器處于如下?tīng)顟B(tài):運(yùn)行狀態(tài)、正在啟動(dòng)狀態(tài) 或 正在重啟狀態(tài)。 Succeeded狀態(tài):此時(shí)Pod內(nèi)所有容器都成功執(zhí)行并且退出。 Failed狀態(tài):此時(shí)Pod內(nèi)所有容器都已終止,但是有容器是非正常終止的。 Unknown狀態(tài):無(wú)法獲取Pod狀態(tài),通常是因?yàn)镻od與所在主機(jī)通信失敗,也可能是別的原因。3、重啟策略
Pod的重啟是由該P(yáng)od所處的Node節(jié)點(diǎn)上的kubelet 進(jìn)行判斷和控制的。kubelet會(huì)根據(jù)重啟策略進(jìn)行相應(yīng)操作。
Pod的重啟策略有3個(gè):Always、OnFailure、Never,默認(rèn)是Always。
Always:重啟策略是Always時(shí),那么當(dāng)容器運(yùn)行狀態(tài)是失效時(shí),kubelet會(huì)自動(dòng)重啟該容器,比如:存活探針檢測(cè)到應(yīng)用不健康了,就會(huì)自動(dòng)重啟Pod。 OnFailure:重啟策略是OnFailure時(shí),那么當(dāng)容器是Failed狀態(tài)時(shí),kubelet會(huì)自動(dòng)重啟該容器。 Never:不論容器運(yùn)行狀態(tài)怎樣,kubelet都不會(huì)重啟該容器。4、健康檢查
健康檢查功能可以保障應(yīng)用的可用性,以及控制何時(shí)可對(duì)外的訪問(wèn)。
K8S有3種檢查探針:LivenessProbe存活探針、ReadinessProbe就緒探針、StartupProbe啟動(dòng)探針。
LivenessProbe存活探針
判斷容器是否存活(Running狀態(tài)),如果存活探針檢測(cè)到容器不健康,則kubelet將kill掉該容器,并根據(jù)容器的重啟策略做相應(yīng)的處理。
ReadinessProbe 就緒探針
判斷容器是否可用(Ready狀態(tài)),達(dá)到Ready狀態(tài)的Pod才可以接收請(qǐng)求。kubelet 使用就緒探針檢測(cè)容器什么時(shí)候可以接受請(qǐng)求。
StartupProbe啟動(dòng)探針
某些應(yīng)用啟動(dòng)比較慢,例如某個(gè)大的單體應(yīng)用啟動(dòng)時(shí)間長(zhǎng)達(dá)3分鐘,此時(shí)如果只使用存活探針 或者 就緒探針,很可能應(yīng)用還沒(méi)起來(lái),就被kill掉了。
這種情況可以通過(guò)啟動(dòng)探針來(lái)解決。如果配置了啟動(dòng)探針,在存活探針和就緒探針成功之前不會(huì)重啟容器。說(shuō)白了就是只要配置了啟動(dòng)探針,那么在應(yīng)用沒(méi)成功啟動(dòng)之前,存活探針和就緒探針就不生效。
以上3種探針,每種都有3種實(shí)現(xiàn)方式:
ExecAction:在容器內(nèi)運(yùn)行一個(gè)命令,如果該命令的返回碼為 0,則說(shuō)明容器是健康的。 TCPSocketAction:通過(guò)容器的 IP 地址和端口號(hào)進(jìn)行TCP檢查,如果能夠建立TCP 連接,則說(shuō)明容器是健康的。 HTTPGetAction:通過(guò)容器的IP 地址、端口號(hào)以及路徑,發(fā)起HTTP請(qǐng)求,如果HTTP響應(yīng)的狀態(tài)碼大于等于200且小于400,則說(shuō)明容器是健康的。在部署Java微服務(wù)應(yīng)用時(shí),我一般選用HTTPGetAction方式。
5、如何選擇探針
既然有3種探針,那么如何選擇呢?
如果你希望容器在檢測(cè)到失敗時(shí),讓它被kill掉并且自動(dòng)重啟,那就選擇存活態(tài)探針。 如果你希望在檢測(cè)成功時(shí)Pod才能接受請(qǐng)求,那就需要就緒態(tài)探針。如果某個(gè)應(yīng)用A 依賴 應(yīng)用B的啟動(dòng)才能接受請(qǐng)求,那也需要就緒探針。 如果某個(gè)應(yīng)用啟動(dòng)時(shí)間較長(zhǎng),那就需要加入啟動(dòng)探針。成年人的世界不做選擇題,3個(gè)字,全都要,比如:應(yīng)用場(chǎng)景是Spring微服務(wù)時(shí),3種探針其實(shí)都會(huì)用上。
一個(gè)應(yīng)用啟動(dòng)分3個(gè)階段:開(kāi)始啟動(dòng) → 成功啟動(dòng)(存活) → 可對(duì)外訪問(wèn)。
那對(duì)應(yīng)的探針使用順序?yàn)椋簡(jiǎn)?dòng)探針 → 存活探針 → 就緒探針。如下圖:
如果只選擇存活探針,就很尷尬:
如果配置的存活檢測(cè)時(shí)間太短,那么碰到啟動(dòng)慢的應(yīng)用,就徹底起不來(lái)了,因?yàn)閼?yīng)用還沒(méi)起來(lái)就被kill掉了。 如果配置的存活檢測(cè)時(shí)間太長(zhǎng),那么應(yīng)用真到了出現(xiàn)問(wèn)題的時(shí)候,又無(wú)法及時(shí)被重啟,從而影響了整體的可用性。如果不配置就緒探針的話,也很尷尬:
比如有的場(chǎng)景下本身應(yīng)用起來(lái)了,但是依賴的應(yīng)用還沒(méi)起來(lái),那么此時(shí)還無(wú)法對(duì)外提供訪問(wèn)能力,此時(shí)就不能讓請(qǐng)求流量進(jìn)來(lái)。所以不做選擇題,全都要,需要在每個(gè)階段用上對(duì)應(yīng)的探針。
6、實(shí)戰(zhàn)
6.1、模擬不健康的應(yīng)用場(chǎng)景
編排yaml
比如:對(duì)Pod進(jìn)行存活檢測(cè),30S之后,如果不存活則kill掉,然后重啟。
apiVersion: v1 kind: Pod metadata: name: pod-lifecycle namespace: demo labels: app: pod-lifecycle spec: containers: - name: pod-lifecycle image: busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy # 等待5秒執(zhí)行第一次探測(cè) initialDelaySeconds: 5 # 探針連續(xù)失敗了 3 次之后,K8S認(rèn)為檢查已失敗,然后觸發(fā)重啟 failureThreshold: 3 # 每5秒執(zhí)行一次存活探測(cè) periodSeconds: 5
可以看到Pod被重啟多次
排查異常
出現(xiàn)問(wèn)題時(shí)也不用慌,可以通過(guò)kubectl get pods -n demo -o wide 和kubectl describe pod pod-lifecycle -n demo排查??梢郧逦目吹疆惓5脑颍捍婊顧z查失敗。
6.2、模擬啟動(dòng)慢的應(yīng)用
編排yaml
比如:對(duì)Pod進(jìn)行存活檢測(cè),30S之后,如果不存活則kill掉,然后重啟。由于模擬了啟動(dòng)比較耗時(shí),所以在容器還未成功啟動(dòng),就直接被kill掉了,緊接著反復(fù)被kill掉。
apiVersion: v1 kind: Pod metadata: name: pod-lifecycle-2 namespace: demo labels: app: pod-lifecycle-2 spec: containers: - name: pod-lifecycle-2 image: busybox args: - /bin/sh - -c - sleep 20; touch /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy # 等待5秒執(zhí)行第一次探測(cè) initialDelaySeconds: 5 # 探針連續(xù)失敗了 2 次之后,K8S認(rèn)為檢查已失敗,然后觸發(fā)重啟 failureThreshold: 2 # 每5秒執(zhí)行一次存活探測(cè) periodSeconds: 5
執(zhí)行yaml之后,可以看到,Pod重復(fù)這樣的動(dòng)作:健康檢查失敗被重啟。
引入startupProbe解決此問(wèn)題
apiVersion: v1 kind: Pod metadata: name: pod-lifecycle-3 namespace: demo labels: app: pod-lifecycle-3 spec: containers: - name: pod-lifecycle-3 image: busybox args: - /bin/sh - -c - sleep 20; touch /tmp/healthy; sleep 600 startupProbe: exec: command: - cat - /tmp/healthy # 等待5秒執(zhí)行第一次探測(cè) initialDelaySeconds: 5 # 探針連續(xù)失敗了 10 次之后,K8S認(rèn)為檢查已失敗,然后觸發(fā)重啟 failureThreshold: 5 # 每5秒執(zhí)行一次存活探測(cè) periodSeconds: 5 livenessProbe: exec: command: - cat - /tmp/healthy # 等待5秒執(zhí)行第一次探測(cè) initialDelaySeconds: 5 # 探針連續(xù)失敗了 2 次之后,K8S認(rèn)為檢查已失敗,然后觸發(fā)重啟 failureThreshold: 2 # 每5秒執(zhí)行一次存活探測(cè) periodSeconds: 5
7、總結(jié)
要想Kubernetes里每個(gè)服務(wù)的可用性更高,那么對(duì)Pod的健康檢查是少不了的。本文重點(diǎn)如下:
Pod生命周期:Pending 、Running、 Succeeded或 Failed 、UnKnown。 Pod重啟策略:Always、OnFailure、Never。 3種探針類型:?jiǎn)?dòng)探針、存活探針、就緒探針。 如何選擇探針:一般情況下全都要。 排查Pod問(wèn)題:搭配使用kubectl get pods -n demo -o wide 和kubectl describe pods webapp -n demo。講到這里,文章開(kāi)頭我碰到的問(wèn)題,你肯定也知道答案了。由于應(yīng)用啟動(dòng)時(shí)間較長(zhǎng),但是只配置了存活探針,沒(méi)有配置啟動(dòng)探針。再加上存活探針配置的整體時(shí)間又太短了,每臺(tái)機(jī)器的性能又不同,所以導(dǎo)致有時(shí)候能啟動(dòng)成功,有時(shí)候啟動(dòng)失敗。
本篇完結(jié)!感謝你的閱讀,歡迎點(diǎn)贊 關(guān)注 收藏 私信?。。?/strong>
原文鏈接:http://www.mangod.top/articles/2023/10/13/1697203712757.html、https://mp.weixin.qq.com/s/ssMuJHUybNXKs2yck18IwQ
相關(guān)實(shí)踐學(xué)習(xí)
通過(guò)Ingress進(jìn)行灰度發(fā)布
本場(chǎng)景您將運(yùn)行一個(gè)簡(jiǎn)單的應(yīng)用,部署一個(gè)新的應(yīng)用用于新的發(fā)布,并通過(guò)Ingress能力實(shí)現(xiàn)灰度發(fā)布。
容器應(yīng)用與集群管理
歡迎來(lái)到《容器應(yīng)用與集群管理》課程,本課程是“云原生容器Clouder認(rèn)證“系列中的第二階段。課程將向您介紹與容器集群相關(guān)的概念和技術(shù),這些概念和技術(shù)可以幫助您了解阿里云容器服務(wù)ACK/ACK Serverless的使用。同時(shí),本課程也會(huì)向您介紹可以采取的工具、方法和可操作步驟,以幫助您了解如何基于容器服務(wù)ACK Serverless構(gòu)建和管理企業(yè)級(jí)應(yīng)用。 學(xué)習(xí)完本課程后,您將能夠: 掌握容器集群、容器編排的基本概念 掌握Kubernetes的基礎(chǔ)概念及核心思想 掌握阿里云容器服務(wù)ACK/ACK Serverless概念及使用方法 基于容器服務(wù)ACK Serverless搭建和管理企業(yè)級(jí)網(wǎng)站應(yīng)用
相關(guān)知識(shí)
k8s健康檢查 spring k8s健康檢查探針多個(gè)地址
想要好好補(bǔ)腎 就要把握好最佳補(bǔ)腎時(shí)機(jī)
想要身材好,一定要做的5件事
想要好好調(diào)整生活,這6個(gè)秘訣一定要收藏好→
想要瘦身就要定好健身飲食計(jì)劃
環(huán)境污染物聯(lián)合暴露的人體健康累積風(fēng)險(xiǎn)評(píng)估研究進(jìn)展
想要好氣色 首先得養(yǎng)好肝臟
心情不好容易有實(shí)火 想要去火要保持好心情
想要每天睡得好 這些助眠技巧要嘗試
昆明想要快速懷孕需要做好這些準(zhǔn)備
網(wǎng)址: 要想Pod好 http://www.u1s5d6.cn/newsview152520.html
推薦資訊
- 1發(fā)朋友圈對(duì)老公徹底失望的心情 12775
- 2BMI體重指數(shù)計(jì)算公式是什么 11235
- 3補(bǔ)腎吃什么 補(bǔ)腎最佳食物推薦 11199
- 4性生活姿勢(shì)有哪些 盤點(diǎn)夫妻性 10425
- 5BMI正常值范圍一般是多少? 10137
- 6在線基礎(chǔ)代謝率(BMR)計(jì)算 9652
- 7一邊做飯一邊躁狂怎么辦 9138
- 8從出汗看健康 出汗透露你的健 9063
- 9早上怎么喝水最健康? 8613
- 10五大原因危害女性健康 如何保 7826