有没有办法用普罗米修斯来监控kube cron的工作

时间:2017-11-17 05:29:14

标签: kubernetes prometheus

有没有办法监控kube cronjob。

我有一个kube cronjob,它在我的集群上每10分钟运行一次..有没有办法在每次我的cronjob由于某些错误而失败时收集指标,或者在我的cronjob在一段时间后没有完成时通知。

7 个答案:

答案 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解决了与JobCronJob匹配的问题。

注意:在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标签)