Skip to content

antony@notes:~/kubernetes$ cat "K8s-實作應用程式零停機部署更新.md"

K8s 實作應用程式零停機部署更新

2025-05-24· kubernetes

K8s 實作應用程式零停機部署更新

1. 目標

在 Kubernetes 中 Pod 數量動態縮減(scale down)時,若該 Pod 仍有連線,則延遲其終止,直到所有連線結束後再移除該 Pod。

2. 實現方法

  • Readiness Probe:定期檢查應用是否準備好接收流量。當探針失敗時,Kubernetes 會將該 Pod 從 Service 的 endpoints 中移除,停止將新流量導向此 Pod。
  • PreStop Hook:在容器接收到終止信號(SIGTERM)前執行的命令。可用於執行清理工作,例如等待現有連線結束。
  • terminationGracePeriodSeconds:定義 Kubernetes 在強制終止容器前等待的時間。這段時間包括 PreStop Hook 的執行時間和容器關閉所需的時間。

3. 關鍵概念解釋

  1. PreStop Hook 的執行時機
    • 當 Kubernetes 決定終止一個 app container 時,會先執行該 app container 定義的 PreStop hook。
    • 這個 hook 不是非同步 執行的;也就是說,PreStop hook 完成之前,Kubernetes 不會發送 SIGTERM 信號給 app container 的主進程
  2. terminationGracePeriodSeconds 的作用
    • terminationGracePeriodSeconds 定義了 Kubernetes 在強制終止 app container 之前,給予 app container 的總寬限時間。
    • 這個時間包括了 PreStop hook 的執行時間以及 app container 在接收到 SIGTERM 信號後的關閉時間
  3. PreStop Hook 執行時間過長
    • 如果 PreStop hook 在執行時卡住或耗時過長,導致超過了 terminationGracePeriodSeconds 所設定的時間,Kubernetes 會強制終止 app container 。
    • 此時,Pod 的狀態會保持在 Terminating,直到寬限時間結束,Kubernetes 發送 SIGKILL 信號強制終止 app container 。

3.1. 舉例說明

假設你設定了:

  • terminationGracePeriodSeconds: 60(即 pod 要被強制刪除的寬限時間為 60 秒)
  • PreStop hook 執行時間為 55 秒
  • app container 在接收到 SIGTERM 信號後,需要 10 秒才能正常關閉

在這種情況下,總共需要 55(PreStop)+ 10( app container 關閉)= 65 秒,但 terminationGracePeriodSeconds 只有 60 秒。

因此,Kubernetes 會在 60 秒時強制終止 app container ,導致 app container 無法正常完成關閉流程。

3.2. 實務建議

  • 合理設定 terminationGracePeriodSeconds:確保這個值大於等於 PreStop hook 的執行時間加上 app container 關閉所需的時間。

4. 撰寫 Pod YAML