基于Kubelet与Prometheus,如何查询Pod是否处于CrashloopBackOff状态?
检测AKS集群中Pod CrashLoopBackOff状态的Prometheus查询
基于Kubelet原生指标的精准查询(优先尝试)
如果你的Kubelet暴露了kubelet_container_status_waiting指标,直接用以下查询可以精准匹配处于CrashLoopBackOff状态的容器:
sum by (namespace, pod, container) ( kubelet_container_status_waiting{reason="CrashLoopBackOff"} == 1 )
这个查询会返回所有处于CrashLoopBackOff等待状态的容器,按命名空间、Pod、容器维度聚合,不会产生误报。
基于Cadvisor指标的替代方案(当Kubelet状态指标不可用时)
如果上述指标不可用,结合Cadvisor的重启次数和启动时间指标,可以间接检测CrashLoopBackOff:
sum by (namespace, pod, container) ( rate(container_restarts_total{image!=""}[3m]) >= 2 and (time() - container_start_time_seconds{image!=""}) < 60 )
参数说明:
rate(container_restarts_total[3m]) >=2:设置3分钟内容器重启≥2次的阈值,可根据业务场景调整(比如改为>=1提升灵敏度,或>=3降低误报)time() - container_start_time_seconds <60:过滤出最近60秒内刚重启的容器,避免把正常发布、配置更新导致的单次重启误判为CrashLoopBackOffsum by (namespace, pod, container):按维度聚合结果,方便定位具体故障对象
告警规则示例
将上述查询整合到Prometheus告警规则中:
groups: - name: aks-pod-crashloop-alerts rules: - alert: PodCrashLoopBackOff expr: | sum by (namespace, pod, container) ( rate(container_restarts_total{image!=""}[3m]) >= 2 and (time() - container_start_time_seconds{image!=""}) < 60 ) for: 2m labels: severity: critical annotations: summary: "Pod {{ $labels.pod }} ({{ $labels.namespace }}) 触发CrashLoopBackOff告警" description: "容器 {{ $labels.container }} 在3分钟内已重启 {{ $value }} 次,且最近一次重启在60秒内,疑似进入崩溃循环状态。"
for:2m:要求告警条件持续满足2分钟再触发,过滤瞬时波动导致的误报
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

