存活与就绪的区别
**存活(liveness)**回答“这个进程是否需要重启”,只应检查进程本身和事件循环。**就绪(readiness)**回答“这个实例是否应接收流量”,可以检查数据库、缓存和必需的下游服务。
app.get('/healthz', (_req, res) => res.sendStatus(200));
app.get('/readyz', async (_req, res) => {
const ok = await withTimeout(checkDatabase(), 1000);
res.status(ok ? 200 : 503).json({ ready: ok });
});
步骤
- 添加不依赖外部服务的存活端点,避免数据库故障导致所有实例被重启。
- 添加就绪端点,以短超时检查关键依赖,不可用时返回 503。
- 为编排器配置正确的探针:启动慢时使用 startup probe,就绪检查用于从负载均衡中摘除实例。
- 在测试环境停止依赖,确认就绪失败而存活保持健康;恢复后确认就绪重新通过。
验证
/healthz在数据库宕机时仍返回 200。/readyz在数据库宕机时返回 503,恢复后返回 200。- 负载均衡停止向未就绪实例发送流量。
- 依赖故障不会导致健康进程被重启。
- 响应中不包含连接串、堆栈或用户数据。
限制
探针运行频繁,应使用轻量查询并短期缓存结果。健康检查不是授权机制,详细诊断应放在管理员访问之后。就绪检查只能验证可达性,不能证明查询结果正确。