如何基于kube-state-metrics为Kubernetes CronJob配置Prometheus告警
Kubernetes CronJob Prometheus告警配置(基于kube-state-metrics)
场景1:CronJob失败告警(含自动恢复与重复通知)
问题分析
你之前使用的count_over_time(kube_job_failed[1m]) > 0无法自动恢复告警,原因是这个表达式统计的是1分钟时间窗口内出现过的失败样本数——即使当前Job已经恢复正常,只要窗口内存在过失败记录,结果就会持续大于0,导致告警无法自动解除。
解决方案
改用kube_job_status_failed指标(kube-state-metrics提供),该指标值为1时表示对应Job当前处于失败状态;当Job被清理或状态恢复后,指标会消失或变为0,告警会自动恢复。
Prometheus告警规则配置
groups: - name: cronjob-alerts rules: - alert: CronJobExecutionFailed expr: kube_job_status_failed{job="kube-state-metrics"} == 1 for: 1m # 持续失败1分钟后触发告警 labels: severity: critical annotations: summary: "CronJob {{ $labels.cronjob }} 执行失败" description: "命名空间 {{ $labels.namespace }} 中,CronJob {{ $labels.cronjob }} 创建的Job {{ $labels.job_name }} 已持续失败1分钟。"
Alertmanager重复通知配置
通过Alertmanager控制告警重复发送间隔,确保1分钟后仍未恢复则每5分钟推送一次:
route: group_by: ['alertname', 'cronjob', 'namespace'] group_wait: 30s # 首次告警等待30秒聚合同组告警 group_interval: 5m # 同组告警后续通知间隔 repeat_interval: 5m # 单个告警重复通知间隔
场景2:CronJob运行时长超过1分钟告警
利用kube_job_start_time指标(记录Job启动的Unix时间戳),计算当前时间与启动时间的差值,判断是否超过1分钟阈值。
Prometheus告警规则配置
groups: - name: cronjob-alerts rules: - alert: CronJobLongRunning expr: time() - kube_job_start_time{job="kube-state-metrics"} > 60 for: 1m # 持续运行超1分钟触发告警 labels: severity: warning annotations: summary: "CronJob {{ $labels.cronjob }} 运行超时" description: "命名空间 {{ $labels.namespace }} 中,CronJob {{ $labels.cronjob }} 创建的Job {{ $labels.job_name }} 已运行 {{ humanizeDuration(time() - $value) }},超过1分钟阈值。"
关键说明
- CronJob创建的Job会自动携带
cronjob=<你的CronJob名称>标签,因此告警规则中可以通过$labels.cronjob直接关联到对应的CronJob。 humanizeDuration是Prometheus内置函数,用于将秒数转换为易读的时长格式(如1分30秒)。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

