Prometheus指标返回错误时间及Pod终止时间获取问题排查
Pod运行时长、创建时间查询异常及kube_pod_completion失效问题排查
一、Pod运行时长查询结果与实际不符
问题原因
你使用的sum by(namespace, pod)是错误的聚合方式。kube_pod_created每个时间序列对应一个Pod实例(包括已终止的旧实例),sum会将同一namespace+pod下的所有实例的运行时长(time()-创建时间)相加,导致结果被旧实例的时长拉高(比如旧Pod运行了5天,新Pod运行55分钟,求和后就显示5天+55分钟)。
修正后的查询
去掉sum by,直接获取每个Pod实例的运行时长:
time() - last_over_time(kube_pod_created{pod=~"consumer-deployment.*"}[1d])
如果需要按namespace和pod标签展示结果,改用by(namespace, pod)聚合(而非求和):
time() - last_over_time(kube_pod_created{pod=~"consumer-deployment.*"}[1d]) by(namespace, pod)
二、Pod创建时间部分结果错误
问题原因
同样是sum by的问题:min_over_time返回每个Pod实例1天内的最早创建时间,sum会将同一namespace+pod下的新旧实例创建时间戳相加,导致结果完全错误;而正确的结果仅对应那些没有重启过、只有单个实例的Pod。
修正后的查询
如果要获取当前运行Pod的最新创建时间,改用last_over_time并去掉sum by:
last_over_time(kube_pod_created{pod=~"consumer-deployment.*"}[1d])
如果要获取Pod实例的最早创建时间(包括已终止的旧实例),直接保留min_over_time去掉sum by:
min_over_time(kube_pod_created{pod=~"consumer-deployment.*"}[1d])
三、kube_pod_completion指标无法获取终止时间
问题原因
kube_pod_completion是仅针对Job类型Pod的指标,普通Deployment管理的Pod终止时不会生成该指标。
替代方案
对于普通Deployment的Pod,使用kube_pod_container_status_terminated_finished_at指标获取容器终止时间(对应Pod的终止时间):
last_over_time(kube_pod_container_status_terminated_finished_at{pod=~"consumer-deployment.*"}[1d])
同时需确保:
- kube-state-metrics已启用Pod终止状态相关指标(默认是开启的);
- Prometheus保留了足够的历史数据,能覆盖已终止Pod的指标生命周期。
内容的提问来源于stack exchange,提问作者trey
相关产品推荐
相关产品推荐

