健康检查靠状态码说话
负载均衡、网关与 Kubernetes 无法直接理解业务状态,它们只能反复请求一个约定好的路径,再按 HTTP 状态码判断实例是否可用。因此健康接口的返回码就是运维契约:200 到 399 通常算健康,4xx 与 5xx 按探针配置分别处理。设计这个接口的关键是分清「进程活着」与「能对外提供服务」。
基本信息
| Kubernetes 探针 | httpGet 默认 200 到 399 视为成功,可用 successThreshold 与 failureThreshold 调整判定次数 |
|---|---|
| 负载均衡 | 多数要求 200;个别设备不接受 204,健康接口返回 204 可能被误判为不可用 |
| 探针类型 | liveness 决定是否重启、readiness 决定是否进入后端、startup 决定启动期宽限 |
| 响应体 | 探针只看状态码,正文应精简,避免每次探测都做重活 |
探针分工
| 探针 | 探测目标 | 失败后果 |
|---|---|---|
| liveness | 进程是否卡死 | 重启容器,连续失败会反复重启 |
| readiness | 是否能接收流量 | 从后端摘除,不重启 |
| startup | 应用是否启动完成 | 启动期内屏蔽 liveness 判定 |
| 网关主动检查 | 上游连通与响应时间 | 摘除节点或切主备 |
健康端点示例
健康端点示例
# 简单探活:进程能响应即可
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/healthz
# 就绪检查:关键依赖可用才返回 200
curl -s http://127.0.0.1:8080/readyz
# K8s 探针片段(httpGet 默认 200-399 成功)
# livenessProbe: { httpGet: { path: /healthz, port: 8080 }, periodSeconds: 10, failureThreshold: 3 }典型使用场景
- 容器编排里区分「重启」与「摘流量」,避免依赖抖动引发全量重启
- 负载均衡后端摘除:就绪检查探测数据库或下游连通性
- 灰度发布时用就绪状态控制新版本何时接流量
- 排查「实例一直不健康」:先手工请求探针路径,判断是网络问题还是依赖问题
liveness 探针里放重逻辑(全链路依赖检查)会造成「一挂全挂」:某个次要依赖抖动就让所有实例同时重启,故障被放大。liveness 只探自身,依赖检查放 readiness。
探针频率过高等于自己打的 DDoS:给健康接口设足够的超时与失败阈值,避免瞬时延迟直接触发摘除,形成反复摘挂的抖动。