有没有办法监控kube cronjob。
我有一个kube cronjob,它在我的集群上每10分钟运行一次..有没有办法在每次我的cronjob由于某些错误而失败时收集指标,或者在我的cronjob在一段时间后没有完成时通知。
答案 0 :(得分:7)
我在kube-state-metrics使用这些规则:
groups:
- name: job.rules
rules:
- alert: CronJobRunning
expr: time() -kube_cronjob_next_schedule_time > 3600
for: 1h
labels:
severity: warning
annotations:
description: CronJob {{$labels.namespaces}}/{{$labels.cronjob}} is taking more than 1h to complete
summary: CronJob didn't finish after 1h
- alert: JobCompletion
expr: kube_job_spec_completions - kube_job_status_succeeded > 0
for: 1h
labels:
severity: warning
annotations:
description: Job completion is taking more than 1h to complete
cronjob {{$labels.namespaces}}/{{$labels.job}}
summary: Job {{$labels.job}} didn't finish to complete after 1h
- alert: JobFailed
expr: kube_job_status_failed > 0
for: 1h
labels:
severity: warning
annotations:
description: Job {{$labels.namespaces}}/{{$labels.job}} failed to complete
summary: Job failed
答案 1 :(得分:5)
这里棘手的部分是cronjobs本身没有有用的状态,你必须将它们与他们创建的作业相匹配。我已经写了一篇关于如何实现这个目标的文章:
https://medium.com/@tristan_96324/prometheus-k8s-cronjob-alerts-94bee7b90511
文章详细介绍了工作原理,但警报配置如下:
groups:
- name: kube-cron
rules:
- record: job_cronjob:kube_job_status_start_time:max
expr: |
label_replace(
label_replace(
max(
kube_job_status_start_time
* ON(exported_job) GROUP_RIGHT()
kube_job_labels{label_cronjob!=""}
) BY (exported_job, label_cronjob)
== ON(label_cronjob) GROUP_LEFT()
max(
kube_job_status_start_time
* ON(exported_job) GROUP_RIGHT()
kube_job_labels{label_cronjob!=""}
) BY (label_cronjob),
"job", "$1", "exported_job", "(.+)"),
"cronjob", "$1", "label_cronjob", "(.+)")
- record: job_cronjob:kube_job_status_failed:sum
expr: |
clamp_max(
job_cronjob:kube_job_status_start_time:max,
1)
* ON(job) GROUP_LEFT()
label_replace(
label_replace(
(kube_job_status_failed != 0),
"job", "$1", "exported_job", "(.+)"),
"cronjob", "$1", "label_cronjob", "(.+)")
- alert: CronJobStatusFailed
expr: |
job_cronjob:kube_job_status_failed:sum
* ON(cronjob) GROUP_RIGHT()
kube_cronjob_labels
> 0
for: 1m
annotations:
description: '{{ $labels.cronjob }} last run has failed {{$value }} times.'
jobTemplate必须包含一个名为cronjob
的标签,该标签与cronjob对象的名称相匹配。
答案 2 :(得分:4)
使用Prometheus监控cronjobs的方法是让他们按下一个指标来指示他们上次成功进入pushgateway的时间。然后你可以提醒一下cronjob最近是否还没有成功。
答案 3 :(得分:2)
kube-state-metrics导出器还包括各种与CronJob相关的指标:https://github.com/kubernetes/kube-state-metrics/blob/master/Documentation/cronjob-metrics.md,但遗憾的是,似乎并未包含CronJob成功/失败的成功。
答案 4 :(得分:1)
我能够简化此中级帖子(出于某种原因,label_replace不适用于我) https://medium.com/@tristan_96324/prometheus-k8s-cronjob-alerts-94bee7b90511
我的cron查询看起来像这样(我们在所有cronjobs上都有“ component”标签,而不是“ cronjob”,但是您可以使用自己喜欢的标签)
clamp_max(max(
kube_job_status_start_time
* ON(job) GROUP_RIGHT()
kube_job_labels{label_component!=""}
) BY (job, label_component)
== ON(label_component) GROUP_LEFT()
max(
kube_job_status_start_time
* ON(job) GROUP_RIGHT()
kube_job_labels{label_component!=""}
) BY (label_component), 1) * ON(job) GROUP_LEFT()
kube_job_status_failed
将其插入Prometheus表达式仪表板以确保获得结果(1表示cron上次失败,0表示cron成功或尚未运行)。
要发出警报,请添加!= 0
,查询将返回任何失败的cronjob。
答案 5 :(得分:0)
您可以从here获取所需信息。
CronJobs按计划创建作业,因此您可以简单地查看创建的作业的kube_job_status_failed,但需要注意的是作业名称最后有一个纪元时间。
为了确保警报自行解决,我在警报管理器中使用以下查询:
increase(kube_job_status_failed{job=~"mytestjob-.*"}[5m]) > 1
我的cron是:
*/5 * * * *`, and I set `backoffLimit: 2
限制每次运行的失败次数。
答案 6 :(得分:0)
到目前为止,所有答案都不知道名称空间,并且取决于Job
中的自定义标签。
后者可以固定为kube-state-metrics版本1.6.0引入的新度量标准kube_job_owner
解决了与Job
和CronJob
匹配的问题。
注意:在kube-state-metrics 1.4.0中,job
标签被重命名为job_name
,以避免标签与Prometheus冲突。
clamp_max(
max by (namespace, owner_name, job_name) (
max by (namespace, owner_name, job_name) (
kube_job_status_start_time
*
on (job_name) group_left(owner_name) max by (namespace, owner_name, job_name) (kube_job_owner{owner_kind="CronJob"})
)
==
on (namespace, owner_name) group_left max by (namespace, owner_name) (
kube_job_status_start_time
*
on (job_name) group_left(owner_name) max by (namespace, owner_name, job_name) (kube_job_owner{owner_kind="CronJob"})
)
),
1
)
*
on (namespace, job_name) group_left kube_job_status_failed
通过重命名owner_name
可以进一步改善输出
通过在表达式周围加上
cronjob
max without (owner_name) (
label_replace(
<expression from above>
,
"cronjob", "$1", "owner_name", "(.+)"
)
)
(label_replace()
函数添加新的cronjob
标签,而max()
删除owner_name
标签)