4. MTTR 数据采集方法:Prometheus 指标采集、Event 事件采集、kubectl get events、日志聚合(Loki/ELK)

MTTR 复盘的核心前提是 可观测数据 的完整性与准确性。节点异常从发生到恢复的每一个时间节点,都需要被精确记录。本章详细阐述四种数据采集方法,覆盖指标、事件、命令行快照与日志聚合四个维度,构建 MTTR 计算的完整数据基座。

4.1 数据采集方法对比总览

四种方法在数据源、时效性、存储周期与复盘用途上各有侧重。下表为 MTTR 复盘场景下的选型参考:

采集方法 数据源 时效性 存储周期 MTTR 复盘用途
Prometheus 指标 kubelet / cAdvisor / node_exporter 秒级(15s scrape) 数周~数月(TSDB) 检测时间点、资源趋势、异常持续时长
Event 事件采集 Kubernetes API Server 实时(Watch) 默认 1h(etcd) 节点状态变迁、驱逐、调度决策时间戳
kubectl get events Kubernetes API Server(即时查询) 即时 无持久化 现场快照、人工复盘时间线校准
日志聚合(Loki/ELK) kubelet / systemd / kernel 准实时(秒级延迟) 数周~数月(对象存储) 根因定位、OOM/磁盘/网络错误详情
MTTR 数据采集黄金法则: 指标定界时间范围,事件标记状态变迁,日志提供根因证据。三者缺一不可。

4.2 Prometheus 指标采集:时间轴定界

Prometheus 是 MTTR 时间线计算的 主力数据源。通过节点相关指标的时序变化,可以精确判定异常开始时间(T1)与恢复时间(T4)。

4.2.1 核心指标与 MTTR 映射

指标名称 类型 MTTR 阶段 判定逻辑
up{job="kubernetes-nodes"} Gauge T1 检测 值从 1 变为 0 表示节点不可达
node_load1 / node_load5 / node_load15 Gauge T1 检测 持续超过 vCPU 核数 2 倍以上
node_memory_MemAvailable_bytes Gauge T1 检测 接近 0 或持续下降趋势
node_filesystem_avail_bytes Gauge T1 检测 根分区或数据分区低于 5%
kube_node_status_condition{condition="Ready"} Gauge T1 / T4 1=Ready, 0=NotReady, -1=Unknown

4.2.2 PromQL 查询示例:计算节点不可用时长

# 查询节点 node-01 在最近 24h 内 NotReady 的总时长(秒)
avg_over_time(
  (time() - (kube_node_status_condition{node="node-01", condition="Ready", status="true"} 
  * time()))[24h:15s]
)
复盘建议: 在 Prometheus 中为每个节点创建 node_unavailable_seconds 记录规则(Recording Rule),将 MTTR 计算前置为预聚合指标,避免每次复盘时重复扫描原始数据。

4.3 Event 事件采集:状态变迁标记

Kubernetes Event 记录了节点、Pod 等资源的状态变迁,是 MTTR 时间线中 T2(响应时间) 和 T3(修复时间) 的关键证据。

4.3.1 关键 Event 类型与 MTTR 关联

Event Reason Event Type MTTR 阶段 含义
NodeNotReady Warning T1 节点状态变为 NotReady
NodeReady Normal T4 节点恢复 Ready 状态
NodeHasDiskPressure Warning T1 节点磁盘压力触发
Evicted Warning T2 kubelet 开始驱逐 Pod
FailedNode Warning T1 调度器标记节点失败

4.3.2 事件采集架构

原生 Event 存储在 etcd 中,默认 TTL 仅 1 小时,无法满足 MTTR 复盘需求。推荐使用 event-exporter 或 kube-eventer 将事件持久化到外部存储。

# event-exporter 配置示例:将事件发送到 Loki
apiVersion: v1
kind: ConfigMap
metadata:
  name: event-exporter-config
  namespace: monitoring
data:
  config.yaml: |
    logLevel: info
    route:
      routes:
        - match:
            - receiver: "loki"
    receivers:
      - name: "loki"
        loki:
          url: "http://loki.monitoring:3100/loki/api/v1/push"
          tenant: "kubernetes-events"

4.4 kubectl get events:现场快照与人工校准

在复盘过程中,kubectl get events 是 最直接 的现场数据获取方式。虽然数据不持久化,但在故障发生时立即执行,可以捕获最原始的时间戳信息。

4.4.1 常用命令组合

# 查看节点相关事件(按时间排序)
kubectl get events --field-selector involvedObject.kind=Node \
  --sort-by='.lastTimestamp' -n default

# 查看特定节点事件
kubectl get events --field-selector involvedObject.name=node-01 \
  --sort-by='.lastTimestamp' --all-namespaces

# 查看 Warning 级别事件(重点关注)
kubectl get events --field-selector type=Warning \
  --sort-by='.lastTimestamp' --all-namespaces

# 输出为自定义列格式(便于导入复盘表格)
kubectl get events --all-namespaces \
  -o custom-columns=TIME:.lastTimestamp,TYPE:.type,REASON:.reason,OBJECT:.involvedObject.name,MESSAGE:.message \
  --sort-by='.lastTimestamp'
注意: kubectl get events 默认只显示最近 1 小时的事件。如果故障发生时间较早,需要结合 --since=24h 参数或直接查询持久化的事件存储。

4.5 日志聚合(Loki/ELK):根因证据链

指标和事件标记了 “什么时候” 发生了异常,而日志回答了 “为什么” 发生异常。日志聚合系统是 MTTR 复盘中根因分析(RCA)的核心数据源。

4.5.1 节点关键日志源

日志源 路径/组件 MTTR 关联
kubelet 日志 /var/log/syslog 或 journalctl -u kubelet 节点状态变更、Pod 启动/停止、驱逐决策
containerd / Docker 日志 journalctl -u containerd 容器运行时错误、镜像拉取失败
内核日志 /var/log/kern.log 或 dmesg OOM Killer、磁盘 I/O 错误、网络驱动异常
系统日志 /var/log/syslog SSH 登录、服务重启、硬件告警

4.5.2 Loki 与 ELK 选型对比

特性 Loki ELK(Elasticsearch)
索引策略 仅索引标签,不索引日志内容 全文索引
存储成本 低(对象存储) 高(需要大量磁盘)
查询速度 中等(依赖标签过滤) 快(全文检索)
与 Prometheus 集成 原生(Grafana 统一面板) 需额外配置
MTTR 复盘推荐 ⭐⭐⭐⭐⭐(成本低、集成好) ⭐⭐⭐⭐(查询灵活、功能丰富)

4.5.3 LogQL 查询示例:定位 OOM 事件

# 在 Loki 中查询节点 node-01 最近 1 小时的 OOM 相关日志
{job="systemd-journal", hostname="node-01"} 
|~ "oom_killer|Out of memory|Killed process" 
| logfmt 
| line_format "{{.timestamp}} {{.message}}"

4.6 数据采集架构总览

下图展示了四种数据采集方法在 Kubernetes 节点 MTTR 复盘中的协同架构:

Kubernetes 节点 MTTR 数据采集架构 Kubernetes 节点 kubelet / cAdvisor API Server Events Systemd / Kernel kubectl 即时查询 Prometheus Server Event Exporter Promtail / Filebeat kubectl 命令 Prometheus TSDB Loki / Elasticsearch Loki / Elasticsearch 终端输出 / 笔记 MTTR 复盘面板(Grafana / Kibana) 说明: 指标定界时间范围(T1/T4),事件标记状态变迁(T2/T3),日志提供根因证据。 kubectl 命令作为现场快照,用于人工校准时间线。

4.7 数据采集最佳实践

  1. 时间同步: 所有节点必须配置 NTP 服务,确保 Prometheus、Event、日志的时间戳一致。时间偏差超过 5 秒将导致 MTTR 计算失真。
  2. 标签统一: 在 Prometheus、Loki、Event 中统一使用 node、cluster、region 等标签,便于跨系统关联查询。
  3. 数据保留策略: MTTR 复盘通常需要回溯 30~90 天数据。Prometheus TSDB 建议保留 30 天,日志存储建议保留 90 天。
  4. 自动化采集: 将 kubectl get events 命令封装为故障自愈流程的 第一步,在触发告警时自动执行并保存结果到对象存储。
  5. 冗余采集: 至少使用两种独立的数据源验证同一个时间点。例如,节点 NotReady 时间同时从 Prometheus 指标和 Event 事件中获取,取交集作为最终时间戳。
复盘案例: 某次节点 OOM 故障,Prometheus 指标显示内存使用率在 14:32:15 达到 100%,Event 事件记录 NodeNotReady 在 14:32:18,kubelet 日志在 14:32:20 输出 OOM Killer 信息。三个数据源的时间偏差在 5 秒内,确认 T1 为 14:32:15,根因为内存泄漏。