1、lifecycle的声明
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "sleep 100"]
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 100"]
2、poststart
容器创建后立即执行,主要用于资源部署、环境准备等
2.1 时序
当前container创建后发送钩子命令
发送后:
- pod是pending状态
- container是waiting状态
执行完成后: - 执行成功:pod会变为running状态,这时会被分配IP
- 执行失败:容器重启,如果poststart执行完之前container退出也会重启
2.2 command&args 与 postart 优先级
没有优先级关系,基本会同时执行
3、prestop
容器终止之前立即被调用。主要用于优雅关闭应用程序、通知其他系统等
3.1 时序
触发kill pod:
- 执行prestop钩子
- terminationGracePeriodSeconds计时
- pod状态变为terminating
在terminationGracePeriodSeconds时间内:prestop执行,执行完成后,向 pod 发送SIGTERM信号,pod将会进行业务进程停止过程;如果执行失败,event中会看到报错
超出terminationGracePeriodSeconds时间:杀死容器
在某些极端情况下,Pod 被删除的一小段时间内,仍然可能有新连接被转发过来,因为 kubelet 与 kube-proxy 同时 watch 到 Pod 被删除,kubelet 有可能在 kube-proxy 同步完规则前就已停止容器,这时可能导致一些新的连接被转发到正在删除的 Pod,而通常情况下,当应用收到 SIGTERM 后都不再接受新连接,只保持存量连接继续处理,因此可能导致 Pod 删除的瞬间部分请求失败。
针对上述情况,可以利用 preStop 先 sleep 短暂时间,等待 kube-proxy 完成规则同步再开始停止容器内进程。
参考:https://www.tencentcloud.com/zh/document/product/457/42069
4、题外话:
command&args 与 dockerfile中entrypoint&cmd关系
一一对应,container中的优先级高于dockerfile中优先级