将处理程序附加到容器生命周期事件

本页面展示了如何将处理程序附加到容器生命周期事件。Kubernetes 支持 postStart 和 preStop 事件。Kubernetes 在容器启动后立即发送 postStart 事件,并在容器终止前立即发送 preStop 事件。一个容器可以为每个事件指定一个处理程序。

准备工作

你需要有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在本教程中使用至少两个不作为控制平面主机的节点组成的集群。如果你还没有集群,你可以使用 minikube 创建一个,或者你可以使用这些 Kubernetes 操场之一。

要检查版本,请输入 kubectl version

定义 postStart 和 preStop 处理程序

在本练习中,你将创建一个包含一个容器的 Pod。该容器具有 postStart 和 preStop 事件的处理程序。

以下是 Pod 的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

在配置文件中,你可以看到 postStart 命令将一个 message 文件写入容器的 /usr/share 目录。preStop 命令优雅地关闭 Nginx。如果容器因故障而终止,这会很有帮助。

创建 Pod

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

验证 Pod 中的容器正在运行

kubectl get pod lifecycle-demo

进入 Pod 中运行的容器的 Shell

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 处理程序在容器的入口点被调用之前被调用。postStart 处理程序相对于容器的代码异步运行,但 Kubernetes 对容器的管理会阻塞,直到 postStart 处理程序完成。直到 postStart 处理程序完成,容器的状态才设置为 RUNNING。

Kubernetes 在容器终止前立即发送 preStop 事件。除非 Pod 的宽限期过期,否则 Kubernetes 对容器的管理会阻塞,直到 preStop 处理程序完成。有关更多详细信息,请参阅 Pod 生命周期

下一步

参考

最后修改于 2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 简码代替 code 简码 (e8b136c3b3)