Jobs и CronJobs
Что нужно знать перед уроком
- M1.01 — Pod и контейнеры — нужно понимать restartPolicy: OnFailure/Never
Что нужно знать перед уроком
M1 урок 1 — restartPolicy Pod’а. Deployment (M1.02) держит постоянно работающие сервисы; для разовых и периодических задач нужны другие контроллеры.
Теория
Job — гарантированно выполнить задачу до успешного завершения
Job создаёт один или несколько Pod’ов и следит, чтобы они успешно завершились (в отличие от Deployment, где завершение контейнера — повод для перезапуска ради поддержания непрерывной работы). Ключевые поля:
| |
completions/parallelism вместе описывают шаблоны выполнения: completions: 5, parallelism: 1 — пять последовательных успешных запусков; completions: 5, parallelism: 5 — пять параллельных. backoffLimit считает неуспешные попытки одного логического запуска, activeDeadlineSeconds — общий потолок времени по часам, который прерывает Job принудительно, даже если попытки ещё не исчерпаны по backoffLimit.
CronJob — Job по расписанию
CronJob — контроллер, который создаёт новый Job по cron-расписанию:
| |
concurrencyPolicy — что делать, если предыдущий запуск ещё не завершился к моменту следующего по расписанию:
| Значение | Поведение |
|---|---|
Allow (по умолчанию) | параллельные запуски разрешены — может накопиться несколько одновременно работающих Job |
Forbid | новый запуск пропускается, если предыдущий ещё не завершён |
Replace | текущий (незавершённый) Job отменяется, запускается новый |
CronJob проверяет расписание раз в 10 секунд (это фиксированный интервал контроллера, не настраивается). Если задать startingDeadlineSeconds меньше 10 секунд — есть реальный риск, что контроллер просто не успеет заметить, что пропустил окно запуска, до истечения дедлайна, и запуск не случится вообще, без явной ошибки. Практическая рекомендация — не опускать startingDeadlineSeconds ниже 10–15 секунд.successfulJobsHistoryLimit/failedJobsHistoryLimit — сколько завершённых Job (успешных/неудачных отдельно) хранить для истории/диагностики, старые автоматически удаляются сборщиком мусора CronJob-контроллера.
Частые ошибки и подводные камни
restartPolicy: Alwaysв шаблоне Job. Это невалидная комбинация — Job требуетOnFailureилиNever, иначе Kubernetes отклонит объект (контейнер, который должен «успешно завершиться», не может иметь политику «перезапускать всегда»).- Полагаться на
concurrencyPolicy: Allowдля задач, не готовых к параллельному выполнению (например, две параллельные миграции БД). Проверяйте это явно, если задача не идемпотентна. - Ставить
activeDeadlineSecondsменьше времени, реально нужного задаче с учётом повторов — Job будет прерван раньше, чем успеет завершиться легитимно.
Практика в кластере
Wallabag — self-hosted сервис для сохранения статей «на потом» (аналог Pocket), написан на PHP/Symfony — у него есть штатные консольные команды для очистки дублей и импорта, естественно подходящие под Job/CronJob.
| |
- Проверьте фазу Job и Pod:
| |
- Смоделируйте провал и наблюдайте
backoffLimitв действии:
| |
- Создайте CronJob и проверьте расписание:
| |
Практика разработки
Используется официальный образ wallabag/wallabag и busybox для симуляции; собственная сборка — в M3.
Шпаргалка команд урока
| |
Вопросы для самопроверки
completions задаёт нужное число успешных завершений, parallelism — сколько из них выполняются одновременно; для полностью параллельных пяти нужны оба равными 5.
Источник: Kubernetes — job
Это два независимых ограничения: одно по количеству попыток, другое по абсолютному времени выполнения.
Источник: Kubernetes — job
Forbid не позволяет запустить новый Job, пока не завершится предыдущий — в отличие от Allow (оба параллельно) и Replace (отмена старого).
Источник: Kubernetes — cron jobs
Фиксированный 10-секундный цикл проверки контроллера CronJob означает, что более короткий дедлайн рискует быть пропущен без явной ошибки.
Источник: Kubernetes — cron jobs
Job требует OnFailure или Never — Always несовместим с семантикой «выполнить и успешно завершиться».
Источник: Kubernetes — job
Рекомендуемая литература
Официальная документация
- kubernetes.io — concepts/workloads/controllers/job
- kubernetes.io — concepts/workloads/controllers/cron-jobs
- kubernetes.io — Jobs, CronJob.
Статьи и блоги
- Kubernetes для начинающих: что такое Pod и как с ним работать — Flant на Habr.
- Основные концепции сетевой архитектуры Kubernetes — Habr.
- Миграция с ingress-nginx: выбор нового контроллера — Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
- Kelsey Hightower, Brendan Burns, Joe Beda. Kubernetes: Up and Running. 3rd ed., 2022. ISBN 978-1098110201.
- Michael Hausenblas, Stefan Schimanski. Programming Kubernetes. 2019. ISBN 978-1492047107.
Связанные материалы
- Предыдущий урок: M1.09 — Gateway API.
- Следующий урок: M1.11 — RBAC.
- Дальше: паттерн «Job-миграция перед Deployment» через аннотации Nelm — M6 урок 4.
✓ Урок пройден — все вопросы самопроверки отвечены верно