Можно ли запустить Job в Kubernetes без расписания (не CronJob)?

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

Ответ

Да, абсолютно. Job как раз и предназначен для разового запуска задач (пакетных заданий), в отличие от CronJob, который работает по расписанию. Job гарантирует успешное завершение указанного числа Pod'ов.

Пример манифеста для разовой задачи:

apiVersion: batch/v1
kind: Job
metadata:
  name: database-backup
spec:
  completions: 1 # Количество успешных выполнений Pod'ов
  backoffLimit: 3 # Количество попыток при сбое
  template:
    spec:
      containers:
      - name: backup-tool
        image: postgres:15-alpine
        command: ["pg_dump", "-h", "$(DB_HOST)", "-U", "$(DB_USER)", "-d", "mydb", "-f", "/backup/backup.sql"]
        env:
        - name: DB_HOST
          value: "postgres-primary"
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: username
        volumeMounts:
        - name: backup-volume
          mountPath: /backup
      restartPolicy: Never # Для Job рекомендуется Never или OnFailure
      volumes:
      - name: backup-volume
        persistentVolumeClaim:
          claimName: backup-pvc

Запуск: kubectl apply -f backup-job.yaml. Job создаст Pod, выполнит команду и, после её успешного завершения, перейдёт в состояние Completed.