Appearance
K8s 里只有两个生命周期钩子:
- postStart(容器启动后)
- preStop(容器停止前)
第一步:用最通俗的类比理解
我们把一个容器当成一个打工人:
- 打工人刚到公司坐下 → 刚上岗要做的事 = postStart
- 打工人下班要走之前 → 收尾、关电脑、交文件 = preStop
放到容器里就是:
- postStart:容器刚创建、刚跑起来,立刻执行的一段命令/脚本
- preStop:容器要被删掉、重启、下线了,在真正被杀死之前,执行的一段收尾操作
第二步:拆开讲,每个都讲「干什么 + 为什么要用 + 真实场景」
1)postStart:容器刚启动完,马上做的事
大白话解释
容器启动成功的一瞬间,K8s 会帮你自动跑一段命令。 它不是等主程序完全启动,而是和主程序差不多同时开始跑。
我们一般用它干嘛?
- 容器启动后,写一条日志,标记“我启动成功了”
- 把自己注册到服务发现(Nacos、Etcd、Consul)
- 初始化配置、下载配置文件
- 预热数据,让服务更快能访问
- 给主程序做一些前置准备
一个必须知道的坑
如果 postStart 里的命令执行失败了(比如报错、退出码不是0) → K8s 会认为:这个容器启动失败 → 直接重启容器
所以别在里面写死循环、别写会卡死的脚本。
2)preStop:容器要挂之前,先做收尾
大白话解释
当你执行 kubectl delete pod、节点要缩容、Pod 要重启时:
- K8s 先跑 preStop 脚本
- 等它跑完
- 再给容器主程序发停止信号
- 最后才杀掉容器
这才是运维最常用、最重要的功能:优雅停机
比如:
- Nginx 要下线了,先把正在处理的请求处理完,再关闭
- 微服务先从注册中心注销自己,别让新流量再进来
- 关闭数据库连接、MQ 连接,避免丢数据
- 保存临时状态、清理临时文件
关键限制(运维必记)
preStop 有时间限制: 默认只有 30 秒 30 秒内你没跑完,K8s 不等了,直接强制 kill 容器。
第三步:用一个最简单的 YAML 例子看懂
我拿 Nginx 举例,你一眼就能明白:
yaml
apiVersion: v1
kind: Pod
metadata:
name: hook-demo
spec:
containers:
- name: nginx
image: nginx
lifecycle:
# 启动后立刻执行
postStart:
exec:
command: ["/bin/sh", "-c", "echo 容器启动成功 > /start.log"]
# 停止前执行
preStop:
exec:
command: ["/usr/sbin/nginx", "-s", "quit"]- postStart:启动后生成一个日志文件
- preStop:关闭前执行
nginx -s quit,平滑关闭,不打断用户请求
第四步:一句话彻底总结
postStart = 容器刚开机,做初始化 失败会导致容器重启。
preStop = 容器要死之前,做优雅收尾 最多给你30秒,跑完再杀,保证业务不丢请求、不断开异常。