← Kubernetes: рабочие нагрузки
5 мин · просто · Урок 6 из 11

Job: разовая задача до конца

Контроллер для миграций и бэкапов: completions, backoffLimit, restartPolicy и почему Job нельзя чистить удалением Pod.

Что вообще такое Job

Deployment предполагает «приложение работает вечно». Если контейнер вышел, его перезапустят. Job устроен наоборот: «выполни задачу до конца и остановись». Это для миграций БД, бэкапов, разовой конвертации данных, генерации отчёта.

Job это контроллер batch/v1. Создаёт Pod по spec.template, ждёт exit 0, помечает себя Succeeded. Pod падает с ненулевым кодом, Job создаст новый Pod и попробует снова, пока не упрётся в backoffLimit.

Job вычисляет статус из Pod, которые сам же создал. Pod у Job обычно остаются в кластере после завершения, чтобы можно было посмотреть логи. Чистка идёт по ttlSecondsAfterFinished (если задано) или руками.

kubectl delete pod у Job бесполезен: контроллер тут же создаст замену. Чтобы Job перестал плодить Pod, удаляют сам Job.

Минимальный YAML

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-job
spec:
  completions: 1
  backoffLimit: 2
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: hello
          image: busybox:1.36
          command: ["sh", "-c", "echo done; exit 0"]

Разбор полей:

restartPolicy: Never vs OnFailure

При OnFailure kubelet рестартит сам контейнер на том же Pod. При Never Job создаёт новый Pod на каждый ретрай. Поведение видно по-разному: с OnFailure kubectl get pods показывает один Pod с несколькими рестартами, с Never несколько Pod. На дашбордах удобнее Never, виден каждый ретрай.

restartPolicyКто перезапускаетЧто видно в kubectl get pods
NeverJob создаёт новый Podнесколько Pod, по одному на ретрай
OnFailurekubelet рестартит контейнеродин Pod с растущим числом рестартов
Alwaysникто, манифест не примутapiserver отвергает Job

Связанные команды

kubectl create job hello --image=busybox -- sh -c 'echo done'
kubectl get jobs
kubectl get pods -l job-name=hello
kubectl logs -l job-name=hello
kubectl wait --for=condition=complete job/hello --timeout=60s
kubectl delete job hello

Схему полей всегда можно посмотреть прямо из кластера:

kubectl explain job.spec
kubectl explain job.spec.backoffLimit
kubectl explain job.spec.template.spec.restartPolicy

Что часто ломается

Домашка

Теорию закрепляет задание на своём кластере: 2 шага с проверкой. Кластер поднимается по треку Kubernetes локально, задания лежат в репозитории k8s-practice.

./run.sh start k8s-first-job     # развернуть стартовое состояние
./run.sh verify k8s-first-job    # проверить текущий шаг

Коротко

Прошли материал до конца? Отметьте урок пройденным.