健康检查探针是容器编排系统的“守门员”,它决定了应用实例是继续服务还是被摘除重启,直接关系到整个集群的稳定性和可用性。 没有探针,编排工具就像蒙着眼睛开车,无法感知容器内部真正的健康状态,流量照常转发、故障持续累积,最终引发雪崩。
Kubernetes探针有哪些:存活、就绪、启动探针的功能分工
在Kubernetes(K8s)这个主流编排平台中,探针不是单一概念,而是由三种各司其职的机制组成,业内专家指出,理解这三者的区别是掌握容器健康管理的关键,它们统一通过kubelet在节点上执行,但触发动作完全不同。
存活探针:决定容器是否需要重启
存活探针(Liveness Probe)回答一个最基本的问题:这个容器还活着吗?如果检测失败,Kubelet会按照 restartPolicy 杀掉容器并重新创建,它主要用来捕获死锁、内存泄漏、后台进程挂死等“进程在但服务已不可用”的异常。
举个具体场景:一个Java应用由于长时间运行导致堆内存耗尽,JVM不会退出,但HTTP接口已经无法响应,如果没有存活探针,K8s会认为容器一切正常,流量继续涌入,用户请求全部超时,配置了存活探针后,连续几次探测失败就会触发重启,让应用恢复初始状态。
就绪探针:决定流量是否打入
就绪探针(Readiness Probe)解决的是“能不能接客”的问题,它检测成功后才把Pod的IP加入Service的Endpoints列表,否则摘除,这个操作不会重启容器,只是暂时隔离流量。
典型场景是应用启动时需要加载缓存或连接外部依赖,如果依赖的数据库暂时不可用,就绪探针会持续返回失败,Service就不会把新请求转发过来,直到依赖恢复,这种方式避免了“半死不活”的容器继续承受流量,是灰度发布和滚动更新中防止流量打到未就绪实例的核心手段。
启动探针:保护慢启动应用
启动探针(Startup Probe)是K8s 1.16之后引入的机制,专门照顾那些启动极慢的应用,比如需要加载大型模型或初始化大量数据的服务,它允许你在启动阶段配置更长的探测周期和更多的失败重试次数,一旦启动探针成功,存活探针便接管后续检查。
没有启动探针时,如果存活探针的 initialDelaySeconds 设得太短,一个需要两三分钟才能完成初始化的应用会在启动过程中就被反复杀掉,形成重启循环,有了启动探针,这个问题就迎刃而解。
容器健康检查探针配置方法:从yaml到命令行实操
想要让探针真正发挥作用,光知道概念不够,还得动手配置,下面从最常用的方式讲起,逐步到排障命令。
探针的三种检测方式
K8s支持三种探测机制,各有适用边界:
- HTTP请求:对容器IP的指定端口发送HTTP GET,只要返回码在200到399之间即视为健康,适合提供HTTP/REST API的应用,配置最直观。
- TCP连接:尝试与指定端口建立TCP连接,能连上就算健康,适合数据库、Redis等非HTTP服务,但对应用内部逻辑束手无策。
- Exec命令:在容器内执行一条自定义脚本或命令,退出码为0则成功,适合无法用HTTP/TCP表达的场景,比如检查特定文件是否存在、调用内部管理接口等。
配置中的常见参数
在Pod的 spec.containers 下,每个探针都支持一套通用参数,调参比选类型更考验经验:
initialDelaySeconds:容器启动后等待多久才开始第一次探测,给应用留出初始化时间。periodSeconds:两次探测的间隔,默认10秒,间隔越短发现故障越快,但开销也越大。timeoutSeconds:单次探测超时时间,默认1秒,如果应用响应慢,需要适当调大。failureThreshold:连续失败多少次才算异常,默认3次,避免偶发抖动触发重启。successThreshold:连续成功多少次才恢复健康,默认1次,用于就绪探针的恢复场景。
实操示例:给一个Nginx容器配置就绪和存活探针
以下是一个典型的部署片段,直接复制到yaml文件中即可验证:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
spec:
replicas: 2
selector:
matchLabels:
app: web-demo
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 2
配置完成后,可以用 kubectl describe pod 查看探针结果,事件里会出现
Liveness probe succeeded 或 Readiness probe failed 等记录,排障时,kubectl logs 可以看容器自身的日志,而 kubectl exec 进入容器手动跑一下探针命令,能快速区分是探针配置问题还是应用本身的问题。
容器编排工具对比:探针在K8s和Docker中的差异
很多人会把Docker的 HEALTHCHECK 指令和K8s探针混为一谈,但它们的定位和机制完全不同,Docker自身更像单机工具,而K8s是集群调度系统,探针的决策粒度天差地别。
| 对比维度 | Docker HEALTHCHECK | Kubernetes 探针 |
|---|---|---|
| 作用范围 | 单个容器 | Pod内的一个或多个容器 |
| 检测动作 | 执行自定义命令,不改变容器状态 | 根据类型触发重启或摘除流量 |
| 流量关联 | 不参与负载均衡 | 直接控制Service的后端成员 |
| 支持检测方式 | 仅Exec(由Dockerfile定义) | HTTP、TCP、Exec三种 |
| 失败处理 | 将容器标记为unhealthy,不自动重启 | 根据重启策略自动重启或隔离 |
如果你的应用只跑在Docker Compose环境,HEALTHCHECK 可以配合健康状态做服务依赖等待,比如用 depends_on 的 condition: service_healthy 控制启动顺序,但到了生产级集群,K8s探针的价值才真正体现出来它把健康检查结果上升到调度层,让整个集群的流量分配自动规避故障节点,不少团队问“容器编排工具选K8s还是Docker Swarm”时,探针机制的成熟度就是重要考量之一,K8s的精细化探针策略明显更胜一筹。
探针故障排查与最佳实践
配置探针只是开始,实际运维中会遇到各种奇怪现象,这里列出几个高频问题和对应的处理思路。
探针频繁失败但应用日志正常
这种情况多半是探针配置的路径或端口不对,或者应用的健康检查端点本身有缓存延迟,先去容器里手动执行探针命令,看返回值是否符合预期,如果命令正常但探针报错,检查 timeoutSeconds 是否太短应用在启动初期响应慢,超时设1秒容易误判。
就绪探针导致滚动更新卡住
滚动更新时,新Pod一直处于未就绪状态,旧Pod不销毁,部署卡在原地,先用 kubectl describe pod
看就绪探针的失败原因,常见的是新版本应用依赖的配置或服务没准备好,这时临时调整 initialDelaySeconds 或 failureThreshold 可以让流程先跑通,但根本解法是修复新版本的健康检查端点到自洽。
启动探针的最佳实践
行业共识认为,给所有需要加载外部资源的服务都配上启动探针是个好习惯,它的 failureThreshold periodSeconds 要大于应用的最坏启动时间,留出20%的余量,启动探针成功前,存活探针不会介入,所以两者之间不需要刻意同步。
探针与资源限制的耦合
如果容器设置了 resources.limits.cpu,但应用实际负载很高,CPU配额被压满时探针请求也可能被延迟响应,造成“资源过载导致探针失败,探针失败导致重启,重启后资源更紧张”的恶性循环,这种情况下需要区分是探针超时还是应用真死,适当调大 timeoutSeconds,并给关键服务预留更多CPU。
Q&A:健康检查探针常见疑问
容器健康检查探针配置方法中,initialDelaySeconds 设置多大合适?
没有统一标准,取决于应用启动时间,可以用 kubectl logs 观察应用打印的“ready to serve”时刻,再结合容器镜像的拉取耗时来推算,最稳妥的方式是先设置一个较大的值如30秒,观察启动过程无被杀后再逐步调小,用启动探针兜底慢启动场景。
k8s就绪探针和存活探针区别是什么?
就绪探针控制流量是否分发到该Pod,失败不会重启容器,只是从Service中摘除;存活探针控制容器是否存活,失败会触发重启,就绪探针适合管理依赖未就绪的临时状态,存活探针适合恢复卡死的进程,两者配合使用,先靠就绪探针挡住异常流量,再用存活探针清除顽固故障。
Docker容器的HEALTHCHECK指令能在K8s里复用吗?
不能直接复用,K8s会忽略Dockerfile中的 HEALTHCHECK,你需要单独在Pod的yaml中定义 livenessProbe 或 readinessProbe,不过你可以把 HEALTHCHECK 的检查命令改造成Exec探针的 command 字段,逻辑思路是相通的。
健康检查探针看似只是几十行配置,却是容器编排系统感知应用真实状态的唯一触角,把存活、就绪、启动三种探针搭配好,配合合理的参数和排障手段,你的集群才能在故障面前自动止血,而不是让一次小小的进程卡死演变成大面积服务不可用。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/622997.html





