这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 健康检查决定容器何时可接流、何时重启、何时从 Service 摘除。配置过松会放大故障,过紧会造成误杀。
19.1 探针类型
| 探针 | 作用 |
|---|---|
| livenessProbe | 失败后重启容器 |
| readinessProbe | 失败后摘除 Service 流量 |
| startupProbe | 启动成功前暂停其他探针 |
19.2 示例
containers:
- name: app
image: shop/order-service:1.2.0
startupProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
failureThreshold: 30
periodSeconds: 2
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3
19.3 探针方法
httpGet:
path: /healthz
port: 8080
tcpSocket:
port: 5432
exec:
command: ["pg_isready", "-U", "app"]
HTTP 最常用;TCP 只能证明端口监听;exec 可表达复杂检查但开销更高。
19.4 liveness 与 readiness
| 场景 | 建议 |
|---|---|
| 依赖数据库不可用 | readiness 失败,不随便 liveness 重启 |
| 死锁 | liveness 重启 |
| 冷启动慢 | startupProbe |
| 队列消费暂停 | readiness 摘除消费者 |
| 只读依赖慢 | readiness 可返回失败 |
不要让 liveness 检查所有外部依赖,否则依赖故障会引发全量重启风暴。
19.5 常见配置错误
| 错误 | 后果 |
|---|---|
| 无 readiness | 未就绪 Pod 接流量 |
| liveness 检查依赖 | 连锁重启 |
| timeout 太短 | 高峰误杀 |
| failureThreshold 太小 | 瞬时抖动重启 |
| 健康接口无超时 | 探针挂起 |
| 健康接口有副作用 | 高频调用影响业务 |
19.6 优雅停机
terminationGracePeriodSeconds: 30
应用应:
- 处理 SIGTERM;
- 停止接收新请求;
- 等待存量请求完成;
- 关闭连接和线程池;
- 必要时释放锁。
本章小结
startup 解决慢启动,readiness 控制接流,liveness 处理不可恢复进程状态。健康检查应与应用生命周期和优雅停机一起设计。
思考题
- 为什么依赖故障通常不触发 liveness?
- readiness 如何影响 Endpoints?
- startupProbe 适合什么应用?
- 健康接口应该检查哪些内容?
- 优雅停机流程是什么?