Docker KubernetesNotes

第 19 章:健康检查

zjc 于 2026-01-19 发布

这是《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

应用应:

  1. 处理 SIGTERM;
  2. 停止接收新请求;
  3. 等待存量请求完成;
  4. 关闭连接和线程池;
  5. 必要时释放锁。

本章小结

startup 解决慢启动,readiness 控制接流,liveness 处理不可恢复进程状态。健康检查应与应用生命周期和优雅停机一起设计。

思考题

  1. 为什么依赖故障通常不触发 liveness?
  2. readiness 如何影响 Endpoints?
  3. startupProbe 适合什么应用?
  4. 健康接口应该检查哪些内容?
  5. 优雅停机流程是什么?