Files
kuboard-press/learning/k8s-intermediate/container/lifecycle-p.md
huanqing.shao b4a2a48480 Adsense
2019-10-12 20:01:03 +08:00

74 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
vssueId: 124
layout: LearningLayout
description: Kubernetes教程_Kubernetes 中支持容器的 postStart 和 preStop 事件本文阐述了如何向容器添加生命周期事件处理程序handler
meta:
- name: keywords
content: Kubernetes 教程,K8S 教程,容器生命周期
---
# 容器生命周期事件处理
<AdSenseTitle/>
> 参考文档: [Attach Handlers to Container Lifecycle Events](https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/)
Kubernetes 中支持容器的 postStart 和 preStop 事件本文阐述了如何向容器添加生命周期事件处理程序handler
* `postStart` 容器启动时Kubernetes 立刻发送 postStart 事件,但不确保对应的 handler 是否能在容器的 `EntryPoint` 之前执行
* `preStop` 容器停止前Kubernetes 发送 preStop 事件
## 前提
您已经有一个安装好的 Kubernetes 集群,并且可以通过 kubectl 访问该集群。请参考:
[安装Kubernetes单Master节点](/install/install-k8s.html)
## 定义postStart和preStop处理程序
下面的例子中,您将创建一个包含单一容器的 Pod并为该容器关联 postStart 和 preStop 处理程序handler。Pod 的yaml文件定义如下
<<< @/.vuepress/public/statics/learning/container/lifecycle.yaml
在该例子中请注意
* postStart 命令向 `usr/share/message` 文件写入了一行文字
* preStop 命令优雅地关闭了 nginx
> 如果容器碰到问题,被 Kubernetes 关闭,这个操作是非常有帮助的,可以使得您的程序在关闭前执行必要的清理任务
* 创建 Pod
``` sh
kubectl apply -f https://kuboard.cn/statics/learning/container/lifecycle.yaml
```
* 验证 Pod 中的容器已经运行:
``` sh
kubectl get pod lifecycle-demo
```
* 进入容器的命令行终端:
``` sh
kubectl exec -it lifecycle-demo -- /bin/bash
```
* 在命令行终端中,验证 `postStart` 处理程序创建的 `message` 文件:
``` sh
root@lifecycle-demo:/# cat /usr/share/message
```
输出结果如下所示:
```
Hello from the postStart handler
```
## 总结
Kubernetes 在容器启动后立刻发送 postStart 事件,但是并不能确保 postStart 事件处理程序在容器的 EntryPoint 之前执行。postStart 事件处理程序相对于容器中的进程来说是异步的同时执行然而Kubernetes 在管理容器时,将一直等到 postStart 事件处理程序结束之后,才会将容器的状态标记为 Running。
Kubernetes 在决定关闭容器时,立刻发送 preStop 事件,并且,将一直等到 preStop 事件处理程序结束或者 Pod 的 `--grace-period` 超时,才删除容器。请参考 [Termination of Pod](/learning/k8s-intermediate/workload/pod.html#termination-of-pods)
::: tip
Kubernetes 只在 Pod `Teminated` 状态时才发送 preStop 事件,这意味着,如果 Pod 已经进入了 `Completed` 状态 preStop 事件处理程序将不会被调用这个问题已经记录在 kubernetes issue [issue #55087](https://github.com/kubernetes/kubernetes/issues/55807)
:::