web-dev-qa-db-ja.com

prometheusを使用してkube cronジョブを監視する方法はありますか

Kube cronjobを監視する方法はありますか?.

クラスターで10分ごとに実行されるkube cronjobがあります。何らかのエラーが原因でcronjobが失敗するたびにメトリックを収集する方法や、一定期間後にcronjobが完了していない場合に通知する方法はありますか。

10
user3587892

私は 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
10
Camil

ここで注意が必要なのは、cronjobs自体には有用なステータスがないため、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というラベルを含める必要があります。

5
Tristan Colgate

Prometheusでcronjobsを監視する方法は、crongateが最後にpushgatewayに成功した時間を示すメトリックをプッシュすることです。その後、cronjobが最近十分に成功しなかった場合にアラートを出すことができます。

4
brian-brazil

Kube-state-metricsエクスポーターには、さまざまなCronJob関連のメトリックも含まれています。 https://github.com/kubernetes/kube-state-metrics/blob/master/Documentation/cronjob-metrics.md 、ただし残念ながら、成功したCronJobの成功/失敗は含まれていません。

2
tom.wilkie

私はこの中程度の投稿を簡略化することができました(何らかの理由でlabel_replaceが機能しませんでした) https://medium.com/@tristan_96324/prometheus-k8s-cronjob-alerts-94bee7b90511

私のcronクエリは次のようになります(「cronjob」ではなく、すべての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は成功したか、まだ実行されていないことを意味します)。

アラートの場合、!= 0を追加すると、クエリは失敗したcronジョブで返されます。

0
Lindsay Landry

ここ から必要な情報を取得できます。

CronJobsはスケジュールに従ってジョブを作成するため、作成されたジョブのkube_job_status_failedを簡単に確認できます。1つの注意点は、ジョブ名の最後にエポック時間があることです。

アラートが確実に解決されるように、アラートマネージャーで次のクエリを使用しています。

increase(kube_job_status_failed{job=~"mytestjob-.*"}[5m]) > 1

私のcronは:

*/5 * * * *`, and I set `backoffLimit: 2

実行ごとの失敗の数を制限する。

0
user1751972