Уведомление о задержке выполнения заданий Cron в Kubernetes

У меня есть cronjob, который создает задание резервного копирования postgres. Я хотел бы отправить уведомление на слабые каналы через веб-перехватчик с ошибкой или успехом cronjob status. Как я могу добавить условие или указать статус задания и отправки в резерв? Я полагаю, что также ниже curl-запрос будет работать, но, пожалуйста, предупредите, если вы видите какую-либо ошибку.

kind: CronJob
metadata:
  name: standup
spec:
  schedule: "* 17 * * 1-5"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: standup
            image: busybox
            resources:
              requests:
                cpu: 1m
                memory: 100Mi
            env:
              - args: /bin/sh
              - -c 
              - curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/TQPCENFHP/
      restartPolicy: OnFailure 

~ semural$ kubectl logs $pods -n database
The following backups are available in specified backup path:
Added `s3` successfully.
[2020-04-13 14:24:46 UTC]      0B postgresql-cluster/


NAME                                SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
postgresql-postgresql-helm-backup   0 0 * * *   False     0        8h              18h

NAME                                           COMPLETIONS   DURATION   AGE
postgresql-postgresql-helm-backup-1586822400   1/1           37s        8h
postgresql-postgresql-helm-backup-list         1/1           2s         18h
postgresql-postgresql-helm-pgmon               1/1           49s        18h

person semural    schedule 13.04.2020    source источник
comment
Дайте логи CronJob   -  person Kartoch    schedule 13.04.2020
comment
@Kartoch, я обновил свой вопрос .. Не знаю, как получить логи из cronjob   -  person semural    schedule 13.04.2020
comment
Начальные модули Job и CronJob для выполнения спецификации модуля, поиск модулей с префиксом вашего CronJob и получение их журналов.   -  person Kartoch    schedule 13.04.2020
comment
@Kartoch, думаю, я сделал и обновил свой вопрос   -  person semural    schedule 13.04.2020
comment
Это не лучший журнал, прочтите kubernetes.io/ docs / tasks / job / automatic-tasks-with-cron-jobs, чтобы понять, как именуются job, cronjob и связанные модули.   -  person Kartoch    schedule 13.04.2020
comment
Да, я следил за этим и добавил журналы   -  person semural    schedule 13.04.2020
comment
Это нехорошие бревна. Например, ваш CronJob определен в таблице имен по умолчанию, а с другой стороны вы поместили журналы в pod $ pods в базу данных пространства имен.   -  person Kartoch    schedule 14.04.2020
comment
Не могли бы вы результаты kubectl describe cronjobs standup выложить?   -  person Kartoch    schedule 14.04.2020
comment
Привет, какую версию Kubernetes вы используете?   -  person Piotr Malec    schedule 14.04.2020
comment
@PiotrMalec v1.16   -  person semural    schedule 15.04.2020


Ответы (1)


Я думаю, что мы можем создать простой скрипт для получения статуса cronjob:

import json
import os
from kubernetes import client, config, utils
from kubernetes.client.rest import ApiException
from api.exceptions import BatchApiNamespaceNotExistedException

class Constants:
    BACKOFF_LIMIT = 1
    STATUS_RUNNING = "RUNNING"
    STATUS_SUCCEED = "SUCCEED"
    STATUS_FAILED = "FAILED"
    STATUS_NOT_FOUND = "NOT FOUND"

class KubernetesApi:
    def __init__(self):
        try:
            config.load_incluster_config()
        except:
            config.load_kube_config()
        self.configuration = client.Configuration()
        self.api_instance = client.BatchV1Api(client.ApiClient(self.configuration))
        self.api_instance_v1_beta = client.BatchV1beta1Api(client.ApiClient(self.configuration))

    def get_job_status(self, job):
        if job is not None:
            total_failed_pod = job.status.failed or 0
            total_succeeded_pod = job.status.succeeded or 0
            if total_failed_pod + total_succeeded_pod < Constants.BACKOFF_LIMIT:
                return Constants.STATUS_RUNNING
            elif total_succeeded_pod > 0:
                return Constants.STATUS_SUCCEED
            return Constants.STATUS_FAILED
        return Constants.STATUS_NOT_FOUND

    def get_cron_job_status(self, namespace):
        try:
            cron_job_list = self.api_instance_v1_beta.list_namespaced_cron_job(namespace=namespace,
                                                                          watch=False)
        except ApiException as e:
            raise BatchApiNamespaceNotExistedException("Exception when calling BatchV1Api->list_namespaced_cron_job: %s\n" % e)

        for cron_job in cron_job_list.items:
          if cron_job.status.active is not None:
            for active_cron_job in cron_job.status.active:
              job = self.api_instance.read_namespaced_job(namespace=namespace,
                                                       name=active_cron_job.name)
              if job_status == Constants.STATUS_FAILED:
                # Do whatever you want in there
                print(job_status)

Так что, если статус сбой, мы можем отправить журнал в резерв.

person irvifa    schedule 15.04.2020
comment
спасибо за ответ .. это могут быть простые вопросы, но, во-первых, где я должен хранить этот скрипт, а во-вторых, как мне запустить этот скрипт? - person semural; 15.04.2020
comment
Вы можете создать другое развертывание, содержащее этот скрипт, и сделать это, пока true, чтобы продолжать проверять, есть ли сбой задания. - person irvifa; 15.04.2020
comment
@semural Я поместил код сюда: github.com/irvifa/kubernetes-batch-api -пример - person irvifa; 16.04.2020