Короткий ответ
Job запускает Pod для выполнения разовой задачи до её успешного завершения (а не бесконечно, как Deployment), а CronJob создаёт Job по расписанию в формате cron, то есть это механизм повторяющихся по времени задач.
Как это работает подробнее
Job следит за тем, чтобы заданное число Pod успешно завершилось (completions), и при сбое может пересоздать Pod согласно backoffLimit; после успешного завершения Pod не перезапускается. CronJob на основе расписания создаёт новый объект Job в нужный момент времени, делегируя ему фактическое выполнение.
Пример кода
manifest.yaml
apiVersion: batch/v1
kind: CronJob
metadata: { name: nightly-backup }
spec:
schedule: "0 2 * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: backup-tool:1.4Что использовать на практике
- Практика. Job используют для разовых задач — миграции базы данных, пакетная обработка данных, обучение модели; CronJob — для регулярных задач, например ночного бэкапа или ротации отчётов. Важно учитывать политику
concurrencyPolicy(Allow/Forbid/Replace) на случай, если предыдущий запуск ещё не завершился к моменту следующего.
Подводные камни
- Риски. использовать Deployment для разовой задачи вместо Job — Deployment будет бесконечно перезапускать завершившийся Pod, воспринимая завершение как сбой; не задавать
backoffLimitиactiveDeadlineSeconds, из-за чего зависшая задача может выполняться или перезапускаться неограниченно долго; не учитыватьconcurrencyPolicyдля CronJob, что приводит к параллельному выполнению нескольких экземпляров долгой задачи.