Y at-il un moyen de surveiller kube cronjob.
J'ai un fichier crube de kube qui s'exécute toutes les 10 minutes sur mon cluster. Existe-t-il un moyen de collecter des métriques à chaque fois que mon travail cron échoue en raison d'une erreur ou qu'il avertisse le moment où mon travail n'a pas été terminé au bout d'un certain temps?.
J'utilise ces règles avec 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
La partie délicate ici est que les cronjobs eux-mêmes n’ont pas de statut utile, vous devez les faire correspondre aux emplois qu’ils créent. J'ai écrit un article sur comment y parvenir:
https://medium.com/@tristan_96324/prometheus-k8s-cronjob-alerts-94bee7b90511
L'article décrit en détail comment les choses fonctionnent, mais la configuration de l'alerte est la suivante:
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.'
Le jobTemplate doit inclure une étiquette appelée cronjob
qui correspond au nom de l'objet cronjob.
Pour surveiller les cronjobs avec Prometheus, demandez-leur de transmettre une métrique indiquant la dernière fois où ils ont réussi à accéder à la passerelle. Vous pouvez alors alerter si le travail temporaire n'a pas réussi assez récemment.
L'exportateur kube-state-metrics inclut également diverses métriques liées à CronJob: https://github.com/kubernetes/kube-state-metrics/blob/master/Documentation/cronjob-metrics.md , mais malheureusement, ne le fait pas. t semble inclure le succès/succès de CronJob.
J'ai pu simplifier ce post moyen (label_replace ne fonctionnait pas pour moi pour une raison quelconque) https://medium.com/@tristan_96324/prometheus-k8s-cronjob-alerts-94bee7b90511
Ma requête cron ressemble à ceci (nous avons des étiquettes "composant" sur toutes les tâches cron au lieu de "cronjob", mais vous pouvez utiliser votre étiquette préférée)
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
Branchez ceci dans le tableau de bord de l'expression prometheus pour vous assurer d'obtenir des résultats (1 signifie que le cron a échoué la dernière fois, 0 signifie qu'il a réussi ou qu'il n'a pas encore été exécuté).
Pour alerter, ajoutez != 0
et la requête renverra avec TOUT cronjob ayant échoué.
Vous pouvez obtenir les informations souhaitées de ici .
CronJobs crée des travaux selon un calendrier, afin que vous puissiez simplement regarder kube_job_status_failed pour les travaux créés, une mise en garde est que le nom du travail a une époque à la fin.
Pour garantir la résolution des alertes, j'utilise la requête suivante dans le gestionnaire d'alertes:
increase(kube_job_status_failed{job=~"mytestjob-.*"}[5m]) > 1
Mon cron est:
*/5 * * * *`, and I set `backoffLimit: 2
limiter le nombre d'échecs par cycle.