Kubernetes v1.33: 容器生命週期的更新
Kubernetes v1.33 對容器生命週期進行了一些更新。容器生命週期鉤子中的 Sleep 動作現在支援零休眠持續時間(該功能預設啟用)。此外,還提供了對容器終止時傳送的停止訊號進行自定義的 Alpha 支援。
這篇博文將詳細介紹容器生命週期的這些新特性,以及如何使用它們。
Sleep 動作的零值
Kubernetes v1.29 為容器的 PreStop 和 PostStart 生命週期鉤子引入了 Sleep
動作。Sleep 動作允許您的容器在啟動後或終止前暫停指定的時間。這對於提供一種直接的方式來管理優雅停機是必需的。在 Sleep 動作之前,人們通常在容器生命週期鉤子中使用 exec 動作執行 sleep
命令。如果您想這樣做,您需要容器映象中包含 sleep
命令的二進位制檔案。如果您使用的是第三方映象,這會很困難。
Sleep 動作最初新增時不支援零秒的休眠持續時間。Sleep 動作底層使用的 time.Sleep
支援零秒的持續時間。使用負值或零值進行休眠會立即返回,導致空操作。我們希望 Sleep 動作具有相同的行為。對零持續時間的支援後來在 v1.32 中新增,透過 PodLifecycleSleepActionAllowZero
功能門實現。
PodLifecycleSleepActionAllowZero
功能門已在 v1.33 中升級到 Beta 版,現在預設啟用。用於 preStop
和 postStart
鉤子的原始 Sleep 動作已從 Kubernetes v1.30 開始預設啟用。在執行 Kubernetes v1.33 的叢集中,您可以為 Sleep 生命週期鉤子設定零持續時間。對於預設配置的叢集,您無需啟用任何功能門即可實現此功能。
容器停止訊號
containerd 和 CRI-O 等容器執行時會遵循容器映象定義中的 StopSignal
指令。這可用於指定自定義停止訊號,執行時將根據該映象使用該訊號終止容器。停止訊號配置最初不是 Kubernetes Pod API 的一部分。直到 Kubernetes v1.33,覆蓋容器停止訊號的唯一方法是透過使用新的自定義停止訊號重新構建容器映象(例如,在 Containerfile
或 Dockerfile
中指定 STOPSIGNAL
)。
Kubernetes v1.33 中新增的 ContainerStopSignals
功能門將停止訊號新增到 Kubernetes API。這允許使用者在容器規範中指定自定義停止訊號。停止訊號作為新的生命週期(與現有的 PreStop 和 PostStart 生命週期處理程式一起)新增到 API 中。為了使用此功能,我們要求 Pod 的作業系統透過 spec.os.name
指定。這是為了我們可以對照作業系統交叉驗證停止訊號,並確保 Pod 中的容器使用 Pod 計劃到的作業系統的有效停止訊號建立。對於計劃在 Windows 節點上的 Pod,只允許使用 SIGTERM
和 SIGKILL
作為有效的停止訊號。有關 Linux 節點支援的訊號的完整列表,請參見此處。
預設行為
如果容器在其生命週期中定義了自定義停止訊號,容器執行時將使用生命週期中定義的訊號來終止容器,前提是容器執行時也支援自定義停止訊號。如果容器生命週期中沒有定義自定義停止訊號,執行時將回退到容器映象中定義的停止訊號。如果容器映象中沒有定義停止訊號,將使用執行時的預設停止訊號。containerd 和 CRI-O 的預設訊號都是 SIGTERM
。
版本偏差
為了使該功能按預期工作,Kubernetes 和容器執行時版本都應支援容器停止訊號。Kubernetes API 和 kubelet 的更改在 v1.33 中處於 alpha 階段,可以透過 ContainerStopSignals
功能門啟用。containerd 和 CRI-O 的容器執行時實現仍在進行中,並將很快推出。
使用容器停止訊號
要啟用此功能,您需要在 kube-apiserver 和 kubelet 中都開啟 ContainerStopSignals
功能門。一旦您擁有已開啟功能門的節點,您就可以建立帶有 StopSignal 生命週期和有效作業系統名稱的 Pod,如下所示
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
os:
name: linux
containers:
- name: nginx
image: nginx:latest
lifecycle:
stopSignal: SIGUSR1
請注意,此示例中的 SIGUSR1
訊號只能在容器的 Pod 計劃到 Linux 節點時使用。因此,我們需要將 spec.os.name
指定為 linux
才能使用該訊號。如果 Pod 計劃到 Windows 節點,您只能配置 SIGTERM
和 SIGKILL
訊號。如果 spec.os.name
欄位為 nil 或未設定,您也不能指定 containers[*].lifecycle.stopSignal
。
我如何參與?
此功能由 SIG Node 驅動。如果您有興趣幫助開發此功能、分享反饋或參與任何其他正在進行的 SIG Node 專案,請聯絡我們!
你可以透過多種方式聯絡 SIG Node
- Slack: #sig-node
- 郵件列表
- 開放的社群問題/PR
您也可以直接聯絡我
- GitHub: @sreeram-venkitesh
- Slack: @sreeram.venkitesh