Kubernetes健康检查如何做?官方推荐教程
編者語(yǔ):這是 Google 開(kāi)發(fā)者布道師 Sandeep Dinesh[1]的視頻[2]和博客系列 “如何充分利用 Kubernetes 環(huán)境” 的第三部分。
分布式系統(tǒng)管理比較困難。很重要的原因是系統(tǒng)正常工作依賴很多不同的組件。任何一個(gè)組件出了問(wèn)題,系統(tǒng)必須要能發(fā)現(xiàn)出問(wèn)題的組件,繞開(kāi)并且修復(fù)它,所有的這些都要自動(dòng)完成。
健康檢查是發(fā)現(xiàn)你的應(yīng)用實(shí)例是否正常工作的簡(jiǎn)單方式。如果應(yīng)用的某個(gè)實(shí)例不能工作,其他的服務(wù)不應(yīng)該訪問(wèn)或者請(qǐng)求該實(shí)例。請(qǐng)求應(yīng)該發(fā)送給應(yīng)用的其他正常實(shí)例,過(guò)一段時(shí)間再嘗試異常實(shí)例。系統(tǒng)應(yīng)該保證應(yīng)用處于正常狀態(tài)。
默認(rèn)情況下,Kubernetes 在容器內(nèi)的 Pod 啟動(dòng)后開(kāi)始向 Pod 發(fā)送流量,并在容器崩潰時(shí)重新啟動(dòng)容器。雖然這已經(jīng)“足夠好”,然而你可以通過(guò)自定義的健康檢查讓部署過(guò)程更加完美。Kubernetes 非常容易實(shí)現(xiàn)自定義健康檢查,所以沒(méi)有理由不去用它。
我們?cè)敿?xì)介紹一下如何在 Kubernetes 集群中選擇和設(shè)置 Readiness 和 Liveness 探針[3]。
?
健康檢查類型
Kubernetes 提供了2種健康檢查的方式。下面我們來(lái)了解一下這兩種健康檢查的區(qū)別和使用。
READINESS
設(shè)計(jì) Readiness 探針的目的是用來(lái)讓 Kubernetes 知道你的應(yīng)用何時(shí)能對(duì)外提供服務(wù)。在服務(wù)發(fā)送流量到 Pod 之前,Kubernetes必須確保 Readinetes 探針檢測(cè)成功。如果 Readiness 探針檢測(cè)失敗了,Kubernetes 會(huì)停掉 Pod 的流量,直到 Readiness 檢測(cè)成功。
LIVENESS
Liveness 探針能讓 Kubernetes 知道你的應(yīng)用是否存活。如果你的應(yīng)用是存活的,Kubernetes 不做任何處理。如果是掛掉的,Kubernetes 會(huì)移除異常的 Pod,并且啟一個(gè)新的 Pod 替換它。
?
健康檢查的作用
我們來(lái)看兩種場(chǎng)景下,如何使用Readiness 和 Liveness 探針幫助你構(gòu)建更健壯的應(yīng)用。
READINESS
假設(shè)你的應(yīng)用需要時(shí)間進(jìn)行預(yù)熱和啟動(dòng)。即便進(jìn)程已經(jīng)啟動(dòng),你的服務(wù)依然是不可用的,直到它真的運(yùn)行起來(lái)。如果想讓你的應(yīng)用橫向部署多實(shí)例,這也可能會(huì)導(dǎo)致一些問(wèn)題。因?yàn)樾碌膹?fù)本在沒(méi)有完全準(zhǔn)備好之前,不應(yīng)該接收請(qǐng)求。但是默認(rèn)情況下,只要容器內(nèi)的進(jìn)程啟動(dòng)完成,Kubernetes 就會(huì)開(kāi)始發(fā)送流量過(guò)來(lái)。如果使用 Readiness 探針, Kubernetes 就會(huì)一直等待,直到應(yīng)用完全啟動(dòng),才會(huì)允許發(fā)送流量到新的復(fù)本。
?
LIVENESS
我們?cè)O(shè)想另外一種場(chǎng)景,你的應(yīng)用產(chǎn)生了死鎖,導(dǎo)致進(jìn)程一直夯住,并且停止處理請(qǐng)求。因?yàn)檫M(jìn)程還處在活躍狀態(tài),默認(rèn)情況下, Kubernetes 認(rèn)為一切正常,會(huì)繼續(xù)向異常Pod 發(fā)送流量。通過(guò)使用 Liveness 探針, Kubernetes 會(huì)發(fā)現(xiàn)應(yīng)用不再處理請(qǐng)求,然后重啟異常的 Pod 。
?
探針類型
接下來(lái)就是如何定義 Liveness 和 Readiness 探針了。有3種類型的探針實(shí)現(xiàn)方式可以選擇,分別是:HTTP、Command、TCP。你可以使用任何一種方式實(shí)現(xiàn) Liveness 和 Readiness 探針。
HTTP
HTTP 可能是 Liveness 探針的最常用的實(shí)現(xiàn)方式。即便你的應(yīng)用不是一個(gè) HTTP 服務(wù),你也可以通過(guò)在應(yīng)用內(nèi)部集成一個(gè)輕量級(jí)的HTTP 服務(wù),以支持 Liveness 探針。Kubernetes 通過(guò) ping 一個(gè)路徑,如果 HTTP 響應(yīng)的狀態(tài)碼是 2xx 或者 3xx ,說(shuō)明該應(yīng)用是健康狀態(tài),否則就是不健康狀態(tài)。
更多 HTTP探針信息[4]
COMMAND
對(duì)于命令行探針,kubernetes 在容器內(nèi)運(yùn)行命令,如果返回0,說(shuō)明服務(wù)是健康狀態(tài),否則就是不健康狀態(tài)。當(dāng)你不能或者不想提供額外的 HTTP 服務(wù),但是能使用命令行的時(shí)候,通過(guò)命令行來(lái)進(jìn)行健康檢查很有用的。
更多 Command探針信息[5]
TCP
最后一種是 TCP 探針。Kubernetes 嘗試跟某個(gè)端口建立一個(gè) TCP 連接。如果能建立連接,表示容器是健康狀態(tài),否則是不健康狀態(tài)。
假如 HTTP 和命令行都不能使用的情況下, TCP 的方式就派上用場(chǎng)了。例如 gRPC[6]或者 FTP 服務(wù)中,TCP 類型就是首選。
更多 TCP探針信息[7]
?
配置探針啟動(dòng)的延遲
探針有多種配置。你能指定探針多久執(zhí)行一次、成功和失敗的閾值、多長(zhǎng)時(shí)間的響應(yīng)等待等等。 探針配置文檔[8]非常清楚的介紹了這些不同的配置的作用。
當(dāng)你使用 Liveness 探針的時(shí)候,initialDelaySeconds 是你需要設(shè)置的非常重要的配置。
如前面說(shuō)的,Liveness 探針檢查失敗會(huì)導(dǎo)致 Pod 重啟。你必須確保 Liveness 探針在應(yīng)用準(zhǔn)備好之后生效。否則,應(yīng)用會(huì)一直不停被重啟。
我推薦使用 p99[9]作為 initialDelaySeconds 的生效時(shí)間,或者簡(jiǎn)單的使用平均啟動(dòng)時(shí)間加一個(gè)緩沖時(shí)間。如果應(yīng)用的啟動(dòng)時(shí)間變長(zhǎng)或者變短了,確保更新了這個(gè)配置。
?
總結(jié)
很多人都會(huì)告訴你,分布式系統(tǒng)必須有健康檢查,Kubernetes 也不例外。Kubernetes 提供了非常方便的健康檢查,為你Kubernetes 中的服務(wù)提供更穩(wěn)定的、更可靠的、更高的正常運(yùn)行時(shí)間。
本文作者Sandeep Dinesh,由鄧啟明翻譯。轉(zhuǎn)載譯文請(qǐng)注明出處,技術(shù)原創(chuàng)及架構(gòu)實(shí)踐文章,歡迎通過(guò)公眾號(hào)菜單「聯(lián)系我們」進(jìn)行投稿。
?
參考鏈接
[1]?https://twitter.com/sandeepdinesh?lang=en
[2]?https://www.youtube.com/playlist?list=PLIivdWyY5sqL3xfXz5xJvwzFW_tlQB_GB
[3] https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
[4] https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-liveness-http-request
[5]?https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-liveness-command
[6]?https://grpc.io/
[7]?https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-tcp-liveness-probe
[8]?https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
[9]?https://www.quora.com/What-is-p99-latency
總結(jié)
以上是生活随笔為你收集整理的Kubernetes健康检查如何做?官方推荐教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 蚂蚁金服的 Service Mesh 演
- 下一篇: 从Java程序员的角度理解加密的那些事