在 Kubernetes 中,生命周期钩子(Lifecycle Hooks) 是容器启动和终止时执行的自定义操作。它们允许你在容器的生命周期中插入“定制逻辑”,比如初始化、资源清理、通知外部系统等。
Kubernetes 为每个容器提供两个主要的生命周期钩子(hooks):
生命周期钩子 | 触发时机 | 作用示例 |
---|---|---|
postStart |
容器启动完成后立即 | 日志初始化、加载缓存、通知系统 |
preStop |
容器被终止前 | 优雅下线、关闭连接、清理资源等 |
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Container started at $(date) >> /var/log/start.log"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo Shutting down >> /var/log/shutdown.log && sleep 10"]
Pod 创建
└──> 容器启动
└──> postStart Hook
└──> 运行主进程
...
└──> SIGTERM (优雅终止)
└──> preStop Hook
└──> 容器停止
Hook 类型 | 应用场景 |
---|---|
postStart |
- 通知注册中心上线 - 初始化缓存 - 自定义日志记录 |
preStop |
- 通知下游服务断开连接 - 等待请求处理完毕 - 注销注册中心 |
exec
。postStart
会 阻塞容器运行(直到命令完成);若失败会导致容器崩溃。preStop
默认最多等待 30 秒(由 terminationGracePeriodSeconds
控制)。生命周期钩子 = 容器级别的定制启动/退出脚本,用于插入优雅上线、下线、清理、注册、通知等逻辑,是构建高可用服务的重要工具之一。
当容器被终止时,执行以下步骤:
preStop
实现优雅下线apiVersion: apps/v1
kind: Deployment
metadata:
name: graceful-shutdown-demo
spec:
replicas: 1
selector:
matchLabels:
app: graceful-demo
template:
metadata:
labels:
app: graceful-demo
spec:
terminationGracePeriodSeconds: 10 # 容器 SIGTERM 后有最多 10 秒来执行 preStop
containers:
- name: app
image: busybox
command: ["/bin/sh", "-c", "while true; do echo 'Running...'; sleep 5; done"]
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- |
echo "[preStop] Notifying external system..."
curl -X POST http://example.com/deregister -d 'pod=graceful-demo'
echo "[preStop] Waiting for in-flight requests to complete..."
sleep 5
字段/参数 | 含义 |
---|---|
preStop.exec.command |
容器内执行 shell 脚本,通知外部系统并等待 |
terminationGracePeriodSeconds |
容器被终止前最大等待时间(默认 30 秒) |
curl -X POST |
模拟通知外部系统(如服务注册中心) |
sleep 5 |
给上游时间处理关闭流程,确保不中断服务 |
postStart
和 preStop
的容器yaml
复制编辑
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
terminationGracePeriodSeconds: 15 # 为 preStop 提供充足时间
containers:
- name: demo-container
image: busybox
command: ["/bin/sh", "-c", "echo 'App running...'; sleep 3600"]
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- |
echo "[postStart] Initializing container..." >> /tmp/startup.log
date >> /tmp/startup.log
preStop:
exec:
command:
- /bin/sh
- -c
- |
echo "[preStop] Cleaning up before shutdown..." >> /tmp/shutdown.log
sleep 5 # 模拟等待资源释放或通知外部系统
postStart
/tmp/startup.log
记录“启动”信息和时间戳preStop
sleep 5
模拟清理或等待请求完成terminationGracePeriodSeconds
15s
时间完成 preStop
preStop
没完成,时间一到仍会强制终止容器