Skip to content

K8s 里只有两个生命周期钩子:

  • postStart(容器启动后)
  • preStop(容器停止前)

第一步:用最通俗的类比理解 ​

我们把一个容器当成一个打工人:

  1. 打工人刚到公司坐下 → 刚上岗要做的事 = postStart
  2. 打工人下班要走之前 → 收尾、关电脑、交文件 = preStop

放到容器里就是:

  • postStart:容器刚创建、刚跑起来,立刻执行的一段命令/脚本
  • preStop:容器要被删掉、重启、下线了,在真正被杀死之前,执行的一段收尾操作

第二步:拆开讲,每个都讲「干什么 + 为什么要用 + 真实场景」 ​

1)postStart:容器刚启动完,马上做的事 ​

大白话解释 ​

容器启动成功的一瞬间,K8s 会帮你自动跑一段命令。 它不是等主程序完全启动,而是和主程序差不多同时开始跑。

我们一般用它干嘛? ​

  • 容器启动后,写一条日志,标记“我启动成功了”
  • 把自己注册到服务发现(Nacos、Etcd、Consul)
  • 初始化配置、下载配置文件
  • 预热数据,让服务更快能访问
  • 给主程序做一些前置准备

一个必须知道的坑 ​

如果 postStart 里的命令执行失败了(比如报错、退出码不是0) → K8s 会认为:这个容器启动失败 → 直接重启容器

所以别在里面写死循环、别写会卡死的脚本。


2)preStop:容器要挂之前,先做收尾 ​

大白话解释 ​

当你执行 kubectl delete pod、节点要缩容、Pod 要重启时:

  1. K8s 先跑 preStop 脚本
  2. 等它跑完
  3. 再给容器主程序发停止信号
  4. 最后才杀掉容器

这才是运维最常用、最重要的功能:优雅停机 ​

比如:

  • 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秒,跑完再杀,保证业务不丢请求、不断开异常。

用 VitePress 构建