4. 健康检查日志的典型特征:探针日志、就绪检查、存活检查的日志格式
在 Kubernetes 弹性伸缩场景中,健康检查日志是最常见、也是流量最大的日志类型之一。理解探针日志的格式与特征,是设计高效标签结构的前提。本章将系统梳理 Liveness Probe(存活检查)、Readiness Probe(就绪检查)和 Startup Probe(启动探针)三类探针的日志格式差异,并给出典型字段映射。
4.1 三类探针的语义与日志触发时机
Kubernetes 提供三种探针,分别对应容器生命周期的不同阶段。它们的日志输出时机和内容结构存在显著差异:
| 探针类型 | 检查目的 | 失败后果 | 日志典型频率 | 日志常见位置 |
|---|---|---|---|---|
| Liveness Probe | 检测容器是否存活(是否死锁/崩溃) | 重启容器 | 每 10-30 秒一次 | 容器 stdout/stderr |
| Readiness Probe | 检测容器是否准备好接收流量 | 从 Service Endpoint 移除 | 每 5-15 秒一次 | 容器 stdout/stderr |
| Startup Probe | 检测容器是否已完成启动初始化 | 重启容器(慢启动保护) | 启动阶段密集,成功后停止 | 容器 stdout/stderr |
关键认知: 存活检查失败会触发 Pod 重启,就绪检查失败仅影响流量接入。在日志标签设计中,必须区分这两种失败语义,否则弹性伸缩的告警阈值将无法准确反映真实问题。
4.2 探针日志的典型格式与字段
无论使用 HTTP、TCP 还是 Exec 方式,探针日志通常遵循以下结构。下面以最常见的 HTTP 探针为例,展示一条完整的日志记录:
{
"timestamp": "2025-03-21T14:32:10.123Z",
"probe_type": "readiness",
"probe_action": "httpGet",
"target": "/healthz",
"host": "10.244.1.15:8080",
"status_code": 200,
"latency_ms": 12,
"success": true,
"pod_name": "api-gateway-7d8f9c6b4c-x2h3k",
"namespace": "production",
"container_name": "gateway",
"message": "Readiness probe succeeded"
}
各字段的日志价值与标签化建议如下表:
| 字段 | 日志价值 | 是否建议作为 Loki 标签 | 说明 |
|---|---|---|---|
probe_type |
区分存活/就绪/启动 | 是 | 核心过滤维度,建议设为高基数标签 |
status_code |
判断探针是否通过 | 是 | 200 为成功,非 200 为失败 |
latency_ms |
探针响应延迟 | 否(作为日志内容) | 用于延迟分析,不适合做标签 |
pod_name |
定位具体 Pod | 是 | 必须保留,用于关联 Pod 生命周期 |
namespace |
多租户隔离 | 是 | 必选标签,用于权限与过滤 |
target |
探针路径或端口 | 否(作为日志内容) | 路径变化频繁,不适合做标签 |
4.3 三种探针的日志格式对比
不同探针在日志输出上存在细微但重要的差异。以下通过对比表格展示它们在关键字段上的区别:
| 对比维度 | Liveness Probe | Readiness Probe | Startup Probe |
|---|---|---|---|
| probe_type 值 | liveness |
readiness |
startup |
| 失败时日志级别 | ERROR(触发重启) | WARN(仅摘除流量) | ERROR(触发重启) |
| 成功时日志级别 | INFO | INFO | INFO |
| 典型检查间隔 | 10-30s | 5-15s | 1-5s(启动阶段) |
| 日志量级 | 中等 | 高(频率最快) | 启动阶段极高,之后停止 |
| 是否影响 HPA | 间接影响(Pod 重启导致副本数波动) | 直接影响(就绪不足触发扩容) | 间接影响(启动慢导致副本不可用) |
常见陷阱: 很多团队将三种探针日志混入同一个日志流,且不区分
probe_type。这会导致在 Loki 中无法快速定位“到底是存活检查失败还是就绪检查失败”,进而无法准确判断是否需要触发弹性伸缩。务必在日志输出时显式标记探针类型。
4.4 探针日志与弹性伸缩的关联模型
为了直观展示探针日志在弹性伸缩决策链路中的位置,下图描述了从日志产生到触发 HPA 动作的完整数据流:
4.5 典型日志格式示例(按探针类型)
以下给出三种探针在实际生产环境中的完整日志示例,注意它们在字段取值和语义上的差异:
4.5.1 Liveness Probe 日志示例
{
"timestamp": "2025-03-21T14:32:10.123Z",
"probe_type": "liveness",
"probe_action": "httpGet",
"target": "/livez",
"host": "10.244.1.15:8080",
"status_code": 200,
"latency_ms": 8,
"success": true,
"pod_name": "api-gateway-7d8f9c6b4c-x2h3k",
"namespace": "production",
"container_name": "gateway",
"message": "Liveness probe succeeded"
}
4.5.2 Readiness Probe 日志示例(失败场景)
{
"timestamp": "2025-03-21T14:32:15.456Z",
"probe_type": "readiness",
"probe_action": "httpGet",
"target": "/readyz",
"host": "10.244.1.15:8080",
"status_code": 503,
"latency_ms": 2500,
"success": false,
"pod_name": "api-gateway-7d8f9c6b4c-x2h3k",
"namespace": "production",
"container_name": "gateway",
"message": "Readiness probe failed: service not ready"
}
4.5.3 Startup Probe 日志示例(启动阶段)
{
"timestamp": "2025-03-21T14:31:55.789Z",
"probe_type": "startup",
"probe_action": "httpGet",
"target": "/startupz",
"host": "10.244.1.15:8080",
"status_code": 200,
"latency_ms": 45,
"success": true,
"pod_name": "api-gateway-7d8f9c6b4c-x2h3k",
"namespace": "production",
"container_name": "gateway",
"message": "Startup probe succeeded, container ready"
}
设计要点: 注意上述日志中
probe_type 字段的值分别为 liveness、readiness、startup。在 Loki 标签设计中,建议将 probe_type 作为必选标签,配合 status_code 标签,即可实现“按探针类型 + 成功/失败”的快速过滤,这是后续弹性伸缩健康检查的基础查询模式。
4.6 探针日志的常见问题与避坑指南
- 日志缺失探针类型标识: 很多应用框架(如 Spring Boot Actuator)默认不输出探针类型。必须通过日志配置或 Sidecar 注入方式,显式添加
probe_type字段。 - 探针日志与业务日志混用: 建议将探针日志输出到独立文件或使用独立的 logger 名称,便于在 Loki 中通过
filename或logger标签快速分离。 - 忽略 Startup Probe 日志: 启动探针只在容器启动阶段产生日志,但这段日志对于诊断“启动慢导致 HPA 误扩容”至关重要,不可丢弃。
- 延迟字段未记录:
latency_ms字段是判断探针性能瓶颈的关键指标,建议始终记录,即使不作为标签也要保留在日志内容中。