深入Pod —— 生命周期 及 PreStop事件的应用
一、生命周期
lifecycle:
postStart: # 容创建完成后执行的动作,不能保证该操作一定在容器的 command 之前执行,一般不使用
exec: # 可以是 exec / httpGet / tcpSocket
command:
- sh
- -c
- 'mkdir /data'
preStop: # 在容器停止前执行的动作
httpGet: # 发送一个 http 请求
path: /
port: 80
exec: # 执行一个命令
command:
- sh
- -c
- sleep 9
二、流程
1、容器环境初始化阶段
0个或多个初始化容器来帮我们进行初始化,只能初始化容器执行完了才算初始化完成
2、钩子回调函数
postStart(),启动之前需要做什么,注意:一般不用这个,因为可能 容器中的command 和 postStart() 执行顺序无法保证,工作中如果启动前要做什么,就直接用初始化容器
3、Pod内的主容器
3.1、Startup 启动探针(最开始监控)
3.2、Readiness 就绪探针(最开始监控),启动成功就绪
3.3、Liveness 存活探针(持续监控),如果当前容器挂掉了,根据重启策略决定是否需要重启
4、钩子回调函数
preStop(),容器退出之前需要做什么,如:销毁,日志
三、Pod 退出流程(删除操作)
1、Endpoint 删除 pod 的 ip 地址
2、Pod 变成 Terminating 状态
pod 变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作。
配置参数:
# 作用与 pod 中的所有容器
terminationGracePeriodSeconds: 30
containers:
- xxx
3、执行 preStop 的指令
四、PreStop 的应用
如果应用销毁操作耗时需要比较长,可以在 preStop 按照如下方式进行配置
preStop:
exec:
command:
- sh
- -c
- 'sleep 20; kill pgrep java'
但是需要注意,由于 k8s 默认给 pod 的停止宽限时间为 30s,如果我们停止操作会超过 30s 时,不要光设置 sleep 50,还要将 terminationGracePeriodSeconds: 30 也更新成更长的时间,否则 k8s 最多只会在这个时间的基础上再宽限几秒,不会真正等待 50s