首页/云/Kubernetes 速查/startupProbe 启动探针
调度与资源52 条

startupProbe 启动探针

为慢启动应用争取时间:启动探针通过前,liveness 与 readiness 都不执行;通过后移交常规探针。

Kubernetes 速查云更新于 2026-10-13

启动探针解决什么问题

startupProbe 是 Kubernetes 第三种探针,专门给启动慢的应用用。它未通过之前,liveness 与 readiness 都不执行,kubelet 只在启动探针的失败预算内反复探测;一旦通过就永久退出,之后交给常规探针。这样既不用把 initialDelaySeconds 调得很大,也能让启动期长达几分钟的应用不被 liveness 误杀。

基本信息

适用平台Kubernetes 1.16 起支持,1.18 转为正式可用,由 kubelet 执行
探测方式exec、httpGet、tcpSocket、grpc(1.24+)
关键字段failureThreshold、periodSeconds、timeoutSeconds、initialDelaySeconds
容忍上限约等于 failureThreshold × periodSeconds
生效顺序启动阶段只跑 startupProbe,通过后才开始 liveness 计时

典型使用场景

  • Java/Spring 容器冷启动一到三分钟,用启动探针覆盖整个启动窗口,不再猜 initialDelaySeconds
  • 数据库、消息中间件容器首次启动要回放日志或重建索引,启动耗时随数据量变化
  • 模型推理、数据服务首次加载大文件到内存,耗时不可预测
  • 存量应用迁移上云时只想兜住启动阶段,暂时不改 readiness 参数
  • 做成两段式判定:启动期宽松、运行期严格,避免两种诉求互相妥协

启动探针配置片段

启动探针配置片段
startupProbe:
  httpGet:
    path: /healthz
    port: 8080
  failureThreshold: 30   # 最多失败 30 次
  periodSeconds: 10      # 每 10 秒探测一次
  timeoutSeconds: 2      # 单次探测超时时间
livenessProbe:           # 启动探针通过后才开始计时
  httpGet:
    path: /healthz
    port: 8080
  periodSeconds: 10
  failureThreshold: 3

参数逐项读法

字段含义经验取值
failureThreshold启动期允许的失败次数按最慢一次启动耗时预留余量,别按平均值算
periodSeconds探测间隔5-10 秒;过密会放大 kubelet 与业务负担
timeoutSeconds单次探测超时要大于健康接口的最慢响应,默认 1 秒对慢接口偏紧
initialDelaySeconds首次探测延迟已有启动探针时通常留 0,避免两种机制叠加
容忍上限大致是 failureThreshold × periodSeconds。这个预算不只用于集群首次启动,滚动升级时新 Pod 的首次启动同样计时,所以取值要按「升级后首次启动」的最坏情况算。
启动探针最好只反映进程自身状态。如果它探测的接口依赖外部数据库或配置中心,外部故障会被判定成启动失败,容器反复重启反而加重故障。

易错点

  • 失败预算算得太小:大版本升级后首次启动变慢,容器被反复杀掉重来,应用日志里却看不到任何报错
  • 同时设置超大 initialDelaySeconds 和 startupProbe:两套机制重叠,出问题时无法解释到底谁在起作用
  • 启动探针与存活探针探测同一个依赖外部服务的接口:外部抖动导致两者同时失败,形成重启风暴
  • 改了失败次数却没调 timeoutSeconds:偶发慢响应被记为失败,预算被无谓消耗,启动窗口提前耗尽
  • 把启动预算当成容器总存活时间:它只覆盖启动阶段,运行期卡死仍然要靠存活探针兜底

数据来源与参考

  • Kubernetes 官方文档 · 启动探针
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌