Prometheus使用count_over_time查询kube_pod_created结果不真实问题
K8s Pod数量查询结果不符排查方案
1. 定位当前查询语句的逻辑缺陷
你使用的查询语句
count(count_over_time(kube_pod_created{cluster="$cluster", namespace="$namespace"}[$__range]))的统计逻辑为:统计所选$__range时间窗口内所有曾经创建过的Pod总数,而非当前正在运行的Pod数量。只要Pod在该时间窗口内有过创建记录,无论后续是否被删除、终止、重建,都会被计入结果。56和实际运行2个Pod的差值,就是该时间窗口内被销毁的Pod总数量。
2. 替换为正确的查询逻辑
如果要统计当前处于运行状态的Pod数量,使用以下查询语句:
count(kube_pod_status_phase{cluster="$cluster", namespace="$namespace", phase="Running"})
如果要统计该命名空间下所有非终止状态的Pod总数(包含Running、Pending、ContainerCreating等状态),使用以下查询语句:
count(kube_pod_status_phase{cluster="$cluster", namespace="$namespace", phase!="Succeeded", phase!="Failed"})
3. 验证原查询结果准确性(可选)
如果需要确认原查询返回的56是否为正确值,可按以下步骤排查:
- 执行kubectl命令查看该命名空间下的历史Pod记录:K8s 1.20及之前版本使用
kubectl get pods -n $namespace --show-all,K8s 1.21+版本使用kubectl get pods -n $namespace --field-selector status.phase!=Running,统计已完成/失败的Pod总数,加上当前运行的2个Pod,总和应与56接近 - 检查该命名空间下的工作负载是否配置了自动扩缩容、滚动更新、异常重启策略,这类场景会产生大量历史Pod记录,都会被原查询语句计数
- 在Prometheus UI直接查询原始指标
kube_pod_created{cluster="$cluster", namespace="$namespace"},确认返回的时间序列数量与当前实际Pod数一致,排除kube-state-metrics重复上报、指标残留的问题
内容的提问来源于stack exchange,提问作者Abdennour TOUMI
相关产品推荐
相关产品推荐

