本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
如果您精通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
状态,直到超过设置的优雅超时时间。