В чем разница между Job и CronJob в Kubernetes?

«В чем разница между Job и CronJob в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оба ресурса предназначены для запуска задач, которые должны завершиться, а не работать постоянно как Pod. Основное различие — в режиме запуска.

Job

  • Назначение: Запуск разовой задачи, которая должна быть выполнена до успешного завершения.
  • Поведение: Создает один или несколько Pod (в зависимости от parallelism и completions), которые работают до успешного завершения. После этого Job считается выполненным и больше не перезапускается.
  • Типичные сценарии использования:
    • Пакетная обработка данных.
    • Выполнение миграции базы данных.
    • Запуск тестового набора.
  • Пример манифеста:
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: backup-job
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: postgres:alpine
            command: ["pg_dump", "-h", "db-host", "mydb"]
          restartPolicy: OnFailure

CronJob

  • Назначение: Запуск задач по расписанию, аналогично cron в Linux.
  • Поведение: Создает новый объект Job каждый раз, когда срабатывает расписание, указанное в поле schedule.
  • Типичные сценарии использования:
    • Регулярное создание резервных копий.
    • Периодическая отправка отчетов.
    • Плановое обновление кэшей.
  • Пример манифеста:
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: daily-report
    spec:
      schedule: "0 2 * * *" # Каждый день в 02:00
      jobTemplate: # Шаблон для создаваемых Jobs
        spec:
          template:
            spec:
              containers:
              - name: report-generator
                image: reporting-tool:latest
                command: ["generate-report"]
              restartPolicy: OnFailure

Итог: Job — для одноразового выполнения, CronJob — для периодического запуска Job по расписанию.