歡迎訪問我的GitHub
- 地址:https://github.com/zq2599/blog_demos
- 內容:原創文章分類彙總,及配套原始碼,涉及Java、Docker、K8S、DevOPS等
關於《SpringBoot-2.3容器化技術》系列
《SpringBoot-2.3容器化技術》系列,旨在和大家一起學習實踐2.3版本帶來的最新容器化技術,讓我們們的Java應用更加適應容器化環境,在雲端計算時代依舊緊跟主流,保持競爭力;
全系列文章分為主題和輔助兩部分,主題部分如下:
- 《體驗SpringBoot(2.3)應用製作Docker映象(官方方案)》;
- 《詳解SpringBoot(2.3)應用製作Docker映象(官方方案)》;
- 《掌握SpringBoot-2.3的容器探針:基礎篇》;
- 《掌握SpringBoot-2.3的容器探針:深入篇》;
- 《掌握SpringBoot-2.3的容器探針:實戰篇》;
- 輔助部分是一些參考資料和備忘總結,如下:
SpringBoot容器探針系列文章簡介
為了讓應用更適應容器化環境,SpringBoot2.3版本推出了新的探針技術,《掌握SpringBoot-2.3的容器探針》系列旨在與您一起學習和實踐這些新技術,分為三個階段:
探針特性的官方資訊
-
如下圖紅框所示,2.3版本的容器探針特性早在預覽版(v2.3.0.M4)就已經發布:
-
如今v2.3.0.RELEASE已釋出,可以放心的學習和使用該特性了,首先把基礎知識點列出來,確保準備工作OK;
知識點整理
下面是掌握探針技術所需的基礎知識,也是本文的主要內容:
- kubernetes的存活探針livenessProbe;
- kubernetes的就緒探針readinessProbe;
- SpringBoot的actuator;
接下來逐個學習,有了這些知識積累,我們才能更好的閱讀官方資料,開發適合自己業務場景的探針;
kubernetes的存活探針livenessProbe
- kubernetes的探針涉及的內容是很多的,這裡只提和SpringBoot相關的部分;
- kubelet 使用存活探針livenessProbe來知道什麼時候要重啟容器;
- 下圖是kubernetes官網的存活探針示例,幾個關鍵引數已經做了詳細說明:
- 可見如果我們的SpringBoot應用釋出到kubernetes環境,只要應用還健康,livenessProbe對應的地址就要能響應200-400的返回碼;
kubernetes的就緒探針readinessProbe
- 有時候,應用程式會暫時性的不能提供通訊服務。例如,應用程式在啟動時可能需要載入很大的資料或配置檔案,或是啟動後要依賴等待外部服務。在這種情況下,既不想殺死應用程式,也不想給它傳送請求。Kubernetes 提供了就緒探測器來發現並緩解這些情況。容器所在 Pod 上報還未就緒的資訊,並且不接受通過 Kubernetes Service 的流量。
- 就緒探測器的配置和存活探測器的配置相似,唯一區別就是要使用 readinessProbe欄位,而不是 livenessProbe 欄位;
- 簡單的說,就緒探針正常的容器,k8s就認為是可以對外提供服務的,相應的請求也會被排程到該容器上來;
SpringBoot的actuator
- 簡單來說,actuator是用來幫助使用者監控和操作SprinBoot應用的,這些監控和操作都可以通過http請求實現,如下圖,http://localhost:8080/actuator/health 地址返回的是應用的健康狀態:
- 下面是常用的actuator地址,訪問不同的地址可以得到不同的資訊:
- 在SpringBoot-2.3版本中,actuator新增了兩個地址:/actuator/health/liveness和/actuator/health/readiness,前者用作kubernetes的存活探針,後者用作kubernetes的就緒探針;
畫外音:SpringBoot的探針技術就這點東西?
- 文章看到這裡,您可能覺得索然無味:所謂的容器探針特性如此簡單,新增兩個actuator地址留給kubernetes的存活和就緒探針用,只要這兩個地址響應正常,kubernetes就判定該容器正常;
- 大多數時候,上述結論並無不妥,SpringBoot官方給出的推薦配置如下圖,我們只要照搬即可:
- 冷靜下來仔細思考,有三個問題似乎沒有解決:
-
首先,SpringBoot為kubernetes提供了兩個actuator項,但是那些並未部署在kubernetes的SringBoot應用呢?用不上這兩項也要對外暴露這兩個服務地址嗎?
-
其次,就緒探針是什麼時候開始返回200返回碼的?應用啟動階段,業務服務可能需要一段時間才能正常工作,就緒探針要是提前返回了200,那k8s就認為容器可以正常工作了,這時候把外部請求排程過來是無法正常響應的,所以搞清楚就緒探針的狀態變化邏輯很重要;
-
最後,也是最重要的一點:有的場景下,例如外部依賴服務異常、本地全域性異常等情況下,業務不想對外提供服務,等到問題解決後業務又可以對外提供服務了,如果此時我們能自己寫程式碼控制就緒探針的返回碼,那就做到了控制kubernetes是否將外部請求排程到此容器上,這可是個很實用的功能!
還需要繼續深入
面對上述三個問題您是否會感慨:看似簡單的容器探針技術,想要用好還需掌握更多知識,接下來的文章中我們們一起努力吧,從知識覆蓋到實戰操練,終究會掌握這門實用技術;