Jobs, CronJobs, Init Containers

Jobs, CronJobs, Init Containers

В Kubernetes, помимо постоянно работающих сервисов, есть задачи, которые должны выполниться и завершиться. Для этого используются Jobs и CronJobs, а для подготовки подов к работе — Init Containers.

Jobs (Разовые задачи)

Job создает один или несколько подов и гарантирует, что определенное количество из них успешно завершится. В отличие от Deployment, который перезапускает упавший процесс бесконечно, Job останавливается, когда задача выполнена.

Когда использовать:

  • Миграции баз данных.
  • Разовая обработка данных или генерация отчетов.
  • Пакетная заливка файлов в хранилище.

Пример манифеста Job:

apiVersion: batch/v1
kind: Job
metadata:
  name: batch-job
spec:
  template:
    spec:
      containers:
      - name: worker
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never # Важно: Job не поддерживает Always
  backoffLimit: 4        # Количество попыток перезапуска при ошибке

CronJobs (Задачи по расписанию)

CronJob — это надстройка над Job. Она запускает задачи в определенное время или через равные промежутки, используя стандартный формат cron.

Когда использовать:

  • Ежедневный бэкап базы данных.
  • Рассылка писем пользователям раз в неделю.
  • Очистка кэша или временных файлов по ночам.

Формат расписания:

# ┌───────────── минута (0 - 59)

# │ ┌─────────── час (0 - 23)

# │ │ ┌───────── день месяца (1 - 31)

# │ │ │ ┌─────── месяц (1 - 12)

# │ │ │ │ ┌───── день недели (0 - 6)

# * * * * *

Пример манифеста CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-backup
spec:
  schedule: "0 2 * * *" # Запуск каждый день в 02:00 ночи
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup-container
            image: postgres:14
            command: ["/bin/sh", "-c", "pg_dump ..."]
          restartPolicy: OnFailure

Init Containers (Инициализирующие контейнеры)

Init Containers — это специализированные контейнеры, которые запускаются до основных контейнеров в поде. Под не станет «готовым» (Ready), пока все Init-контейнеры не завершатся успешно.

Особенности:

  • Запускаются строго по очереди.
  • Если Init-контейнер упал, Kubernetes будет перезапускать весь под, пока тот не выполнится (если restartPolicy не Never).
  • У них может быть свой набор секретов и прав доступа, отличный от основного контейнера.

Когда использовать:

  • Ожидание доступности другого сервиса (например, БД).
  • Загрузка конфигурационных файлов или сертификатов из внешнего источника.
  • Предварительная настройка файловой системы (chown/chmod).

Пример манифеста с Init Container:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice; do echo waiting for myservice; sleep 2; done"]

Итоговая шпаргалка

Объект Жизненный цикл Главная цель
Job Выполнился и умер Разовая вычислительная задача.
CronJob По расписанию Регулярное обслуживание и бэкапы.
Init Container Подготовка к старту Настройка окружения перед запуском основного приложения.