Kube cronjobを監視する方法はありますか?.
クラスターで10分ごとに実行されるkube cronjobがあります。何らかのエラーが原因でcronjobが失敗するたびにメトリックを収集する方法や、一定期間後にcronjobが完了していない場合に通知する方法はありますか。
私は 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
ここで注意が必要なのは、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
というラベルを含める必要があります。
Prometheusでcronjobsを監視する方法は、crongateが最後にpushgatewayに成功した時間を示すメトリックをプッシュすることです。その後、cronjobが最近十分に成功しなかった場合にアラートを出すことができます。
Kube-state-metricsエクスポーターには、さまざまなCronJob関連のメトリックも含まれています。 https://github.com/kubernetes/kube-state-metrics/blob/master/Documentation/cronjob-metrics.md 、ただし残念ながら、成功したCronJobの成功/失敗は含まれていません。
私はこの中程度の投稿を簡略化することができました(何らかの理由で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ジョブで返されます。
ここ から必要な情報を取得できます。
CronJobsはスケジュールに従ってジョブを作成するため、作成されたジョブのkube_job_status_failedを簡単に確認できます。1つの注意点は、ジョブ名の最後にエポック時間があることです。
アラートが確実に解決されるように、アラートマネージャーで次のクエリを使用しています。
increase(kube_job_status_failed{job=~"mytestjob-.*"}[5m]) > 1
私のcronは:
*/5 * * * *`, and I set `backoffLimit: 2
実行ごとの失敗の数を制限する。