如何从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列
备选方案:分开查询再合并
如果上面的整合查询有问题,也可以分两个查询实现:
- 查询Pod的基本标签信息:
这个查询返回的标签包含kube_pod_status_phase != 0 + on(pod) group_left(node) (0 * kube_pod_info)pod、node、phase,值为1(仅用于保留系列) - 查询Pod的启动时间:
返回值为启动时间戳,标签包含kube_pod_start_timepod
然后在Grafana表格面板中,开启「合并查询结果」选项,通过pod标签自动合并两个查询的结果,再按照前面的方法配置字段和计算Age即可。
内容的提问来源于stack exchange,提问作者Joseph Gagnon
相关产品推荐
相关产品推荐

