容器生命周期钩子

    类似于许多具有生命周期钩子组件的编程语言框架,例如Angular,Kubernetes为容器提供了生命周期钩子。 钩子使容器能够了解其管理生命周期中的事件,并在执行相应的生命周期钩子时运行在处理程序中实现的代码。

    有两个钩子暴露在容器中:

    这个钩子在创建容器之后立即执行。 但是,不能保证钩子会在容器入口点之前执行。 没有参数传递给处理程序。

    在容器终止之前是否立即调用此钩子,取决于 API 的请求或者管理事件,类似活动探针故障、资源抢占、资源竞争等等。 如果容器已经完全处于终止或者完成状态,则对 preStop 钩子的调用将失败。 它是阻塞的,同时也是同步的,因此它必须在删除容器的调用之前完成。 没有参数传递给处理程序。

    有关终止行为的更详细描述,请参见终止 Pod

    容器可以通过实现和注册该钩子的处理程序来访问该钩子。 针对容器,有两种类型的钩子处理程序可供实现:

    • HTTP - 对容器上的特定端点执行 HTTP 请求。

    当调用容器生命周期管理钩子时,Kubernetes 管理系统在为该钩子注册的容器中执行处理程序。

    行为与 钩子的行为类似。 如果钩子在执行过程中挂起,Pod 阶段将保持在 Terminating 状态,并在 Pod 结束的 terminationGracePeriodSeconds 之后被杀死。 如果 PostStartPreStop 钩子失败,它会杀死容器。

    用户应该使他们的钩子处理程序尽可能的轻量级。 但也需要考虑长时间运行的命令也很有用的情况,比如在停止容器之前保存状态。

    钩子的寄送应该是*至少一次*,这意味着对于任何给定的事件,例如 或 PreStop,钩子可以被调用多次。 如何正确处理,是钩子实现所要考虑的问题。

    通常情况下,只会进行单次寄送。 例如,如果 HTTP 钩子接收器宕机,无法接收流量,则不会尝试重新发送。 然而,偶尔也会发生重复寄送的可能。 例如,如果 kubelet 在发送钩子的过程中重新启动,钩子可能会在 kubelet 恢复后重新发送。