# Job, cronjob

**Job**

Выполнения разовой задачи. Если запуск задачи завершается с ошибкой, Job перезапускает поды до успешного выполнения или до истечения таймаутов. Когда задача выполнена, Job считается завершённым и больше никогда в кластере не запускается.

Параметры в spec:

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-ki-1" style="width: 99.0476%; height: 89.3907px;"><thead><tr style="height: 29.7969px;"><td class="align-center" style="width: 25.4658%; height: 29.7969px;">Параметр</td><td class="align-center" style="width: 74.5342%; height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 25.4658%; height: 29.7969px;">activeDeadlineSeconds</td><td style="width: 74.5342%; height: 29.7969px;">количество секунд, которое отводится всему Job (не для одного пода) на выполнение.</td></tr><tr style="height: 29.7969px;"><td style="width: 25.4658%; height: 29.7969px;">backoffLimit</td><td style="width: 74.5342%; height: 29.7969px;">количество попыток. Если указать 2, то Job дважды попробует запустить под и остановится.</td></tr><tr><td style="width: 25.4658%;">ttlSecondsAfterFinished</td><td style="width: 74.5342%;">через сколько секунд специальный TimeToLive контроллер должен удалить завершившийся Job вместе с подами и их логами</td></tr></tbody></table>

После успешного завершения задания манифесты (Job и созданные поды) остаются в кластере навсегда. Все поля Job имеют статус Immutable, и поэтому при создании Job из автоматических сценариев сначала удаляют Job, который остался от предыдущего запуска. Генерация уникальных имен для Job приведет к накоплению ненужных манифестов. Обязательно указание ttlseconds...

При создании бесконечного цикла через activeDeadlineSeconds будет отправлен sigterm, затем через 30 секунд sigkill.

<span style="color: rgb(224, 62, 45);">Если указать backoffLimit без restartPolicy, то при ошибке Job будет выполняться бесконечно.</span>

**Cronjob**

Создание Job по расписанию.

Параметры в spec:

<table border="1" id="bkmrk-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-sc" style="width: 99.0476%; height: 89.3907px;"><thead><tr style="height: 29.7969px;"><td class="align-center" style="width: 25.4658%; height: 29.7969px;">Параметр</td><td class="align-center" style="width: 74.5342%; height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="width: 25.4658%; height: 29.7969px;">schedule</td><td style="width: 74.5342%; height: 29.7969px;">Расписание в виде строчки в cron-формате.</td></tr><tr style="height: 29.7969px;"><td style="width: 25.4658%; height: 29.7969px;">startingDeadlineSeconds</td><td style="width: 74.5342%; height: 29.7969px;">Опциональный. Если по прошествии этого времени job не стартовал, старт отменяется. Желательно вместе с Forbid.</td></tr><tr><td style="width: 25.4658%;">concurrencyPolicy</td><td style="width: 74.5342%;">Одновременное выполнение заданий.

  
Allow позволяет подам следующего задания запускаться. Если задание ежеминутное, за минуту Job не отработал, все равно будет создан ещё один. Одновременно могут выполняться несколько Job’ов. Есть риск перегрузки.

Replace заменяет запущенную нагрузку: старый Job убивается, запускается новый. Не самый лучший вариант, этот вариант осознанно.

  
Forbid запрет запуска новых Job’ов, пока не отработает предыдущий. С этой политикой можно быть уверенным, что всегда запускается только один экземпляр задачи. Используют наиболее часто

</td></tr><tr><td style="width: 25.4658%;">successfulJobsHistoryLimit</td><td style="width: 74.5342%;">Глубина истории хранения удачных job, по умолчанию 3

</td></tr><tr><td style="width: 25.4658%;">failedJobsHistoryLimit</td><td style="width: 74.5342%;">Глубина истории хранения неудачных job, по умолчанию 1

</td></tr></tbody></table>

CronJob использовать аккуратно. Должны быть независимы и иметь возможность работать параллельно. В качестве альтернативы CronJob можно использовать под, в котором запущен самый обычный crond.

**Основные команды**

<div id="bkmrk-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%94%D0%BE%D0%BF.-%D0%BF%D0%B0%D1%80.-%D0%9E%D0%BF"><table border="1" style="width: 100%;"><thead><tr><td class="align-center" style="width: 26.2217%;">Команда</td><td class="align-center" style="width: 19.4417%;">Доп. пар.</td><td class="align-center" style="width: 54.3367%;">Описание</td></tr></thead><tbody><tr><td style="width: 26.2217%;">kubectl get job</td><td style="width: 19.4417%;"> </td><td style="width: 54.3367%;">список job</td></tr><tr><td style="width: 26.2217%;"> </td><td style="width: 19.4417%;">--all-namespaces</td><td style="width: 54.3367%;"> </td></tr><tr><td style="width: 26.2217%;">kubectl delete job jname</td><td style="width: 19.4417%;">  
</td><td style="width: 54.3367%;">Удалить jname</td></tr><tr><td style="width: 26.2217%;">kubectl get cronjobs.batch</td><td style="width: 19.4417%;">  
</td><td style="width: 54.3367%;">Список cronjob</td></tr></tbody></table>

</div>**Примеры**

Job

```
apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  backoffLimit: 2
  activeDeadlineSeconds: 60
  ttlSecondsAfterFinished: 100
  template:
    spec:
      containers:
      - name: hello
        image: busybox
        args: 
        - /bin/sh
        - -c
        - date; echo Hello from the Kubernetes cluster
      restartPolicy: Never
```

Cronjob

```
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Allow
  jobTemplate:
    spec:
      backoffLimit: 2
      activeDeadlineSeconds: 100
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: Never
```