Что такое правила (rules) для Job в Kubernetes?

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

Ответ

В контексте Kubernetes Job, под «правилами» обычно подразумеваются спецификации (spec), управляющие выполнением и завершением Job'а. Это не отдельный объект rules, а параметры в spec объекта Job.

Ключевые параметры управления Job:

  1. completions (целое число, по умолчанию 1): Количество успешных завершений Pod'ов, необходимое для того, чтобы вся Job считалась выполненной. Полезно для задач, которые нужно обработать N раз.
  2. parallelism (целое число, по умолчанию 1): Максимальное количество Pod'ов, которые могут выполняться параллельно в рамках одной Job. Управляет скоростью обработки.
  3. backoffLimit (целое число, по умолчанию 6): Определяет, сколько раз Kubernetes будет пытаться перезапустить Pod при его неудачном завершении (с ненулевым кодом выхода), прежде чем пометить всю Job как Failed. Счётчик сбрасывается при успешном выполнении Pod'а.
  4. activeDeadlineSeconds (целое число в секундах): Абсолютный лимит времени на выполнение всей Job. Если Job работает дольше, все её Pod'ы завершаются, а сама Job помечается как Failed.
  5. ttlSecondsAfterFinished (целое число в секундах): Время жизни завершённой Job (успешной или неудачной) перед её автоматическим удалением. Помогает очищать историю.

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

apiVersion: batch/v1
kind: Job
metadata:
  name: batch-data-processor
spec:
  completions: 10    # Нужно успешно обработать 10 элементов
  parallelism: 3     # Одновременно могут работать не более 3 Pod'ов
  backoffLimit: 3    # Максимум 3 попытки перезапуска для каждого Pod'а
  activeDeadlineSeconds: 3600 # Вся Job должна уложиться в 1 час
  ttlSecondsAfterFinished: 300 # Удалить Job через 5 минут после завершения
  template:
    spec:
      containers:
      - name: processor
        image: my-registry/data-processor:v1.2
        # Pod получает аргумент с номером задачи
        command: ["/app/process", "$(JOB_COMPLETION_INDEX)"]
        resources:
          requests:
            memory: "128Mi"
            cpu: "200m"
      restartPolicy: Never # Для Job обычно используется Never или OnFailure

Как это работает на практике: Допустим, у нас есть очередь из 10 задач. С параметрами выше Kubernetes будет:

  1. Создавать и запускать Pod'ы, но не более 3 одновременно (parallelism: 3).
  2. Каждый Pod получает уникальный JOB_COMPLETION_INDEX (от 0 до 9).
  3. Если какой-то Pod упадёт с ошибкой, он будет перезапущен (новый Pod), но не более 3 раз (backoffLimit: 3).
  4. Job завершится успешно, когда 10 Pod'ов завершатся с кодом 0 (completions: 10).
  5. Если общее время выполнения превысит 3600 секунд, все Pod'ы будут убиты, Job — Failed.

Такая конфигурация позволяет эффективно управлять ресурсоёмкими пакетными задачами, такими как ночная обработка логов, массовая конвертация данных или запуск нагрузочных тестов.