4. Deployment 水位定义:实际资源使用量 / 节点可分配资源量;水位阈值与健康区间

在 Kubernetes 集群中,Deployment 水位 是衡量节点资源紧张程度的核心指标。它反映了运行在节点上的 Pod(由 Deployment 管理)实际消耗的资源与节点可分配资源之间的比例关系。准确理解并监控这一水位,是保障集群稳定性和资源利用率的前提。

4.1 水位计算公式

Deployment 水位的计算基于节点维度的资源视图,其核心公式如下:

Deployment 水位 = (节点上所有 Deployment 管理的 Pod 实际资源使用量之和) / (节点可分配资源量)

其中:

  • 实际资源使用量:通过 eBPF 或 cAdvisor 采集的 Pod 实时 CPU(核·秒)和内存(字节)消耗。eBPF 可提供更细粒度的、去除了内核缓存抖动的“真实使用量”。
  • 节点可分配资源量:Node.Status.Allocatable,即节点总容量减去系统预留(kube-reserved)和驱逐阈值(eviction-hard)后的资源。这是调度器判断能否调度新 Pod 的依据。
关键区别: 水位计算使用的是 实际使用量,而非 Pod 的 requests 或 limits。requests 是调度时的静态承诺,而实际使用量才是动态负载的真实反映。eBPF 的优势在于能精确捕获后者,避免因“超卖”导致的水位误判。

4.2 水位阈值与健康区间

为了将水位量化为可操作的运维动作,我们定义了三个关键阈值,将水位划分为四个健康区间。下表总结了各区间对应的状态与建议操作:

区间名称 水位范围 状态描述 建议操作
安全区 0% ~ 60% 资源充裕,系统运行平稳 常规监控,可考虑适当降低副本数以节省成本
关注区 60% ~ 80% 资源开始紧张,存在突发风险 检查 Pod 资源规格是否合理,评估是否需要扩容
警戒区 80% ~ 90% 高负载运行,节点压力显著 触发预置告警,准备执行 Pod 驱逐或节点扩容
危险区 90% ~ 100% 接近资源上限,系统不稳定风险极高 立即介入,强制驱逐低优先级 Pod 或手动扩容节点
注意: 上述阈值是通用推荐值。实际生产环境中,应根据业务容忍度、节点规格(如是否使用 Burstable 实例)以及 eBPF 采集的抖动幅度进行调整。例如,对于延迟敏感型服务,建议将警戒线下调至 70%。

4.3 水位与资源维度的关系图

下图展示了 Deployment 水位在节点资源模型中的位置,以及它与 capacity、allocatable、requests 和实际使用量之间的关系:

节点资源分层与 Deployment 水位关系 节点总容量 (Capacity) 系统预留 (kube-reserved + eviction-hard) 节点可分配资源 (Allocatable) 已分配 Requests (调度承诺) 实际使用量 (eBPF 采集) 未分配资源 空闲但已承诺 Deployment 水位 = 实际使用量 / 可分配资源量 水位关注的是“实际”而非“请求”

4.4 水位计算示例

假设一个节点具有以下配置:

  • 节点总 CPU:8 核
  • 系统预留:1 核
  • 节点可分配 CPU:7 核
  • 节点上 Deployment Pod 实际使用 CPU:5.6 核

则 CPU 水位计算如下:

CPU 水位 = 5.6 核 / 7 核 = 80%

根据上表,该节点处于 警戒区。此时应检查 Pod 的 CPU 使用模式,确认是否存在突发峰值,并评估是否需要增加节点或调整 Pod 的 resource limits。

4.5 水位监控的 eBPF 优势

传统基于 cAdvisor 的水位监控存在两个主要缺陷:

  1. 采样延迟:cAdvisor 默认 15s 采样一次,无法捕捉毫秒级突发。
  2. 统计口径偏差:cAdvisor 报告的内存使用量包含内核缓存(如 page cache),这部分在内存压力下可被回收,并非真正的“使用中”内存。

eBPF 通过在内核态挂载 tracepoint 或 kprobe,能够:

  • 以微秒级精度采集 CPU 调度和内存分配事件。
  • 区分“匿名页”与“文件页”,剔除可回收缓存,得到更真实的 工作集大小(Working Set Size, WSS)。

这使得基于 eBPF 的 Deployment 水位能够更早、更准确地反映节点压力,避免因缓存抖动导致的误告警。

实践要点: 在配置水位告警时,建议将 eBPF 采集的 WSS 作为内存水位的分子,而非 cAdvisor 的 RSS(常驻内存集)。这能有效减少因文件缓存波动引发的“假阳性”告警。