web-dev-qa-db-fra.com

Existe-t-il un moyen de surveiller les travaux kube cron avec Prometheus?

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?.

6
user3587892

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
7
Camil

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.

4
Tristan Colgate

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.

3
brian-brazil

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. 

2
tom.wilkie

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é.

1
Lindsay Landry

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.

0
user1751972