当前位置: 首页 > news >正文

为什么需要启动探针(StartupProb)?

“k8s 1.16 版本后引入了启动探针(StartupProb),来应对某些应用程序启动慢的问题。这弥补了存活探针(LivenessProb)在这部分的不足。”

这句话要怎么理解呢?启动探针和存活探针的探针参数都是一样的(例如都有 initialDelaySeconds、periodSeconds 等),那为什么我们还需要启动探针呢?直接用存活探针不行吗?

这是由于它们的核心设计目标和行为逻辑存在本质差异,导致存活探针无法完全替代启动探针的配置。

启动探针应对应用程序启动慢问题

假设一个 Java 应用程序的启动需要 2 分钟,此时启动探针可做如下配置:

startupProbe:httpGet:path: /healthport: 8080successThreshold: 1failureThreshold: 30    # 允许最多 30 次失败periodSeconds: 10       # 每 10 秒探测一次 → 总容忍时间 = 30×10 = 300 秒(5 分钟)

可见,应用程序只要在 5 分钟的总容忍时间内启动了,则容器不会重启。

为什么不能通过调大存活探针参数模拟启动探针?

聪明的小伙伴可能想到了通过调大存活探针的初始化时间(initialDelaySeconds)来应对应用程序启动慢的问题,比如这样:

livenessProbe:initialDelaySeconds: 120  # 等待 2 分钟periodSeconds: 10successThreshold: 1failureThreshold: 3      # 总容忍时间 = 120 + 10×3 = 150 秒(2分半)

但是这样会有一个问题:如果应用程序因资源竞争、依赖延迟等原因导致启动时间偶尔超过 3 分钟,存活探针会立即失败并重启容器。可能导致容器进入不断重启的死循环

那又有聪明的小伙伴这样想了,我把 initialDelaySeconds 调到 600 秒,这样总不怕了吧!

livenessProbe:initialDelaySeconds: 600  # 等待 10 分钟periodSeconds: 10successThreshold: 1failureThreshold: 3      # 总容忍时间 = 600 + 10×3 = 630 秒(10分半)

是的,这样一来容器是启动成功了。可是如果本来只需要等待 2 分钟就能启动成功了,现在却要硬生生等 10 分钟?这合理吗?

那,我维持 initialDelaySeconds 不变,和启动探针一样,把 failureThreshold 调大!

livenessProbe:initialDelaySeconds: 120  # 等待 2 分钟periodSeconds: 10successThreshold: 1failureThreshold: 30      # 总容忍时间 = 120 + 10×30 = 420 秒(6分钟)

O(∩_∩)O哈哈,这下总可以了吧~

但这里就忽略了一件事:存活探针的生命周期是贯穿整个容器生命周期的。这意味着,只要容器还在,存活探针就一直在工作。而上面设置了 failureThreshold 为 30,这意味着如果容器内的应用程序出现了问题,那得失败整整 30 次,容器才被认为是不健康的,才会去重启!这会导致运行时故障响应延迟(直接影响服务可用性)。

因此,这种方案也不可取。

设计目的不同(职责分离)

  • 启动探针:容忍启动慢,为应用争取初始化时间。专注解决「启动阶段」的不确定性,参数可激进(如 periodSeconds=1, failureThreshold=30)。生命周期仅为启动阶段,不影响运行阶段健康检查的效率。

  • 存活探针:快速修复运行时故障,保障服务高可用性。专注解决「运行时」的稳定性,参数需保守(如 periodSeconds=10, failureThreshold=3)。生命周期为整个容器运行期间,会影响运行阶段健康检查的效率。

若混用参数,会导致两者都无法高效完成自身职责。

参考方案

startupProbe:httpGet:path: /health/startupport: 8080failureThreshold: 30   # 允许最多 30 次失败periodSeconds: 10      # 总容忍时间 = 30×10 = 300 秒(5 分钟)livenessProbe:httpGet:path: /health/runtimeport: 8080initialDelaySeconds: 0  # 启动探针成功后立即生效periodSeconds: 5        # 运行时每 5 秒检测一次failureThreshold: 3     # 连续失败 3 次后重启(15 秒内)

协作流程:

  1. 启动阶段
    • 启动探针每 10 秒检测一次,最多容忍 5 分钟。
    • 存活探针被屏蔽,不会执行。
  2. 启动成功后
    • 启动探针退出,存活探针接管,每 5 秒检测一次。
    • 若运行时健康检查失败,15 秒内触发容器重启。
  3. 启动失败
    • 启动探针在 5 分钟内未成功,触发容器重启。

相关文章:

  • 2845. 统计趣味子数组的数目
  • PMP-第六章 项目进度管理(二)
  • 2025年深圳杯数学建模(东三省)B题【颜色转换】原论文讲解
  • 给文件内容加行号
  • 十一岁少年叶珉雪用艺术点亮公益之路 个人原创公益演唱会传递大爱与担当
  • JVM 一文详解
  • 轻量级RTSP服务模块:跨平台低延迟嵌入即用的流媒体引擎
  • 自定义Dockerfile,发布springboot项目
  • STL之list容器
  • 探索 C++23 std::to_underlying:枚举底层值获取的利器
  • [方法论]软件工程中的设计模式:从理论到实践的深度解析
  • [Windows] Kazumi番剧采集v1.6.9:支持自定义规则+在线观看+弹幕,跨平台下载
  • leetcode0096. 不同的二叉搜索树-medium
  • 大型语言模型个性化助手实现
  • 深度学习经典网络之LeNet-5详解
  • 【BLE】【nRF Connect】 精讲nRF Connect自动化测试套件(宏录制、XML脚本)
  • 最大子段和 Java
  • 青少年编程与数学 02-018 C++数据结构与算法 24课题、密码学算法
  • JavaScript基础-流程控制概念
  • 第六章,BGP---边界网关协议
  • 视觉周刊|劳动开创未来
  • 特朗普考虑任命副幕僚长米勒任国安顾问,曾策划驱逐移民行动
  • 国防部新闻发言人就日本民用飞机侵闯中国钓鱼岛领空答问
  • 四人自驾游宣恩因酒店爆满无处住宿,求助文旅局后住进局长家
  • 中国海警局新闻发言人就日民用飞机侵闯我钓鱼岛领空发表谈话
  • 中央气象台:未来三天北方地区有大风沙尘,江南等地有强降水