天天看點

Kubernetes最佳實踐S01E05:如何優雅地終止

這篇是Google Developer Advocate

Sandeep Dinesh

的七部分視訊和部落格系列的第五部分,介紹如何充分利用您的Kubernetes環境。

對于分布式系統,處理故障是關鍵。 Kubernetes通過監視系統狀态并重新啟動已停止執行的服務的控制器來解決這個問題。 另一方面,Kubernetes通常可以強制終止您的應用程式,作為系統正常運作的一部分。

在本期“Kubernetes最佳實踐”中,讓我們來看看如何幫助Kubernetes更有效地完成工作并體驗下如何減少應用程式停機時間。

在容器出現之前的世界中,大多數應用程式在VM或實體機器上運作。 如果應用程式崩潰,啟動替換程式需要很長時間。 如果您隻有一台或兩台機器來運作應用程式,那麼這種恢複時間是不可接受的。

相反,在崩潰時使用程序級監視來重新啟動應用程式變得很常見。 如果應用程式崩潰,程序監視可以捕獲退出代碼并立即重新啟動應用程式。

随着像Kubernetes這樣的系統的出現,不再需要程序監控系統,因為Kubernetes會重新開機崩潰的應用程式本身。 Kubernetes使用事件循環來確定容器和節點等資源是健康的。 這意味着您不再需要手動運作這些程序螢幕。 如果資源未通過運作狀況檢查,Kubernetes會自動輪轉更換。

檢視這一集視訊,了解如何為您的服務設定自定義健康檢查。

Kubernetes終止生命周期

Kubernetes不僅可以監控應用程式的崩潰。 它可以建立更多應用程式副本,以便在多台計算機上運作,更新應用程式,甚至可以同時運作多個版本的應用程式!

這意味着Kubernetes可以終止一個完全健康的容器有很多原因。 如果您使用滾動更新更新部署,Kubernetes會在啟動新Pod時慢慢終止舊Pod。 如果釋放節點,Kubernetes将終止該節點上的所有Pod。 如果節點資源不足,Kubernetes将終止Pod以釋放這些資源。

檢視第三集,可以了解有關資源的更多資訊

重要的是,您的應用程式要優雅地處理終止,以便最終使用者受到的影響最小,并且恢複時間盡可能快(

Time-to-recovery

)!

實際上,這意味着您的應用程式需要處理SIGTERM消息并在收到它時開始關閉。 這意味着你需要儲存所有需要儲存的資料,關閉網絡連接配接,完成剩下的任何工作以及其他類似任務。

一旦Kubernetes決定終止您的Pod,就會發生一系列事件。 讓我們看看Kubernetes終止生命周期的每一步。

1. Pod被設定為“終止”狀态,并從所有服務的端點清單中删除

此時,Pod停止獲得新的流量。 在Pod中運作的容器不會受到影響。

2.

preStop Hook

被執行

preStop Hook

是一個發送到Pod中的容器特殊指令或Http請求。

如果您的應用程式在接收SIGTERM時沒有正常關閉,您可以使用此

Hook

來觸發正常關閉。 接收SIGTERM時大多數程式都會正常關閉,但如果您使用的是第三方代碼或管理系統則無法控制,是以

preStop Hook

是在不修改應用程式的情況下觸發正常關閉的好方法。

3. SIGTERM信号被發送到Pod

此時,Kubernetes将向Pod中的容器發送SIGTERM信号。 這個信号讓容器知道它們很快就會被關閉。

您的代碼應該監聽此事件并在此時開始幹淨地關閉。 這可能包括停止任何長期連接配接(如資料庫連接配接或WebSocket流),儲存目前狀态或類似的東西。

即使您使用

preStop Hook

,如果您發送SIGTERM信号,測試一下應用程式會發生什麼情況也很重要,這樣您在生産環境中才不會感到驚訝!

4. Kubernetes等待優雅的終止

此時,Kubernetes等待指定的時間稱為優雅終止寬限期。 預設情況下,這是30秒。 值得注意的是,這與

preStop Hook

和SIGTERM信号并行發生。 Kubernetes不會等待

preStop Hook

完成。

如果你的應用程式完成關閉并在

terminationGracePeriod

完成之前退出,Kubernetes會立即進入下一步。

如果您的Pod通常需要超過30秒才能關閉,請確定增加優雅終止寬限期。 您可以通過在Pod的YAML中設定

terminationGracePeriodSeconds

選項來實作。 例如,要将其更改為60秒:

5. SIGKILL信号被發送到Pod,并删除Pod

如果容器在優雅終止寬限期後仍在運作,則會發送SIGKILL信号并強制删除。 此時,所有Kubernetes對象也會被清除。

結論

Kubernetes可以出于各種原因終止Pod,并確定您的應用程式優雅地處理這些終止,這是建立穩定系統和提供出色使用者體驗的核心。

本文轉自DockOne-

Kubernetes最佳實踐S01E05:如何優雅地終止

繼續閱讀