本页面展示了如何将处理程序附加到容器生命周期事件中。Kubernetes 支持 postStart 和 preStop 事件。当容器启动后,Kubernetes 会立即发送 postStart 事件;而在容器终止前,Kubernetes 会发送 preStop 事件。每个容器可以为每个事件指定一个处理程序。
你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。
要检查版本,请输入 kubectl version。
在本练习中,您将创建一个包含一个容器的 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 命令向容器的 /usr/share 目录写入了一个 message 文件。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 处理程序会在容器的入口点(Entrypoint)被调用之前执行。postStart 处理程序相对于容器的代码是异步运行的,但 Kubernetes 对容器的管理会阻塞,直到 postStart 处理程序完成。在 postStart 处理程序完成之前,容器的状态不会被设置为 RUNNING。
Kubernetes 在容器终止前立即发送 preStop 事件。Kubernetes 对容器的管理会阻塞,直到 preStop 处理程序完成,除非 Pod 的宽限期已过期。更多详细信息,请参阅 Pod 生命周期。