在 Kubernetes 中,服务的稳定运行不仅依赖强大的调度系统,也离不开对容器健康状态的持续监测。而存活探针(Liveness Probe) ,正是实现自动故障检测与恢复的关键工具,它是让系统"自愈"的第一道防线。
本文将带你全面理解存活探针的工作机制、配置方式、使用场景及常见误区,助你打造更健壮的云原生应用。
一、存活探针是什么?
存活探针是 Kubernetes 用来检测容器是否处于"活着"的状态的一种健康检查方式。
简单来说:
- 如果探测通过,K8s 认为容器是健康的,什么也不做;
- 如果探测失败达到指定次数,K8s 会自动重启容器,以期让它恢复正常。
它是容器层级的"心跳检测",通过判断应用是否"挂死"来执行自我修复操作,确保服务不中断。
二、为什么需要存活探针?
很多人以为容器运行状态为 "Running" 就代表服务没问题,其实这远远不够。下面几个典型问题,K8s 默认是感知不到的:
- 服务出现死循环或线程阻塞;
- 内部连接池耗尽,应用假死;
- 核心逻辑卡死但进程仍存活;
- 某次初始化异常导致无法响应请求;
这些问题不会导致容器直接退出(exit),但服务已经不可用。这时,存活探针就派上用场了------一旦探测失败,K8s 就会自动重启容器,相当于"拉闸重启",帮助应用自我修复。
三、配置方式详解
Kubernetes 支持三种类型的存活探针:
类型 | 描述 |
---|---|
HTTP GET | 向指定端口和路径发起 HTTP 请求,返回 2xx 或 3xx 认为健康 |
TCP Socket | 尝试建立 TCP 连接,连接成功即健康 |
Exec | 在容器中执行指定命令,返回码为 0 认为成功 |
YAML 示例:
yaml
yaml
复制编辑
livenessProbe:
httpGet:
path: /healthz/live
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3
字段解释:
initialDelaySeconds
:容器启动后,延迟多久开始探测;periodSeconds
:探测之间的时间间隔;timeoutSeconds
:每次探测的超时时间;failureThreshold
:连续探测失败多少次才算真正失败并重启;successThreshold
:只用于就绪探针,这里不需要。
注意 :存活探针失败后,Pod 不会被删除,而是只重启容器本身。
四、典型使用场景
1. 防止假死服务长时间挂着
Java 或 Node.js 应用容易出现线程死锁或事件循环卡死,此时进程还在,但服务已经不能响应。存活探针能有效发现并重启容器。
2. 服务依赖组件故障
服务依赖的下游服务(如数据库、缓存)不可用,导致自身功能瘫痪,可以通过存活探针及时重启以尝试恢复连接。
3. 内存泄漏自动修复
一些历史系统存在内存泄漏问题,长时间运行会卡死。设置存活探针配合资源限制,可以让服务在内存爆掉前自动重启,保证稳定运行。
五、实战建议
✅ 设置合适的探针参数
initialDelaySeconds
建议根据应用启动时间设定,防止启动阶段误判;failureThreshold
不宜过低,防止网络抖动或短时压力导致频繁重启;timeoutSeconds
过短容易误判,建议设置为 2~5 秒;
✅ 使用独立健康检查接口
避免将业务接口作为探针,防止探针请求干扰正常服务负载,最好提供 /healthz/live
这类轻量级专用路径。
✅ 配合 Prometheus 监控探针状态
探针失败是服务出现问题的早期信号,可以结合 Prometheus 监控相关 metrics,如 kube_pod_container_status_restarts_total
。
六、常见误区解析
❌ 误区一:用 exec 执行复杂命令
有些开发者喜欢用 exec
执行 shell 脚本进行多种检查,但这会消耗较多资源,不推荐用于高频健康检查。
❌ 误区二:混用探针接口
将存活和就绪探针共用一个接口容易造成冲突。建议分离接口职责,分别实现 /healthz/live
和 /healthz/ready
。
❌ 误区三:容器重启次数暴增被忽视
频繁的探针失败重启很容易掩盖问题本质,应结合日志和 metrics 找出根因。
七、与就绪探针的区别
探针类型 | 检查内容 | 失败后处理方式 |
---|---|---|
Liveness | 容器是否挂掉 | 重启容器 |
Readiness | 是否可对外服务 | 临时摘出 Service,不重启容器 |
两个探针通常配合使用,缺一不可。
八、总结
存活探针是 Kubernetes 实现容器"自愈"的关键机制。通过合理配置,它可以帮助我们及时发现并修复挂死、假死等难以察觉的服务问题,让整个系统更健壮、更具容错能力。
如果你还没为你的服务配置存活探针,那就像把汽车开上高速却没装安全气囊。赶紧检查你的 Deployment 配置吧,让你的服务更有"韧性"。