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

6.0 KiB
Raw Blame History

title content_template weight
为容器的生命周期事件设置处理函数 templates/task 140

{{% capture overview %}}

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

{{% /capture %}}

{{% capture prerequisites %}}

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

{{% /capture %}}

{{% capture steps %}}

定义 postStart 和 preStop 处理函数

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

下面是对应 Pod 的配置文件

{{< codenew 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

{{% /capture %}}

{{% capture discussion %}}

讨论

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

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

{{< note >}} Kubernetes 只有在 Pod 结束Terminated 的时候才会发送 preStop 事件,这意味着在 Pod 完成Completed 时 preStop 的事件处理逻辑不会被触发。这个限制在 issue #55087 中被追踪。 {{< /note >}}

{{% /capture %}}

{{% capture 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 的部分

{{% /capture %}}