天天看點

容器健康檢查詳解

我們容器叢集核心基于kubernetes,kubernetes支援對容器進行周期性的探測,根據探測結果來決定判斷容器的健康狀态,并執行額外的操作。當我們建立服務時,在容器參數頁的進階設定選項裡面,可以為容器設定健康檢查。

容器健康檢查詳解
容器健康檢查詳解

容器存活檢查。該檢查方式用于檢測容器是否活着,類似于我們執行ps檢查程序是否存在。如果容器的存活檢查失敗,叢集會對該容器執行重新開機操作,檢查成功則不執行任何操作。

容器就緒檢查。該檢查方式用于檢測容器是否準備好開始處理使用者請求,一些程式的啟動時間可能很長,比如要加載磁盤資料或者依賴外部的某個子產品啟動完成時才提供服務,這時候程式程序在,但是并不能對外提供服務。這種場合下該檢查方式就非常有用。如果容器的就緒檢查失敗,叢集會屏蔽請求通路該容器,否則會放開對該容器的通路。

容器健康檢查詳解

TCP端口探測的原理是,對于提供TCP通信服務的容器,叢集周期性地對該容器建立TCP連接配接,如果連接配接成功,則認為探測成功,否則認為探測失敗。選擇TCP端口探測方式,必須指定容器監聽的端口。比如我們有一個redis容器,它的服務端口是6379,我們對該容器配置了TCP端口探測,指定探測端口為6379,那麼叢集會周期性地對該容器的6379端口發起TCP連接配接,如果連接配接成功則認為檢查成功,否則認為檢查失敗。

HTTP請求探測針對的是提供HTTP或者HTTPS服務的容器,叢集周期性地對該容器發起HTTP/HTTPS GET請求,如果HTTP/HTTPS response傳回碼的範圍在200~399,則認為探測成功,否則認為探測失敗。使用HTTP請求探測必須指定容器監聽的端口和HTTP/HTTPS的請求路徑。舉個例子,我們的容器提供了HTTP服務,服務端口為80,我們的HTTP檢查路徑為/health-check,那麼叢集會周期性地對容器發起 GET http://containerIP:80/health-check 請求。

執行指令檢查是一種強大的檢查方式,該方式要求使用者指定一個容器内的可執行指令,叢集會周期性地在容器内執行該指令,如果指令的傳回結果是0則認為檢查成功,否則認為檢查失敗。

對于上面提到的TCP端口探測和HTTP請求探測,都可以通過執行指令檢查的方式來替代:

對于TCP端口探測,我們可以寫一個程式來對容器的端口進行connect,如果connect成功,腳本傳回0,否則傳回-1。

對于HTTP請求探測,我們可以寫一個腳本來對容器進行wget,wget http://127.0.0.1:80/health-check,并檢查傳回的response,如果code在200~399的範圍,腳本傳回0,否則傳回-1。

注意: 必須把要執行的程式放在容器的鏡像裡面,否則會因找不到程式而執行失敗。

注意: 如果執行的指令是一個shell腳本,不能直接指定腳本作為執行指令,需要加上腳本的解釋器。比如我們腳本是/data/scripts/health_check.sh,那麼我們使用執行指令檢查時,指定的程式應該是 "sh /data/scripts/health_check.sh"。究其原因,是因為叢集在執行容器裡的程式時,不在終端環境。

容器健康檢查詳解

啟動延時,機關秒。該參數指定了容器啟動後,多久開始探測。例如啟動延時設定成5,那麼健康檢查将在容器啟動5秒後開始。

間隔時間,機關秒。該參數指定了健康檢查的頻率。例如間隔時間設定成10,那麼叢集會每隔10s檢查一次。

響應逾時,機關秒。該參數指定了健康探測的逾時時間,對應到TCP端口探測、HTTP請求探測、執行指令檢查三種方式,分别表示TCP連接配接逾時時間、HTTP請求響應逾時時間,以及執行指令的逾時時間。

健康門檻值,機關次數。該參數指定了健康檢查連續成功多少次後,才判定容器是健康的。例如健康門檻值設定成3,隻有滿足連續三次探測都成功才認為容器是健康的。 注意: 如果健康檢查的類型為存活檢查,那麼健康門檻值隻能是1,使用者設定成其它值将被視為無效,因為隻要探測成功一次,我們就能确定容器是存活的。

不健康門檻值,機關次數。該參數指定了健康檢查連續失敗多少次後,才判斷容器是不健康的。例如不健康門檻值設定成3,隻有滿足連續三次都探測失敗了,才認為容器是不健康的。

相關推薦