PostStart
容器生命周期钩子(Container Lifecycle Hooks
)监听容器生命周期的特定事件,并在事件发生时
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: ["/usr/sbin/nginx","-s","quit"]
执行已注册的回调函数。支持两种钩子:
-
postStart
: 容器启动后执行,注意由于是异步执行,它无法保证一定在ENTRYPOINT之后运行。如果失败,容器会被杀死,并根据RestartPolicy决定是否重启 -
preStop
:容器停止前执行,常用于资源清理。如果失败,容器同样也会被杀死
而钩子的回调函数支持两种方式:
-
exec
:在容器内执行命令 -
httpGet
:向指定URL发起GET请求
关于postStart
异步执行测试
apiVersion: v1
kind: Pod
metadata:
name: test-post-start
spec:
containers:
- name: test-post-start-container
image: busybox
command: ["/bin/sh", "-c", "sleep 5 && echo $(date) 'written by entrypoint' >> log.log && sleep 600"]
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "sleep 10 && echo $(date) 'written by post start' >> log.log"]
创建上面的pod
,通过进入pod
,查看log.log
打印日志,证明:
- PostStart是否会挡住主进程的启动
- PostStart是否是异步执行
如果 PostStart 会阻挡 ENTRYPOINT 的启动,则日志文件内容应该是:
(时间点 T)written by post start
(时间点 T + 约 10 秒)written by entrypoint
否则内容应该是:
(时间点 T)written by entrypoint
(时间点 T + 约 5 秒)written by post start
```log
实验结果:
```log
/ # cat log.log
Thu Jun 4 06:14:50 UTC 2020 written by entrypoint
Thu Jun 4 06:14:55 UTC 2020 written by post start
修改YML
apiVersion: v1
kind: Pod
metadata:
name: test-post-start
spec:
containers:
- name: test-post-start-container
image: busybox
command: ["/bin/sh", "-c", "sleep 15 && echo $(date) 'written by entrypoint' >> log.log && sleep 600"]
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "sleep 10 && echo $(date) 'written by post start' >> log.log"]
如果 PostStart 不是异步执行,则日志文件内容应该是:
(时间点 T)written by entrypoint
(时间点 T + 约 5 秒)written by post start
```log
否则内容应该是:
```log
(时间点 T)written by post start
(时间点 T + 约 5 秒)written by entrypoint
实验结果:
[root@master k8s]# kubectl exec -it test-post-start sh
/ # cat log.log
Thu Jun 4 06:17:54 UTC 2020 written by post start
Thu Jun 4 06:17:59 UTC 2020 written by entrypoint
/ #
实验结论
- PostStart不会挡住主进程的启动
- PostStart是异步执行