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 | 字节 | 分析带宽饱和度 |
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])
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 小时的资源余量预测值,并与升级窗口的准入阈值进行比较。
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)向量,作为后续预测模型的输入。