求集群全Pod的CPU/内存使用率超90%限额的Prometheus告警表达式
问题描述
我正在配置Grafana告警,需要创建两个独立的告警规则:
- 当任意命名空间下的Pod在过去10分钟内的平均CPU使用率超过对应Pod容器CPU限额的90%时触发告警
- 内存使用率触发条件与CPU一致
我最初尝试的内存使用率查询表达式无法正常工作:
avg_over_time(container_memory_usage_bytes[10m]) >= kube_pod_container_resource_limits{resource="memory"} * 0.9
目前已经写出针对特定Pod的内存查询表达式,但需要将其适配为集群中所有Pod的通用查询:
avg_over_time(container_memory_usage_bytes{pod="nginx-f7d787f6c-t8x9s", container="nginx"}[10m]) > on(pod_uid) kube_pod_container_resource_limits{resource="memory", pod="nginx-f7d787f6c-t8x9s", container="nginx"} * 0.9
示例场景:
| Pod名称 | 容器数量 | 10分钟平均内存使用率 | 内存限额 |
|---|---|---|---|
| Pod1 | 5 | 9Mi | 10Mi |
| Pod2 | 3 | 9Mi | 1000Mi |
Pod1的容器内存使用率达到了限额的90%,期望它能出现在查询结果中。
解决方案
通用内存使用率告警查询
移除特定Pod和容器的固定标签过滤,同时补充container维度确保关联准确性(同一个Pod下的不同容器资源限额独立),最终表达式如下:
avg_over_time(container_memory_usage_bytes{container!="POD"}[10m]) / on(pod_uid, container) kube_pod_container_resource_limits{resource="memory"} > 0.9
通用CPU使用率告警查询
替换对应指标名称即可实现CPU使用率的告警查询:
avg_over_time(container_cpu_usage_seconds_total{container!="POD"}[10m]) / on(pod_uid, container) kube_pod_container_resource_limits{resource="cpu"} > 0.9
关键说明
- 过滤
container!="POD":排除Kubernetes的Pause容器,这类容器通常无资源限额配置,会干扰计算结果 - 关联
pod_uid + container:确保每个容器的实际使用率和自身的资源限额正确匹配,避免跨容器的指标混淆 - 使用除法计算占比:直接用「实际使用量/资源限额」得到使用率占比,比直接比较字节数更直观,也避免了指标类型匹配问题
内容的提问来源于stack exchange,提问作者Ron Sharabi
相关产品推荐
相关产品推荐

