如何在Prometheus中按Deployment对Pod指标进行分组?
按Deployment、CronJob等维度聚合Prometheus容器指标的方法
核心逻辑是:Kubernetes中Pod会携带关联上层资源(Deployment、CronJob等)的标签,或可通过kube-state-metrics提供的元数据指标建立关联,再用PromQL的聚合函数按对应维度分组。
一、按Deployment分组
Deployment管理的Pod通常会自带deployment标签,或遵循K8s标准标签规范(如app.kubernetes.io/name、app.kubernetes.io/instance),直接用这些标签聚合即可:
# 按deployment标签聚合5分钟内CPU使用率速率 sum(rate(container_cpu_usage_seconds_total{container!="POD", namespace="your-namespace"}[5m])) by (deployment) # 若使用标准标签,替换为对应字段 sum(rate(container_cpu_usage_seconds_total{container!="POD", namespace="your-namespace"}[5m])) by (app.kubernetes.io/name)
注:
container!="POD"用于排除pause容器,避免统计无效资源占用。
二、按CronJob分组
CronJob生成的Pod通常有两种关联方式:
直接通过Pod标签聚合
若Pod带有cronjob标签,直接聚合:sum(rate(container_cpu_usage_seconds_total{container!="POD", namespace="your-namespace"}[5m])) by (cronjob)通过Job关联CronJob
若Pod只有job-name标签(Job名称通常是CronJob名加随机后缀),可结合kube-state-metrics的kube_cronjob_metadata指标关联:sum by (cronjob) ( rate(container_cpu_usage_seconds_total{container!="POD", namespace="your-namespace"}[5m]) * on(job-name) group_left(cronjob) kube_cronjob_metadata{namespace="your-namespace"} )
三、通用关联方法(适用于所有上层资源)
如果Pod没有直接的上层资源标签,可借助kube-state-metrics的kube_pod_owner指标(记录Pod与所有者的关系),指定owner_kind来关联不同类型的资源:
# 按Deployment聚合 sum by (owner_name) ( rate(container_cpu_usage_seconds_total{container!="POD", namespace="your-namespace"}[5m]) * on(pod, namespace) group_left(owner_name, owner_kind) kube_pod_owner{owner_kind="Deployment", namespace="your-namespace"} ) # 替换owner_kind为CronJob即可按CronJob聚合 sum by (owner_name) ( rate(container_cpu_usage_seconds_total{container!="POD", namespace="your-namespace"}[5m]) * on(pod, namespace) group_left(owner_name, owner_kind) kube_pod_owner{owner_kind="CronJob", namespace="your-namespace"} )
注意事项
- 若使用kube-state-metrics的关联指标,需确保Prometheus已配置采集该组件的指标。
- 不同集群的标签规范可能不同,可先执行
container_cpu_usage_seconds_total{container!="POD"}查看Pod实际携带的标签,调整聚合字段。
内容的提问来源于stack exchange,提问作者Ringil
相关产品推荐
相关产品推荐

