如果您精通K8s,且需要在應用程式容器啟動前或者關閉前執行相關操作,例如運行前部署資源或者停止前優雅下線應用,可以設定應用生命週期管理。本文主要介紹如何在SAE應用中配置PostStart、PreStop和TerminationGracePeriodSeconds。
功能介紹
Pod hook(容器鉤子)是由Kubernetes管理的kubelet組件發起的機制,用於在容器的生命週期的關鍵階段執行自訂任務。這些階段包括容器進程啟動前(preStart)和終止前(preStop)。鉤子的引入使Kubernetes能夠更加靈活和精細地管理容器的生命週期。更多資訊,請參見Container Lifecycle Hooks。
啟動後處理(PostStart設定):是容器生命週期中的一種鉤子,該鉤子在容器被建立後立刻觸發,通知容器它已經被建立。該鉤子不需要向其所對應的hook handler傳入任何參數。如果該鉤子對應的hook handler執行失敗,則該容器會被關閉,並根據該容器的重啟策略決定是否重啟該容器。
停止前處理(PreStop設定):是容器生命週期中的一種鉤子,該鉤子在容器終止前觸發,通常用於執行清理操作或優雅地關閉服務。其對應的hook handler必須在Kubernetes向容器發送終止訊號(如 SIGTERM)之前完成。無論hook handler的執行結果如何,一旦其完成,Kubernetes將向容器發送SIGTERM訊號以終止容器,並根據配置等待一段時間後強制移除容器。
優雅下線逾時設定(TerminationGracePeriodSeconds):其主要作用是為容器的優雅終止提供時間保障,確保應用能夠在被強制停止之前完成必要的清理和關閉操作。這不僅有助於提升系統的穩定性和可靠性,還能避免因強制終止導致的資料丟失、請求失敗和服務不可用等問題。結合 PreStop鉤子可以實現完整的優雅下線流程。
功能入口
操作入口在不同情境下有差異:
建立應用
登入SAE控制台,在左側導覽列選擇,然後選擇目標地區和目標命名空間,最後單擊建立應用。
在應用基本資料嚮導頁面進行配置後,單擊下一步:進階設定。
在進階設定頁面,找到並展開應用生命週期管理地區。
對正在啟動並執行應用進行變更
重新部署應用後,該應用將會被重啟。為避免業務中斷等不可預知的錯誤,請在業務低峰期執行部署操作。
登入SAE控制台,在左側導覽列選擇,然後選擇目標地區和目標命名空間,最後單擊目標應用程式名稱。
在目標應用的基礎資訊頁面,單擊部署應用。
在部署應用頁面,找到並展開應用生命週期管理地區。
對已停止的應用進行變更
登入SAE控制台,在左側導覽列選擇,然後選擇目標地區和目標命名空間,最後單擊目標應用程式名稱。
在目標應用的基礎資訊頁面,單擊修改應用配置。
在修改應用配置頁面,找到並展開應用生命週期管理地區。
操作步驟
在應用生命週期管理地區,按需配置啟動後處理(PostStart設定)、停止前處理(PreStop設定)和優雅下線逾時設定(TerminationGracePeriodSeconds)。
建議您把三者全部進行配置,以實現容器完整的生命週期管控閉環,保障服務平滑啟停、資源有序釋放及業務零中斷。
啟動後處理(PostStart設定)
在應用生命週期管理地區的啟動後處理(PostStart設定)頁簽配置PostStart。
SAE提供了兩種不同的Shell解譯器可供您選擇,分別是:
>_ /bin/sh
>_ /bin/bash
例如應用啟動前,需要將Hello from the postStart handler內容寫入/usr/share/message檔案。
在生產環境中,請根據實際業務情境進行配置。本文提供的樣本僅為最小化驗證配置功能可用性,不可直接用於生產環境。

結果驗證:
應用建立或重新部署完成後,使用Webshell進入應用執行個體的字元介面,查看/usr/share/message檔案是否存在並寫入了相應的內容。

停止前處理(PreStop設定)
在應用生命週期管理地區的停止前處理(PreStop設定)頁簽配置PreStop。
SAE提供了兩種不同的Shell解譯器可供您選擇,分別是:
>_ /bin/sh
>_ /bin/bash
例如在容器終止前執行Perform cleanup操作並將其寫入到/cleanup.log檔案中,然後等待100秒以便進行驗證。
在生產環境中,請根據實際業務情境進行配置。本文提供的樣本僅為最小化驗證配置功能可用性,不可直接用於生產環境。

結果驗證:
在應用的基礎資訊頁面,單擊停止應用,然後使用Webshell進入應用執行個體的字元介面,查看/cleanup.log檔案是否存在並寫入了相應的內容。

優雅下線逾時設定(TerminationGracePeriodSeconds)
在應用生命週期管理地區的優雅下線逾時設定(TerminationGracePeriodSeconds)頁簽配置優雅下線逾時時間。
如果您設定的優雅下線逾時時間小於容器優雅終止的時間(包括PreStop鉤子執行耗時和容器處理SIGTERM耗時),則在優雅下線逾時時間耗盡時強制終止(訊號名稱:SIGKILL,退出碼:137)容器,導致優雅終止流程中斷。例如容器優雅終止的時間為100秒,而設定的優雅逾時時間為60秒,那麼容器會在優雅終止之前被殺死。

結果驗證:
本樣本中,設定的優雅逾時時間小於容器優雅下線時間,以便結果驗證。
在應用的基礎資訊頁面,單擊停止應用,然後使用Webshell進入應用執行個體的字元介面,查看容器是否會報137的退出碼。
容器在優雅下線階段,容器會一直處於Terminating狀態,直到超過設定的優雅逾時時間。