kubernetes 为容器的生命周期准备了两个钩子,分别是 PostStart:在容器创建后立即执行,和 PreStop:在容器终止之前立即被调用。
其中 PostStart 虽然在容器创建后立即执行,但并不能保证钩子将在容器 ENTRYPOINT 之前运行,换句话说,使用 PostStart 钩子去做容器主进程启动前的准备工作是行不通的。
在这一点上我跟同事的看法有分歧,同事认为 PostStart 会挡住主进程的启动,所以用来做容器主进程启动前的准备工作是完全可以的。
时间紧迫无暇争论,于是准备了个实验来验证这件事,参考官方的例子,写了一个配置文件来定义一个 Pod:
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"]
文件中,定义主进程的行为是:
- 睡眠 5 秒;
- 输出”时间 + written by entrypoint“到文件 log.log;
- 继续睡眠。
定义 PostStart 钩子行为:
- 睡眠 10 秒;
- 输出”时间 + written by post start“到文件 log.log;
如果 PostStart 会阻挡 ENTRYPOINT 的启动,则日志文件内容应该是:
(时间点 T)written by post start
(时间点 T + 约 10 秒)written by entrypoint
否则内容应该是:
(时间点 T)written by entrypoint
(时间点 T + 约 5 秒)written by post start
开始实验,创建 Pod,然后进入容器查看 log.log 文件:
# kubectl create -f test-post-start.yaml
pod/test-post-start created
# kubectl exec -it test-post-start -- /bin/sh
/ # cat log.log
Sat Dec 15 08:39:53 UTC 2018 written by entrypoint
Sat Dec 15 08:39:59 UTC 2018 written by post start
/ #
可以看到,”written by entrypoint“ 在 ”written by post start“ 之前被写入,说明 PostStart 不会阻挡 ENTRYPOINT 的启动。
证毕。
评论加载中……
若长时间无法加载,请刷新页面重试,或直接访问。