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