【K8S专题】深入浅出 Kubernetes 探针:存活、就绪与启动探针的原理与实战指南

news2026/4/10 7:45:53
深入浅出 Kubernetes 探针存活、就绪与启动探针的原理与实战指南一、 引言为什么我们需要探针二、 核心概念详解三大探针的角色定位1. 存活探针看门狗2. 就绪探针流量守门人3. 启动探针慢启动应用的救星三、 探针的实现机制与配置参数1. 三种探测方式2. 核心配置参数深度解析四、 实战演练Kubernetes YAML 配置详解1. 场景描述2. 完整 Deployment YAML 配置3. 配置解析与深度分析五、 Spring Boot 应用中的探针实现最佳实践1. 引入依赖2. 开启探针端点3. 自定义健康检查逻辑4. 针对慢启动应用的特殊处理六、 高级话题与常见误区1. 存活探针 vs 就绪探针混淆带来的灾难2. 探测端点的性能考量3. initialDelaySeconds 的陷阱4. 优雅关闭七、 总结一、 引言为什么我们需要探针在传统的虚拟机或物理机时代运维人员通常通过监控进程是否存在来判断服务的可用性。但在 Kubernetes 的微服务架构中容器内的进程“存活”并不等于服务“可用”。例如一个 Java 应用可能因为内存溢出OOM而进入假死状态进程依然存在但已经无法响应任何请求或者一个应用启动过程需要加载海量数据在未完成初始化前就接收流量必然导致业务报错。为了解决这些问题Kubernetes 引入了探针机制。探针是 Kubelet 对容器进行周期性健康检查的手段根据检查结果Kubelet 会决定重启容器或调整流量分发 [[1]][[2]]。正确配置探针是实现零停机部署、故障自愈和弹性伸缩的基石。二、 核心概念详解三大探针的角色定位Kubernetes 提供了三种不同类型的探针分别应用于容器生命周期的不同阶段。理解它们的区别是正确使用的前提。1. 存活探针看门狗定义与作用存活探针用于检测容器是否处于“运行”状态。如果存活探针探测失败Kubelet 会认为容器已经“死亡”并根据 Pod 的重启策略重启容器 [[3]][[4]][[5]]。核心逻辑探测成功容器正常运行无需干预。探测失败容器被杀死并根据restartPolicy重启。典型场景当应用程序陷入死锁、运行时异常导致线程池耗尽或内部状态不可恢复时存活探针可以触发重启使服务恢复。这是一种“毁灭后重生”的自愈机制。2. 就绪探针流量守门人定义与作用就绪探针用于检测容器是否准备好接收网络流量。如果探测失败Kubernetes 会将该 Pod 从对应的 Service 的 Endpoints 列表中移除停止向其发送流量直到探测成功为止 [[6]][[7]][[8]]。核心逻辑探测成功Pod 被加入到 Service 的负载均衡池中开始处理请求。探测失败Pod 从 Service 中移除流量被导向其他健康的 Pod。典型场景应用启动时需要加载配置、预热缓存或建立数据库连接池。在此期间应用进程已启动存活探针通过但尚不能处理业务。此时应配置就绪探针确保只有在完全准备就绪后才承接流量 [[9]]。此外当应用依赖的下游服务如数据库、Redis不可用时应用可能暂时无法提供服务此时可以通过让就绪探针失败来主动“屏蔽”自己防止流量进入导致错误。注意就绪探针的失败不会导致容器重启这是它与存活探针最大的区别。3. 启动探针慢启动应用的救星定义与作用启动探针是 Kubernetes 1.16 版本引入的特性专门用于处理启动时间较长的应用 [[10]][[11]]。它在容器启动初期优先执行只有当启动探针成功后存活探针和就绪探针才会开始工作 [[12]][[13]]。核心逻辑启动中启动探针接管检测。如果启动探针失败容器会被重启。启动完成启动探针成功后Kubernetes 停止执行启动探针转而开始执行存活探针和就绪探针。解决的问题对于大型 Java 应用、AI 模型服务或需要从磁盘加载大量数据的服务启动时间可能长达数分钟甚至更久。如果只配置存活探针为了避免误判必须将initialDelaySeconds初始延迟设置得非常大这会导致应用在运行期间真正发生故障时Kubernetes 需要等待很久才开始探测降低了故障恢复的灵敏度。启动探针通过“覆盖”启动阶段允许我们为启动过程配置一个较长的失败阈值同时保持存活探针的高灵敏度 [[14]][[15]]。三、 探针的实现机制与配置参数1. 三种探测方式无论是哪种探针Kubernetes 都支持以下三种探测方式 [[16]][[17]]Exec Action在容器内执行一条命令。如果命令退出码为 0则认为探测成功否则失败。适用场景检查文件是否存在、执行自定义脚本等。例如检查某个锁文件是否存在来判断服务状态 [[18]][[19]]。HTTP Get Action对容器的 IP 地址和指定端口及路径发起 HTTP GET 请求。如果响应状态码在 200-399 之间则认为探测成功。适用场景Web 服务应用。这是最常用的方式例如访问/health端点。TCP Socket Action尝试与容器指定端口建立 TCP 连接。如果连接成功则认为探测成功。适用场景非 HTTP 服务如数据库、Redis、MQTT 等。2. 核心配置参数深度解析探针的行为由一系列参数控制精细调整这些参数是实现最佳实践的关键 [[20]][[21]]。以下是详细参数说明参数名含义默认值最佳实践建议initialDelaySeconds容器启动后等待多少秒才开始探测。0对于无启动探针的场景需根据应用启动时间估算。有启动探针后可设较小值。periodSeconds探测的频率间隔秒数。10存活探针不宜过频避免增加负载就绪探针可稍快以响应状态变化。timeoutSeconds探测操作的超时时间。1如果应用响应慢需适当调大否则易误判。successThreshold探测失败后连续成功多少次才被认为“探测成功”。1存活/启动探针必须为 1。就绪探针可设为 2-3确保稳定后再接入流量。failureThreshold探测成功后连续失败多少次才被认为“探测失败”。3根据业务敏感度调整。启动探针通常设得很大以容忍慢启动。参数计算公式与调优逻辑最大启动时间计算对于启动探针最大允许的启动时间 failureThreshold×periodSeconds。例如设置failureThreshold: 30和periodSeconds: 10则应用最多有 300 秒的时间来完成启动之后才会被重启 [[22]]。灵敏度与误判平衡存活探针的failureThreshold设置过小可能导致网络抖动等瞬时故障引发不必要的重启设置过大则故障恢复慢。通常建议保持默认值 3配合timeoutSeconds合理设置。四、 实战演练Kubernetes YAML 配置详解下面我们通过具体的 YAML 配置示例展示如何组合使用这三种探针。1. 场景描述假设我们有一个名为my-app的微服务它具有以下特征需要加载配置文件并连接数据库启动耗时约 30-60 秒。提供 REST API健康检查端点为/actuator/health。如果进程死锁需要自动重启。如果数据库连接断开暂时不应接收流量但无需重启。2. 完整 Deployment YAML 配置apiVersion:apps/v1kind:Deploymentmetadata:name:my-app-deploymentspec:replicas:2selector:matchLabels:app:my-apptemplate:metadata:labels:app:my-appspec:containers:-name:my-app-containerimage:my-app:latestports:-containerPort:8080# 资源限制防止应用因资源饥饿而异常resources:limits:memory:512Micpu:500mrequests:memory:256Micpu:200m# 1. 启动探针配置# 解决慢启动问题给应用 5 分钟的启动时间窗口startupProbe:httpGet:path:/actuator/health/liveness# 仅检测进程存活port:8080initialDelaySeconds:10# 容器启动后 10s 开始检测periodSeconds:10# 每 10s 检测一次failureThreshold:30# 允许失败 30 次 (30 * 10s 300s 5分钟)# successThreshold: 1 # 默认为1启动成功一次即认为启动完成# 2. 存活探针配置# 应用启动后每 10s 检查一次若失败则重启livenessProbe:httpGet:path:/actuator/health/livenessport:8080# 注意有了 startupProbeinitialDelaySeconds 可以设为 0 或较小值# 因为 startupProbe 会阻塞 livenessProbe 的执行initialDelaySeconds:0periodSeconds:10timeoutSeconds:5failureThreshold:3successThreshold:1# 3. 就绪探针配置# 检查应用是否准备好处理业务如 DB 连接正常readinessProbe:httpGet:path:/actuator/health/readinessport:8080initialDelaySeconds:0periodSeconds:5# 就绪探针频率可稍高以便快速感知状态变化timeoutSeconds:3failureThreshold:1# 失败一次即切流保证业务不受影响successThreshold:1# 恢复成功一次即重新接入流量3. 配置解析与深度分析启动探针的保护作用在上述配置中startupProbe设置了failureThreshold: 30和periodSeconds: 10这意味着该应用有 300 秒的宽限期。在此期间如果/actuator/health/liveness返回非 200 状态码Kubernetes不会重启容器而是继续等待下一次探测。这有效避免了因应用启动慢而导致的频繁重启循环 [[23]][[24]]。探针协作流程Pod 启动容器创建。initialDelaySeconds(10s) 后startupProbe开始探测。如果在 300s 内某次探测成功startupProbe标记为成功并停止探测。此时livenessProbe和readinessProbe开始接管。livenessProbe每 10s 检查一次进程存活。readinessProbe每 5s 检查一次业务就绪状态。如果数据库连不上该端点返回 503Kubernetes 将该 Pod 从 Service 中剔除。端点分离示例中使用了/actuator/health/liveness和/actuator/health/readiness两个不同端点。这是 Spring Boot 的最佳实践将“进程存活”与“业务就绪”区分开来。readiness端点通常包含数据库、外部服务等依赖的健康检查而liveness端点仅检查应用本身的状态 [[25]][[26]]。五、 Spring Boot 应用中的探针实现最佳实践在现代微服务开发中Spring Boot 是主流框架。从 Spring Boot 2.3 开始官方提供了对 Kubernetes 探针的一流支持。我们可以通过 Actuator 轻松实现自定义的健康检查端点。1. 引入依赖首先在pom.xml中引入 Actuator 依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency2. 开启探针端点在application.properties或application.yml中配置# 开启健康检查端点 management.endpoints.web.exposure.includehealth # 开启 Kubernetes 探针支持 (Spring Boot 2.3 自动配置也可显式开启) management.endpoint.health.probes.enabledtrue # 显示详细的健康信息可选生产环境建议设为 never 或 when_authorized management.endpoint.health.show-detailsalways开启后Spring Boot 会自动暴露以下两个端点/actuator/health/liveness用于存活探针。/actuator/health/readiness用于就绪探针 [[27]][[28]]。3. 自定义健康检查逻辑虽然 Spring Boot 默认会检查磁盘空间等但业务往往有特定的健康指标。我们可以通过实现HealthIndicator接口来自定义逻辑。场景我们需要检查一个关键的外部服务ExternalService是否可用如果不通则标记为未就绪但不重启应用。步骤一编写自定义 Readiness 指示器我们可以利用 Spring Boot 的Health Groups机制将特定的健康检查归类到 Readiness 组中。importorg.springframework.boot.actuate.health.Health;importorg.springframework.boot.actuate.health.HealthIndicator;importorg.springframework.stereotype.Component;Component(externalServiceHealthIndicator)publicclassExternalServiceHealthIndicatorimplementsHealthIndicator{privatefinalExternalServiceClientexternalServiceClient;publicExternalServiceHealthIndicator(ExternalServiceClientexternalServiceClient){this.externalServiceClientexternalServiceClient;}OverridepublicHealthhealth(){try{// 尝试调用外部服务if(externalServiceClient.ping()){returnHealth.up().withDetail(message,External service is reachable).build();}else{returnHealth.down().withDetail(message,External service returned false).build();}}catch(Exceptione){returnHealth.down().withDetail(error,e.getMessage()).build();}}}步骤二配置健康组默认情况下自定义的HealthIndicator可能会被包含在主/actuator/health端点中但可能不会自动加入liveness或readiness组。我们需要明确配置 [[29]]。在application.properties中添加# 将自定义指示器加入 readiness 组 management.endpoint.health.group.readiness.includeexternalServiceHealthIndicator,db # 或者如果不想影响默认的 readiness 探测行为可以创建独立的组 # management.endpoint.health.group.customProbe.includeexternalServiceHealthIndicator重要提示存活探针不应包含外部依赖检查。如果存活探针因外部服务不可用而失败会导致应用不断重启这无助于解决问题反而可能加剧雪崩效应 [[30]]。因此我们通常将外部依赖检查放在就绪探针中。4. 针对慢启动应用的特殊处理对于 Spring Boot 应用如果启动时间较长例如初始化 Bean 很多我们可以利用ApplicationStartedEvent来控制就绪状态。但更推荐的方式是使用 Kubernetes 的Startup Probe。Spring Boot 应用本身代码无需改动只需在 K8s YAML 中配置startupProbe指向/actuator/health/liveness即可。这完美契合了“基础设施即代码”的思想将启动逻辑与业务逻辑解耦。六、 高级话题与常见误区1. 存活探针 vs 就绪探针混淆带来的灾难这是最常见的错误。很多开发者将所有健康检查逻辑包括 DB 连接都放在存活探针中。错误做法livenessProbe检查数据库连接。当数据库宕机时所有 Pod 的存活探针失败Pod 被强制重启。后果数据库尚未恢复Pod 重启依然失败导致无限重启循环。Pod 重启瞬间可能会消耗大量 CPU导致集群雪崩且原本可能的“优雅降级”服务也无法提供。正确做法Liveness仅检测应用内部状态如线程池状态、死锁检测、JVM 状态。Readiness检测应用处理请求的能力如 DB 连接、Redis 连接、依赖服务状态。结果DB 宕机 - Readiness 失败 - Pod 从 Service 移除 - 流量导向其他健康实例如有或返回 503 - Pod 保持运行不重启- DB 恢复 - Readiness 成功 - 流量恢复。2. 探测端点的性能考量探针的探测频率很高如每 10 秒一次如果健康检查端点逻辑复杂如执行大型 SQL 查询会严重影响应用性能。建议健康检查逻辑应尽可能轻量。对于依赖检查可以采用异步缓存机制。应用后台线程定期检查 DB 状态并更新内存变量健康检查端点只需读取该变量即可无需每次探测都发起真实的 DB 连接。3.initialDelaySeconds的陷阱如果没有配置启动探针initialDelaySeconds的设置非常棘手。设置太短应用未启动完就被重启设置太长故障响应不及时。解决方案优先使用startupProbe。配置startupProbe后livenessProbe和readinessProbe的initialDelaySeconds可以设为0或较小值因为startupProbe成功前它们不会执行。这极大地简化了配置 [[31]]。4. 优雅关闭当存活探针失败导致容器被杀死时Kubernetes 会发送SIGTERM信号。应用应捕获此信号进行资源清理如关闭数据库连接、完成未处理完的请求。Spring Boot 默认支持优雅关闭可通过server.shutdowngraceful配置。这与探针机制相辅相成共同保障服务的高可用。七、 总结Kubernetes 的探针机制是保障微服务稳定性的核心工具。通过本文的深入剖析我们可以总结出以下核心实践原则职责分离存活探针保“命”就绪探针保“流量”启动探针保“启动”。务必区分存活探针和就绪探针的职责切勿在存活探针中检查外部依赖。善用启动探针对于任何非瞬时启动的应用强烈建议配置启动探针以替代僵化的initialDelaySeconds实现更灵活的启动保护。精细化配置根据应用的实际启动时间、响应速度和业务敏感度调整periodSeconds、failureThreshold等参数。Spring Boot 集成利用 Spring Boot Actuator 提供的/actuator/health/liveness和/readiness端点结合HealthIndicator接口实现业务层面的健康检查是 Java 微服务的最佳实践。通过合理配置这三种探针我们可以让 Kubernetes 应用实现真正的“故障自愈”和“零停机更新”大幅提升系统的健壮性和用户体验。希望这篇博文能为你在 Kubernetes 探针的使用上提供详尽的指导和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2502162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…