将处理程序附加到容器生命周期事件
此页面展示了如何将处理程序附加到容器生命周期事件。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 处理程序完成。容器的状态不会设置为 RUNNING,直到 postStart 处理程序完成。
Kubernetes 在容器终止前立即发送 preStop 事件。Kubernetes 对容器的管理会阻塞,直到 preStop 处理程序完成,除非 Pod 的宽限期过期。有关更多详细信息,请参阅 Pod 生命周期。