如何使用Prometheus查询Kubernetes集群Pod过去24小时运行时长
解决方案
前置配置调整(解决已删除Pod指标丢失问题)
你遇到的已终止删除Pod无数据问题,是kube-state-metrics默认在Pod删除后立即停止暴露对应指标,叠加Prometheus 5分钟 stale 标记机制导致的。可先调整配置保证指标覆盖:
- 修改kube-state-metrics启动参数,添加
--metric-ttl=25h,比你需要查询的24小时多保留1小时即可,确保24小时内删除的Pod指标不会立即消失 - 若无法修改kube-state-metrics配置,只要Prometheus的数据保留周期大于24小时,也可以直接通过PromQL从历史存储中拉取数据,无需调整配置
最终PromQL查询语句
( last_over_time(kube_pod_completion_time[24h]) OR (time() * on(namespace,pod) group_left() last_over_time(kube_pod_status_phase{phase="Running"}[24h]) == 1) ) - on(namespace,pod) group_left() last_over_time(kube_pod_created[24h])
语句逻辑说明
- 用
last_over_time(kube_pod_completion_time[24h])获取过去24小时内所有已终止Pod的结束时间 - 用
OR分支处理运行中Pod:没有结束时间的情况下,用当前时间time()作为终止时间,匹配规则为对应Pod过去24小时内有Running状态的记录 - 所有指标都用
last_over_time([24h])包裹,主动拉取过去24小时内出现过、当前已经消失的历史Pod指标,规避Prometheus默认的stale标记规则 - 计算结果单位为秒,需要换算为小时的话将整个语句除以3600即可
结果验证
- 运行中Pod返回值=当前时间 - Pod创建时间
- 已终止Pod返回值=Pod终止时间 - Pod创建时间
- 24小时内创建后又删除的Pod会正常出现在结果列表中
内容的提问来源于stack exchange,提问作者Vladimir Prus
相关产品推荐
相关产品推荐

