一 先来介绍容器启动后钩子
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 " 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,这一点很重要,需要时刻牢记