首页/开发/CI/CD 与发布速查/启动探针(startupProbe)与慢启动应用
发布策略60 条

启动探针(startupProbe)与慢启动应用

为启动耗时长的应用设计的探针:startupProbe 成功之前,存活与就绪探针不会执行;成功一次后不再运行,让慢启动实例有充足的启动预算。

CI/CD 与发布速查开发更新于 2026-10-13

启动探针是什么

startupProbe 是 Kubernetes 为启动耗时长的应用设计的探针:在它成功之前,存活探针(livenessProbe)与就绪探针(readinessProbe)都不会执行;成功一次后启动探针不再运行,控制权交给存活与就绪探针。这让慢启动应用(JVM 预热、模型加载、数据校验)获得充足的启动预算,而不必为了怕被杀掉而给存活探针设巨大的 initialDelay。预算计算口径:failureThreshold × periodSeconds 约等于允许的启动时限,按 P99 启动时间加余量配置。

基本信息

预算计算failureThreshold × periodSeconds ≈ 启动时限
成功条件成功一次即移交就绪/存活探针
适用JVM 预热、模型加载、数据校验类启动
调优预算按 P99 启动时间加余量

典型使用场景

  • JVM 应用冷启动:Spring 等框架启动数十秒,给足预算避免误杀。
  • 模型服务:加载大模型权重耗时数分钟,启动探针兜住这段窗口。
  • 数据校验启动:启动时扫描数据完整性,耗时不定。
  • 滚动更新加速:就绪判定与启动解耦后,慢启动实例不再拖垮整个发布。
  • 崩溃循环排查:反复无法通过启动探针,说明启动本身有问题,看日志而不是放宽阈值掩盖。

启动探针

启动探针
startupProbe:
  httpGet: {path: /startup, port: 8080}
  failureThreshold: 60
  periodSeconds: 5   # 启动预算 300 秒
readinessProbe:
  httpGet: {path: /ready, port: 8080}
  periodSeconds: 5

三探针分工

探针回答问题失败后果
startupProbe还没启动完?继续等待,到达预算才重启
readinessProbe能接流量吗?从服务端点摘除
livenessProbe还活着吗?重启容器
有了启动探针,存活探针的 initialDelay 可以收紧,不必为了慢启动放宽容错。
启动探针与就绪探针要区分职责:启动完成不等于可以接流量,两个探针各自配置。
minReadySeconds 是另一层保险:要求 Pod 就绪后持续 N 秒才计入可用副本,适合「就绪完成仍要预热」的应用,它按秒拉长滚动更新节奏。
探针端点优先 httpGet 或 tcpSocket:exec 探针依赖容器内工具(curl、wget),精简镜像里命令缺失会让启动探针在启动期直接失败。

易错点

  • 启动预算小于真实启动时间:Pod 反复被杀,永远无法就绪,按 P99 加余量校准。
  • 只配启动探针没有就绪探针:刚启动完成的实例立即接入流量,预热不足导致首批请求失败。
  • 启动探针指向重量级接口:探针自身的探测成本拖慢启动,用轻量端点。
  • 失败阈值随意拍脑袋:预算与真实分布脱节,用启动耗时监控数据校准。
  • 把启动问题当探针问题:持续失败应先查启动日志与依赖,放宽阈值只是掩盖故障。

数据来源与参考

  • Kubernetes 文档《Configure Liveness, Readiness and Startup Probes》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌