1

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

 2 years ago
source link: https://blog.wolfogre.com/posts/kubernetes-post-start/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

2018/12/15.

Kubernetes 1.4k+ 4

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 的启动。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK