website/content/zh-cn/docs/tasks/configure-pod-container/attach-handler-lifecycle-ev...

6.1 KiB
Raw Permalink Blame History

title content_type weight
为容器的生命周期事件设置处理函数 task 180

这个页面将演示如何为容器的生命周期事件挂接处理函数。Kubernetes 支持 postStart 和 preStop 事件。 当一个容器启动后Kubernetes 将立即发送 postStart 事件;在容器被终结之前, Kubernetes 将发送一个 preStop 事件。容器可以为每个事件指定一个处理程序。

{{% heading "prerequisites" %}}

{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}

定义 postStart 和 preStop 处理函数

在本练习中,你将创建一个包含一个容器的 Pod该容器为 postStart 和 preStop 事件提供对应的处理函数。

下面是对应 Pod 的配置文件:

{{% code_sample file="pods/lifecycle-events.yaml" %}}

在上述配置文件中,你可以看到 postStart 命令在容器的 /usr/share 目录下写入文件 message。 命令 preStop 负责优雅地终止 nginx 服务。当因为失效而导致容器终止时,这一处理方式很有用。

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/lifecycle-events.yaml

验证 Pod 中的容器已经运行:

kubectl get pod lifecycle-demo

使用 shell 连接到你的 Pod 里的容器:

kubectl exec -it lifecycle-demo -- /bin/bash

在 shell 中,验证 postStart 处理函数创建了 message 文件:

root@lifecycle-demo:/# cat /usr/share/message

命令行输出的是 postStart 处理函数所写入的文本:

Hello from the postStart handler

讨论

Kubernetes 在容器创建后立即发送 postStart 事件。 然而postStart 处理函数的调用不保证早于容器的入口点entrypoint 的执行。postStart 处理函数与容器的代码是异步执行的,但 Kubernetes 的容器管理逻辑会一直阻塞等待 postStart 处理函数执行完毕。 只有 postStart 处理函数执行完毕,容器的状态才会变成 RUNNING。

Kubernetes 在容器结束前立即发送 preStop 事件。除非 Pod 宽限期限超时, Kubernetes 的容器管理逻辑会一直阻塞等待 preStop 处理函数执行完毕。 更多细节请参阅 Pod 的生命周期

{{< note >}}

Kubernetes 只有在一个 Pod 或该 Pod 中的容器结束Terminated 的时候才会发送 preStop 事件, 这意味着在 Pod 完成Completed 时 preStop 的事件处理逻辑不会被触发。有关这个限制, 请参阅容器回调了解详情。 {{< /note >}}

{{% heading "whatsnext" %}}

参考

  • [Lifecycle](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#lifecycle-v1-core)
  • [Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core)
  • 参阅 [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) 中关于 terminationGracePeriodSeconds 的部分