pod优雅终止
概念:当一个pod需要被终止时,系统会给予一定的时间窗口让pod内的应用程序完成正在处理的任务并安全地关闭,而不是立即强制终止。这样可以避免因突然终止而导致的数据丢失或服务中断
1. 发送终止信号:
- 当一个 pod 被删除或终止时,Kubernetes 首先会向 pod 中的容器发送一个
TERM
信号(SIGTERM),通知它们即将被终止。
2. 等待终止宽限期:
- 接收到
TERM
信号后,容器有一定的时间来执行清理工作,如保存状态、完成当前请求等。这个时间由terminationGracePeriodSeconds
(终止宽限期) 参数指定,默认为 30 秒。
3 .容器的优雅终止:
- 容器在收到
SIGTERM
后应尽快处理未完成的任务,然后自行退出。如果在terminationGracePeriodSeconds
内容器未能自行退出,Kubernetes 会发送KILL
信号(SIGKILL),强制终止容器。
4. 停止接收流量:
- 在发出
TERM
信号后,Kubernetes 会停止向该 pod 路由新的请求。对于使用服务(Service)的 pod,这个过程可能会涉及从负载均衡器中移除 pod 的地址。
5. 清理资源:
- 当所有容器都终止后,Kubernetes 将从集群中移除 pod,并释放与其相关的所有资源(如网络、存储等)。
lifecycle定义pod生命周期
postStart
是在容器创建后执行的钩子函数,执行的时机是在容器启动后,用户定义的进程开始运行之前。常见的使用场景包括但不限于:
-
初始化任务:例如,为容器中的应用程序创建配置文件或数据库表
-
设置环境:为容器的应用程序准备环境,如初始化网络、存储或依赖服务
-
健康检查:执行容器启动前的自定义健康检查
如果 postStart
钩子执行成功,容器进程才会正常启动。如果钩子执行失败,容器将被标记为启动失败,并且 Kubernetes 会按照重启策略进行处理。postStart
钩子可以是同步或异步的。如果是同步的,它会阻塞容器的主进程直到钩子执行完毕。如果是异步的,容器的主进程将在钩子执行过程中启动
关键配置如下:
# 启动前做什么事
lifecycle:postStart:exec:command: - "/bin/sh"- "-c"- "sleep 10;echo \"postStart at $(date +%F_%T)\" >> /data/postStart.log"# 删除前做什么事,注意不要超过期限,否则对应命令无法执行成功preStop:exec:command: - "/bin/sh"- "-c"- "sleep 15;echo \"preStop at $(date +%F_%T)\" >> /data/preStop.log"
1.完整配置文件:
apiVersion: v1
kind: pod
metadata:name: lifecycle-poststart-prestop-001
spec:volumes:- name: datahostPath:path: /zhiyong18-linux# 在pod优雅终止时,定义延迟发送kill信号的时间,此时间可用于pod处理完未处理的请求等状况。# 默认单位是秒,若不设置默认值为30s。terminationGracePeriodSeconds: 3containers:- name: c1image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1volumeMounts:- name: datamountPath: /data# 定义容器的生命周期。lifecycle:# 容器启动之后做的事情postStart:exec:command: - "/bin/sh"- "-c"- "sleep 10;echo \"postStart at $(date +%F_%T)\" >> /data/postStart.log"# 容器停止之前做的事情preStop:exec:command: - "/bin/sh"- "-c"- "sleep 15;echo \"preStop at $(date +%F_%T)\" >> /data/preStop.log"
2.创建和删除pod之后会留下2个文件
[root@worker232zhiyong18-linux]# cat /zhiyong18-linux/postStart.log
postStart at 2024-09-27_14:26:54
[root@worker232zhiyong18-linux]# cat /zhiyong18-linux/preStop.log
preStop at 2024-09-27_14:27:07