3. 健康检查核心概念:健康检查的目的、存活检查与就绪检查的区别、探针机制

健康检查是蓝绿发布与门禁系统中最核心的决策依据。没有健康检查,流量切换就是盲人摸象。本节从目的出发,厘清存活检查与就绪检查的本质差异,并深入探针机制的工作原理。

3.1 健康检查的目的

健康检查的根本目标是判断服务实例是否具备处理请求的能力。在蓝绿发布场景中,健康检查直接决定门禁是否放行流量切换。具体目的包括:

  • 故障检测:快速发现进程崩溃、死锁、内存溢出等致命问题。
  • 流量保护:避免将用户请求路由到尚未就绪或正在退出的实例。
  • 自动恢复:触发容器编排系统(如 Kubernetes)重启异常实例。
  • 发布验证:在蓝绿切换前确认新版本集群全部健康,防止有损发布。
关键原则:健康检查必须轻量、快速、准确。过重的检查(如全量数据库查询)会拖垮系统;过松的检查(仅检测进程存在)会漏掉真实故障。

3.2 存活检查(Liveness)与就绪检查(Readiness)的区别

这两类检查是健康检查体系的两大支柱,但关注点完全不同。下表从多个维度进行对比:

对比维度 存活检查(Liveness) 就绪检查(Readiness)
核心目的 判断进程是否活着,是否需要重启 判断服务是否准备好接收流量
失败后果 容器/实例被重启 实例从负载均衡池中移除,不接收新请求
检查内容 进程存活、基础端口可达、无死锁 依赖服务可用、缓存预热完成、业务接口正常
检查频率 通常较低(如 10s 间隔) 通常较高(如 5s 间隔)
超时设置 较短(如 1s),快速判定 可稍长(如 3s),容忍短暂抖动
典型场景 Java 进程 OOM、Golang goroutine 死锁 数据库连接池未就绪、Redis 缓存未加载
实践建议:在蓝绿发布门禁中,就绪检查是门禁放行的主要依据。存活检查更多用于运维自愈,不应直接参与流量切换决策。

3.3 探针(Probe)机制

探针是健康检查的具体执行单元。Kubernetes 定义了三种探针类型,每种探针支持多种协议实现。下图展示了探针在 Pod 生命周期中的位置:

探针机制与 Pod 生命周期 Pod 容器组 主容器(Main Container) 业务进程(如 Nginx / Java App) 存活探针(Liveness Probe) 就绪探针(Readiness Probe) 启动探针(Startup Probe) 探针行为说明 • 启动探针:容器启动时禁用其他探针 直到启动成功,防止误判 • 存活探针失败 → 重启容器 • 就绪探针失败 → 从 Service 摘除 • 三种探针可独立配置 • 支持 HTTP / TCP / gRPC / Exec

3.4 探针支持的协议与配置

探针通过不同的协议与目标服务交互。以下是主流协议及其配置要点:

协议类型 检查方式 适用场景 关键参数
HTTP(S) 发送 GET 请求,检查状态码(200-399) Web 服务、REST API path、port、httpHeaders、scheme
TCP 尝试建立 TCP 连接 数据库、缓存、基础端口检测 host、port
gRPC 调用预定义的 Health/Check RPC 微服务、gRPC 应用 service、port
Exec(命令) 在容器内执行命令,检查退出码 自定义逻辑、文件存在性检查 command、timeoutSeconds
常见误区:不要将存活检查与就绪检查配置为完全相同的端点。存活检查应更轻量(如 /healthz),就绪检查可包含依赖检查(如 /ready)。混用会导致重启与摘除逻辑互相干扰。

3.5 探针配置参数详解

每个探针都有一组精细的调优参数,直接影响检查的灵敏度和稳定性:

  • initialDelaySeconds:容器启动后等待多久开始第一次检查,避免启动阶段误判。
  • periodSeconds:两次检查之间的间隔时间,默认 10s。
  • timeoutSeconds:单次检查的超时时间,超时视为失败。
  • successThreshold:连续成功多少次才认为健康,默认 1。
  • failureThreshold:连续失败多少次才触发动作,默认 3。
蓝绿发布调优建议:在门禁切换前,建议将就绪探针的 failureThreshold 临时调低(如 1~2),加速故障发现;切换稳定后再恢复默认值,避免抖动导致频繁摘除。

3.6 多协议健康检查的配置示例

以下是一个 Kubernetes Deployment 中同时配置 HTTP 存活检查与 TCP 就绪检查的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: my-app:1.0.0
        ports:
        - containerPort: 8080
        - containerPort: 9090
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 5
          periodSeconds: 10
          timeoutSeconds: 2
          failureThreshold: 3
        readinessProbe:
          tcpSocket:
            port: 9090
          initialDelaySeconds: 3
          periodSeconds: 5
          timeoutSeconds: 1
          successThreshold: 1
          failureThreshold: 2

上述配置中,存活检查通过 HTTP 检测主端口 8080 的业务健康状态;就绪检查通过 TCP 检测辅助端口 9090 的后台服务是否就绪。两者独立运行,互不干扰。

最佳实践:在蓝绿发布场景中,建议为每个版本单独配置健康检查端点,并在门禁脚本中聚合所有实例的检查结果。只有当新版本集群的就绪率 ≥ 100% 且持续稳定超过一个检查周期后,才允许流量切换。