kubernets之pod的生命周期容器启动后钩子以及容器结束前钩子

一 先来介绍容器启动后钩子

 

  1.1  容器启动后钩子,并不是容器启动之后才会执行的操作,而是在容器启动过程中,异步的和容器进行启动的一种钩子它有2种表现形式,包括我们后面提到的容器结束前钩子一样

    • 在一个容器内部执行一条命令
    • 或者向URL发起一个HTTP的get请求

    

  1.2  创建一个带有容器启动后钩子的pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-poststart-hook
spec:
  containers:
  - image: luksa/kubia
    name: luksa
    lifecycle:
      postStart:
        exec:
          command:
          - sh
          - -c
          - "echo 'hook will fail with exit code 20'; sleep 5; exit 20"
  • 这个钩子会在休眠5s之后,以退出码20的形式非0退出
  • 理论上由于这个钩子失败,这个pod最后也无法ready
  • 我们创建完之后,查看下这个pod的状态

  1.3  观察这个pod的事件以及pod的状态


   [root@node01 Chapter17]# k get po
     NAME READY STATUS RESTARTS AGE
     pod-with-poststart-hook 0/1 CrashLoopBackOff 1 2m7s

Events:
  Type     Reason               Age   From               Message
  ----     ------               ----  ----               -------
  Normal   Scheduled            32s   default-scheduler  Successfully assigned default/pod-with-poststart-hook to node02
  Normal   Pulling              30s   kubelet            Pulling image "luksa/kubia"
  Normal   Pulled               30s   kubelet            Successfully pulled image "luksa/kubia"
  Normal   Created              30s   kubelet            Created container luksa
  Normal   Started              30s   kubelet            Started container luksa
  Warning  FailedPostStartHook  24s   kubelet            Exec lifecycle hook ([sh -c echo 'hook will fail with exit code 20'; sleep 5; exit 20]) for Container "luksa" in Pod "pod-with-poststart-hook_default(24c143e9-606d-11eb-802a-5254002a5691)" failed - error: command 'sh -c echo 'hook will fail with exit code 20'; sleep 5; exit 20' exited with 20: , message: "hook will fail with exit code 20\n"
  Normal   Killing              24s   kubelet            FailedPostStartHook
  • 显示failedpoststarthook状态,应该是容器启动后钩子非0退出
  • 容器状态显示CrashLoopBackOff

 

二 容器停止前钩子介绍

  2.1  创建一个停止前钩子

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-prestop-hook
spec:
  containers:
  - image: luksa/kubia
    name: luksa
    lifecycle:
      preStop:
        httpGet:
          port: 8080
          path: shutdown
  • 停止前钩子的结果不会影响这个容器是否最后会被停止,但是会在事件中看到一个FailedPreStartHook的告警
  • 一个很不明智的做法是在停止前钩子上面将SIGTERM信息给容器进程,原因是正常的SIGTERM信息没有被容器进程正确的接收到,其实真正的原因是在启动容器的时候开发者用了shell形式,这种形式会将应用交给shell管理,然后shell接收到这个SIGTREM,但是容器进程没有正确接收这个信息,所以正确的做法是使用exec的形式,而不是shell形式
  • 这些钩子针对的对象是容器而不是pod,这一点很重要,需要时刻牢记
posted @ 2021-01-27 16:35  伊铭(netease)  阅读(978)  评论(0编辑  收藏  举报