antony@notes:~/kubernetes$ cat "K8s-實作應用程式零停機部署更新.md"
K8s 實作應用程式零停機部署更新
K8s 實作應用程式零停機部署更新
1. 目標
在 Kubernetes 中 Pod 數量動態縮減(scale down)時,若該 Pod 仍有連線,則延遲其終止,直到所有連線結束後再移除該 Pod。
2. 實現方法
- Readiness Probe:定期檢查應用是否準備好接收流量。當探針失敗時,Kubernetes 會將該 Pod 從 Service 的
endpoints中移除,停止將新流量導向此 Pod。 - PreStop Hook:在容器接收到終止信號(SIGTERM)前執行的命令。可用於執行清理工作,例如等待現有連線結束。
- terminationGracePeriodSeconds:定義 Kubernetes 在強制終止容器前等待的時間。這段時間包括 PreStop Hook 的執行時間和容器關閉所需的時間。
3. 關鍵概念解釋
- PreStop Hook 的執行時機
- 當 Kubernetes 決定終止一個 app container 時,會先執行該 app container 定義的
PreStophook。 - 這個 hook 不是非同步 執行的;也就是說,在
PreStophook 完成之前,Kubernetes 不會發送SIGTERM信號給 app container 的主進程。
- 當 Kubernetes 決定終止一個 app container 時,會先執行該 app container 定義的
- terminationGracePeriodSeconds 的作用
terminationGracePeriodSeconds定義了 Kubernetes 在強制終止 app container 之前,給予 app container 的總寬限時間。- 這個時間包括了
PreStophook 的執行時間以及 app container 在接收到SIGTERM信號後的關閉時間
- PreStop Hook 執行時間過長
- 如果
PreStophook 在執行時卡住或耗時過長,導致超過了terminationGracePeriodSeconds所設定的時間,Kubernetes 會強制終止 app container 。 - 此時,Pod 的狀態會保持在
Terminating,直到寬限時間結束,Kubernetes 發送SIGKILL信號強制終止 app container 。
- 如果
3.1. 舉例說明
假設你設定了:
terminationGracePeriodSeconds: 60(即 pod 要被強制刪除的寬限時間為 60 秒)PreStophook 執行時間為 55 秒- app container 在接收到
SIGTERM信號後,需要 10 秒才能正常關閉
在這種情況下,總共需要 55(PreStop)+ 10( app container 關閉)= 65 秒,但 terminationGracePeriodSeconds 只有 60 秒。
因此,Kubernetes 會在 60 秒時強制終止 app container ,導致 app container 無法正常完成關閉流程。
3.2. 實務建議
- 合理設定
terminationGracePeriodSeconds:確保這個值大於等於PreStophook 的執行時間加上 app container 關閉所需的時間。
4. 撰寫 Pod YAML