检查到底报告了什么
健康检查是路由信号,不是诊断工具。它只回答一个问题:此刻这个实例是否应该接收流量?答案可能来自进程本身、来自依赖检查,也可能来自编排器对容器的观察,而每种来源的失效方式都不同。
三类检查
存活检查判断进程是否已经卡死、需要重启;就绪检查判断实例此刻能否提供服务;启动检查为慢启动进程争取时间,之后再启用存活检查。调用数据库或上游 API 的深度检查能验证真实能力,但会把你的路由决策绑定到别人的可用性上。
readinessProbe:
httpGet: { path: /ready, port: 8080 }
periodSeconds: 5
failureThreshold: 2
livenessProbe:
httpGet: { path: /live, port: 8080 }
periodSeconds: 10
failureThreshold: 6
让检查不要放大故障
检查应验证实例自己能控制的东西:事件循环、工作线程池、本地缓存是否可达。例如就绪检查可以确认数据库连接池还有可用连接,但存活检查绝不能因为数据库短暂不可达而失败,否则所有副本会一起重启,把一次故障放大成两次。超时时间必须小于探测周期,否则慢检查会被误判为进程卡死。
健康检查不等于监控
探测通过并不说明延迟、错误率或正确性没问题:服务可以很健康但毫无用处。保持探针轻量稳定,用 SLI 衡量真实行为。一旦探针依赖下游服务,下游的事故就会以整个集群的规模变成你的事故。
阈值怎么定
阈值应来自实测恢复时间,而不是沿用默认值。周期短能快速发现故障,但容易抖动;周期长能容忍毛刺,却会延迟摘除。还要对照发布节奏:如果一个探针要两分钟才能发现坏实例,滚动发布就会又慢又危险。