3、集群资源模型:CPU、内存、磁盘、网络的核心 Prom 指标

在 Kubernetes 集群升级前,准确评估资源水位是避免业务中断的关键。Prometheus 通过 node_exporter 暴露了丰富的节点级指标,这些指标构成了资源预测的原始数据层。本章将逐一拆解 CPU、内存、磁盘、网络四大类核心指标,并建立从指标到资源模型的映射关系。

3.1 指标分类与采集原理

所有节点级指标均通过 node_exporter 的 /metrics 端点暴露,Prometheus 以固定间隔(通常 15s)拉取。指标类型分为 Counter(累计值,如 CPU 时间)、Gauge(瞬时值,如内存用量)、Histogram/Summary(分布统计,如磁盘 I/O 延迟)。

资源类别 典型指标 类型 单位 预测用途
CPU node_cpu_seconds_total Counter 秒 计算 CPU 利用率趋势
内存 node_memory_MemAvailable_bytes Gauge 字节 评估可用内存余量
磁盘 node_filesystem_avail_bytes Gauge 字节 预测磁盘耗尽时间
网络 node_network_receive_bytes_total Counter 字节 分析带宽饱和度
关键原则:Counter 类型指标必须使用 rate() 或 irate() 函数转换为每秒速率后再用于预测,避免累计值直接参与模型计算导致趋势失真。

3.2 CPU 指标:node_cpu_seconds_total

该指标记录了 CPU 在各模式下花费的累计秒数,包含 user、system、idle、iowait、irq 等标签。升级窗口预测关注的是 CPU 利用率,而非原始累计值。

# 计算 CPU 利用率(排除 idle 和 iowait)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 按 CPU 核心拆分
avg by (instance, cpu) (rate(node_cpu_seconds_total{mode!="idle"}[5m]))

在预测模型中,通常取 过去 7 天的 P95 利用率 作为升级窗口的保守基线。若集群包含高优先级批处理任务,还需关注 iowait 占比,避免升级期间 I/O 密集型 Pod 被重新调度到同一节点导致资源争抢。

避坑提示:不要直接使用 node_cpu_seconds_total 的原始值做线性回归。Counter 的单调递增特性会使预测结果永远向上倾斜,必须先用 rate() 降噪。

3.3 内存指标:node_memory_MemAvailable_bytes

node_memory_MemAvailable_bytes 是 Linux 内核估算的 可用内存,包含空闲内存、可回收的 Page Cache 以及 Slab 可回收部分。相比 MemFree_bytes,该指标更贴近实际可分配量,是升级预测的首选。

指标 含义 预测适用性
node_memory_MemTotal_bytes 物理内存总量 用于计算利用率分母
node_memory_MemFree_bytes 完全空闲内存 过于保守,不推荐单独使用
node_memory_MemAvailable_bytes 内核估算可用量 推荐,反映真实余量
node_memory_Buffers_bytes 块设备缓冲 辅助分析缓存压力
# 内存利用率(基于可用内存)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# 预测未来 2 小时可用内存是否低于阈值
predict_linear(node_memory_MemAvailable_bytes[6h], 2 * 3600) < 1e9
注意:当节点内存压力较大时,MemAvailable 会快速下降。升级窗口预测应设置双重阈值:阈值(如低于 1GB 禁止升级)和 趋势阈值(如预测 2 小时后低于 500MB 则告警)。

3.4 磁盘指标:容量与 I/O 分离

磁盘资源预测需同时关注 容量耗尽 和 I/O 压力,两者对升级的影响不同。容量不足会导致 Pod Eviction,I/O 压力则影响容器启动速度和 etcd 性能。

3.4.1 容量指标

# 根分区可用空间(排除临时卷)
node_filesystem_avail_bytes{mountpoint="/", fstype!~"tmpfs|overlay"}

# 预测磁盘耗尽时间(天)
(node_filesystem_avail_bytes / predict_linear(node_filesystem_avail_bytes[7d], 0)) * 24

3.4.2 I/O 指标

指标 含义 升级影响
node_disk_io_time_seconds_total 磁盘 I/O 总耗时 反映设备繁忙程度
node_disk_read_bytes_total 累计读取字节 评估读带宽压力
node_disk_written_bytes_total 累计写入字节 评估写带宽压力
node_disk_io_now 当前正在处理的 I/O 数 瞬时队列深度
# 磁盘 I/O 利用率(基于 io_time)
rate(node_disk_io_time_seconds_total[5m]) * 100

# 写带宽饱和度
rate(node_disk_written_bytes_total[5m]) / 1024 / 1024  # MB/s

3.5 网络指标:带宽与丢包

网络指标在升级窗口中的核心作用是 判断节点是否处于高负载通信状态。如果节点正在承担大量 Pod 间通信或对外流量,升级操作可能引发连接中断或带宽争抢。

# 入站带宽利用率(假设网卡为 1Gbps)
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8 / 1e9

# 出站带宽利用率
rate(node_network_transmit_bytes_total{device="eth0"}[5m]) * 8 / 1e9

# 丢包率(重传/错误包)
rate(node_network_receive_drop_total[5m]) / rate(node_network_receive_packets_total[5m])
最佳实践:在升级前 30 分钟,对每个待升级节点执行网络带宽的 滑动窗口 P99 检测。若连续 3 个采样周期带宽利用率超过 70%,或丢包率超过 0.1%,应推迟该节点的升级操作。

3.6 资源模型整合:从指标到预测输入

将上述指标整合为统一的资源模型,作为升级窗口预测的输入特征。每个节点在时间窗口 t 的资源状态向量为:

NodeState(t) = {
  cpu_util_p95:   float,   # 过去 5m CPU 利用率 P95
  mem_avail_gb:   float,   # 当前可用内存 (GB)
  disk_avail_gb:  float,   # 根分区可用空间 (GB)
  disk_io_util:   float,   # 磁盘 I/O 利用率
  net_rx_util:    float,   # 入站带宽利用率
  net_tx_util:    float,   # 出站带宽利用率
  net_drop_rate:  float    # 丢包率
}

该向量将输入到后续章节的时序预测模型(如 Prophet、LSTM)中,输出未来 1-4 小时的资源余量预测值,并与升级窗口的准入阈值进行比较。

集群资源模型与 Prom 指标映射关系 Prom 指标层 CPU node_cpu_seconds_total 内存 node_memory_MemAvailable_bytes 磁盘容量 node_filesystem_avail_bytes 磁盘 I/O node_disk_io_time_seconds_total 网络 node_network_*_bytes_total 特征提取层 rate() / irate() avg / p95 / p99 predict_linear() 滑动窗口聚合 资源模型层 cpu_util_p95 mem_avail_gb disk_avail_gb disk_io_util net_rx/tx_util 说明:Prom 原始指标经 rate/聚合/预测函数处理后,映射为资源模型中的结构化特征向量,供升级窗口预测模型使用。

3.7 本章小结

  • CPU:使用 node_cpu_seconds_total 配合 rate() 计算利用率,关注 P95 峰值。
  • 内存:优先使用 node_memory_MemAvailable_bytes,设置阈值与趋势阈值双重防线。
  • 磁盘:容量指标用 node_filesystem_avail_bytes,I/O 压力用 node_disk_io_time_seconds_total。
  • 网络:带宽利用率与丢包率结合,作为节点通信健康度的判断依据。
  • 模型整合:所有指标最终汇聚为 NodeState(t) 向量,作为后续预测模型的输入。