如何按Service汇总监控指标?以kubelet(cAdvisor)指标为例
嘿,刚好对这块比较熟悉,我来一步步给你讲清楚怎么把Pod级的监控指标聚合到Service维度,还有你问的那个指标的问题~
核心逻辑:从Pod关联到Service
Kubernetes里的Service是通过标签选择器绑定Pod的,所以要把Pod的指标聚合到Service,核心就是建立Pod和Service之间的标签关联,再用监控工具的聚合能力完成统计。
方法1:用PromQL直接关联聚合(最常用)
如果你的集群已经部署了kube-state-metrics(大部分K8s监控栈都会自带它),它会暴露Pod和Service的元数据关联指标,帮你完成标签映射。
以你提到的container_cpu_usage_seconds_total为例,分两种场景:
场景1:Pod和Service用相同标签关联
比如你的Service用app=my-service选择Pod,Pod也带有app=my-service标签,那直接用聚合函数按标签统计就行:sum(rate(container_cpu_usage_seconds_total{container!="POD", namespace!="kube-system"}[5m])) by (app)这里的
sum是把同标签Pod的CPU使用率加总,你也可以根据需求换成avg(平均)、max(最大值)等函数。场景2:Pod和Service标签不直接对应
可以通过kube-state-metrics提供的kube_pod_info指标,把Pod所属的Service标签关联进来,再聚合:sum( rate(container_cpu_usage_seconds_total{container!="POD"}[5m]) * on(pod) group_left(service) kube_pod_info{service!=""} ) by (service)这段PromQL的逻辑是:先拿到Pod的CPU使用率,再通过
pod标签关联上对应的Service名称,最后按Service汇总。
方法2:在采集阶段提前添加Service标签
如果你用Prometheus Operator或者自定义的ServiceMonitor,可以在采集配置里通过relabelings规则,给Pod指标直接打上Service标签,后续聚合会更简单。
比如在ServiceMonitor的配置里添加:
relabelings: - sourceLabels: [__meta_kubernetes_pod_label_app] targetLabel: service action: replace
这样采集到的所有Pod指标都会带上service标签,后续直接用sum(rate(...)) by (service)就能完成聚合。
关于process_cpu_seconds_total的疑问
明确说:不是。process_cpu_seconds_total是进程级的CPU使用统计(比如Prometheus自身进程、应用程序进程的CPU消耗),而container_cpu_usage_seconds_total是容器级的CPU指标,两者统计对象和维度完全不同,不存在“前者是后者按Service聚合”的关系。
额外小提示
- 如果用Grafana做可视化,直接把上面的PromQL作为数据源,就能生成Service级别的CPU使用率面板。
- 确保
kube-state-metrics是较新版本,旧版本可能缺少部分关联元数据。 - 如果一个Pod被多个Service关联,聚合时要根据业务需求选择去重或合并的方式(比如用
max而非sum避免重复统计)。
内容的提问来源于stack exchange,提问作者Fumisky Wells

