1. 程式人生 > >掌握SpringBoot-2.3的容器探針:基礎篇

掌握SpringBoot-2.3的容器探針:基礎篇

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