如何在Kubernetes中配置Prometheus告警监控被驱逐的Failed状态Pod
问题根因
你用的kube_pod_container_status_terminated_reason是容器维度的指标,统计的是单个容器终止运行的原因。而节点驱逐是Pod级别的状态原因,kubelet会直接将整个Pod标记为Failed状态、Reason为Evicted,不会给Pod内的容器单独上报Evicted的终止标识,所以这个指标查不到对应数据。
解决方案
方案1:升级kube-state-metrics(推荐)
v2.2.0及以上版本的kube-state-metrics已经原生支持kube_pod_status_reason指标,直接暴露Pod维度的状态原因:
- 执行以下命令查看当前kube-state-metrics版本:
kubectl exec -n <kube-state-metrics命名空间> <kube-state-metrics Pod名称> -- kube-state-metrics --version - 如果版本低于v2.2.0,通过升级Prometheus Operator对应的Helm chart或者直接更新kube-state-metrics部署即可完成升级。
- 升级完成后使用如下PromQL统计Evicted Pod数量:
count(kube_pod_status_reason{reason="Evicted"}) by (namespace)
对应的告警规则示例:
groups: - name: pod-eviction-rules rules: - alert: EvictedPodsExceedThreshold expr: count(kube_pod_status_reason{reason="Evicted"}) > 3 for: 2m labels: severity: warning annotations: summary: 集群驱逐Pod数量超过阈值 description: 当前集群共有{{ $value }}个被驱逐的Pod,请排查节点资源或Pod资源配置问题。
方案2:手动配置kube-state-metrics暴露Pod Reason标签(无需升级)
如果暂时无法升级kube-state-metrics,可以修改kube-state-metrics启动参数,手动把Pod的status.reason字段暴露为指标标签:
- 修改kube-state-metrics的部署配置,增加启动参数:
--metric-labels-allowlist=pods=[status.reason]
注:部分旧版本的kube-state-metrics参数名为--labels-allowlist,可根据实际版本调整 - 重启kube-state-metrics后,即可在
kube_pod_labels或kube_pod_info指标中拿到reason标签,通过PromQL关联查询Evicted的Failed Pod:count(kube_pod_status_phase{phase="Failed"} * on(pod, namespace) group_left(reason) kube_pod_info{reason="Evicted"})
方案3:基于Kubernetes事件告警
如果不需要统计历史驱逐Pod数量,仅需要实时感知驱逐事件,可以部署kube-eventer类的事件采集组件,匹配reason=Evicted、type=Warning的事件直接触发告警,无需调整Prometheus配置。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

