В Kubernetes, помимо постоянно работающих сервисов, есть задачи, которые должны выполниться и завершиться. Для этого используются Jobs и CronJobs, а для подготовки подов к работе — Init Containers.
Jobs (Разовые задачи)
Job создает один или несколько подов и гарантирует, что определенное количество из них успешно завершится. В отличие от Deployment, который перезапускает упавший процесс бесконечно, Job останавливается, когда задача выполнена.
Когда использовать:
- Миграции баз данных.
- Разовая обработка данных или генерация отчетов.
- Пакетная заливка файлов в хранилище.
Пример манифеста Job:
apiVersion: batch/v1
kind: Job
metadata:
name: batch-job
spec:
template:
spec:
containers:
- name: worker
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never # Важно: Job не поддерживает Always
backoffLimit: 4 # Количество попыток перезапуска при ошибке
CronJobs (Задачи по расписанию)
CronJob — это надстройка над Job. Она запускает задачи в определенное время или через равные промежутки, используя стандартный формат cron.
Когда использовать:
- Ежедневный бэкап базы данных.
- Рассылка писем пользователям раз в неделю.
- Очистка кэша или временных файлов по ночам.
Формат расписания:
# ┌───────────── минута (0 - 59)
# │ ┌─────────── час (0 - 23)
# │ │ ┌───────── день месяца (1 - 31)
# │ │ │ ┌─────── месяц (1 - 12)
# │ │ │ │ ┌───── день недели (0 - 6)
# * * * * *
Пример манифеста CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # Запуск каждый день в 02:00 ночи
jobTemplate:
spec:
template:
spec:
containers:
- name: backup-container
image: postgres:14
command: ["/bin/sh", "-c", "pg_dump ..."]
restartPolicy: OnFailure
Init Containers (Инициализирующие контейнеры)
Init Containers — это специализированные контейнеры, которые запускаются до основных контейнеров в поде. Под не станет «готовым» (Ready), пока все Init-контейнеры не завершатся успешно.
Особенности:
- Запускаются строго по очереди.
- Если Init-контейнер упал, Kubernetes будет перезапускать весь под, пока тот не выполнится (если
restartPolicyнеNever). - У них может быть свой набор секретов и прав доступа, отличный от основного контейнера.
Когда использовать:
- Ожидание доступности другого сервиса (например, БД).
- Загрузка конфигурационных файлов или сертификатов из внешнего источника.
- Предварительная настройка файловой системы (chown/chmod).
Пример манифеста с Init Container:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice; do echo waiting for myservice; sleep 2; done"]
Итоговая шпаргалка
| Объект | Жизненный цикл | Главная цель |
|---|---|---|
| Job | Выполнился и умер | Разовая вычислительная задача. |
| CronJob | По расписанию | Регулярное обслуживание и бэкапы. |
| Init Container | Подготовка к старту | Настройка окружения перед запуском основного приложения. |