You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Prometheus多kube_pod指标聚合K8s Pod状态与节点等信息?

Kubernetes Pod多指标聚合方案(Prometheus+Grafana)

背景

我已经掌握了一种通过PromQL关联不同指标标签的方法:利用(metric_A) + on(<common_label>) group_left(<metric_B_label>, ...) (0 * metric_B)的语法,借助公共标签把右侧指标的标签附加到左侧指标上(这个加法操作仅为满足语法要求,不会改变指标值)。比如下面的查询可以把Pod状态和所属节点关联起来:

(kube_pod_status_phase != 0) + on (pod) group_left (node) (0 * kube_pod_info)

问题

现在需要生成一张包含Node、Pod、Status、Created、Age的Pod信息表:

  • Status来自kube_pod_status_phase的phase标签
  • Created和Age(Age=time()-kube_pod_start_time)来自kube_pod_start_time
  • Node来自kube_pod_info的node标签

但因为phase和node是标签,而Created、Age是查询计算出的值,尝试链式关联多次失败,需要可行的实现方案。

解决方案

可以通过PromQL多步关联+Grafana字段配置的方式实现,以下是具体步骤:

1. 用PromQL整合所有标签与核心时间指标

执行下面的PromQL查询,它会把Pod的状态标签、节点标签和启动时间值整合到同一个指标系列中:

(
  # 第一步:给Pod状态指标附加node标签
  (kube_pod_status_phase != 0)
  + on(pod) group_left(node) (0 * kube_pod_info)
)
* on(pod) group_left() (
  # 第二步:关联启动时间,保留所有标签并将值替换为启动时间戳
  kube_pod_start_time / kube_pod_start_time
)

这个查询的逻辑:

  • 第一部分通过group_left把kube_pod_info的node标签关联到kube_pod_status_phase上
  • 第二部分用除法确保kube_pod_start_time的值不变,再通过乘法把启动时间戳赋值给前面的指标系列,同时保留所有已有的标签(pod、node、phase)

2. Grafana表格面板配置

把上面的查询添加到Grafana表格面板后,在「字段」设置里做以下配置:

  • 将标签phase重命名为Status
  • 将查询返回的数值(启动时间戳)重命名为Created,并设置字段格式为「日期时间」(选择合适的时间格式)
  • 添加一个计算字段,公式输入now() - $Created,将字段重命名为Age,设置格式为「持续时间」(比如选择天:小时:分钟的显示方式)
  • 保留pod和node标签作为表格的Pod和Node列

备选方案:分开查询再合并

如果上面的整合查询有问题,也可以分两个查询实现:

  1. 查询Pod的基本标签信息:
    kube_pod_status_phase != 0 + on(pod) group_left(node) (0 * kube_pod_info)
    
    这个查询返回的标签包含pod、node、phase,值为1(仅用于保留系列)
  2. 查询Pod的启动时间:
    kube_pod_start_time
    
    返回值为启动时间戳,标签包含pod

然后在Grafana表格面板中,开启「合并查询结果」选项,通过pod标签自动合并两个查询的结果,再按照前面的方法配置字段和计算Age即可。

内容的提问来源于stack exchange,提问作者Joseph Gagnon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:58:20