实验验证 kubernetes PostStart 钩子的执行时机

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"]

文件中,定义主进程的行为是:

  1. 睡眠 5 秒;
  2. 输出”时间 + written by entrypoint“到文件 log.log;
  3. 继续睡眠。

定义 PostStart 钩子行为:

  1. 睡眠 10 秒;
  2. 输出”时间 + 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 的启动。

证毕。

评论加载中……

若长时间无法加载,请刷新页面重试。