← Kubernetes: рабочие нагрузки
6 мин · просто · Урок 7 из 11

CronJob: задачи по расписанию

Расписание в UTC, concurrencyPolicy, лимиты истории и другие места, где CronJob неприятно удивляет.

Что вообще такое CronJob

CronJob schedule, timeZone по тику Job копия jobTemplate создаёт Pod команда, exit 0
Два уровня: расписание живёт в CronJob, работа в Pod.

CronJob сидит этажом выше Job. Сам Pod не создаёт. По расписанию запускает новый Job, а уже Job-контроллер создаёт Pod и ждёт его завершения. Двухуровневая конструкция.

Зачем: регулярные задачи. Бэкап раз в час, очистка устаревших записей каждую ночь, синхронизация с внешним API раз в 15 минут. Раньше это был cron на отдельной VM, теперь объект в кластере.

CronJob это batch/v1 (с 1.21, до этого был batch/v1beta1, который удалили в 1.25). Шедулинг делает kube-controller-manager. У него внутри тикает таймер, который сверяется со spec каждую минуту и решает: пора создавать Job или нет.

Минимальный YAML

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello-cron
spec:
  schedule: "* * * * *"
  successfulJobsHistoryLimit: 2
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: hello
              image: busybox:1.36
              command: ["sh", "-c", "echo tick"]

Разбор полей

Расписание считается в UTC, а не по часам пользователя. Запись 0 3 * * * сработает в 03:00 UTC, пока не задан spec.timeZone.

restartPolicy внутри jobTemplate

Только OnFailure или Never, как в обычном Job. Always запрещён. Та же логика: рестартами рулит контроллер, не kubelet.

Связанные команды

kubectl create cronjob hello --image=busybox --schedule='*/5 * * * *' -- echo hi
kubectl get cronjob
kubectl get jobs --watch
kubectl create job --from=cronjob/hello hello-manual  # триггер вручную
kubectl patch cronjob hello -p '{"spec":{"suspend":true}}'
kubectl describe cronjob hello-cron

Что часто ломается

Домашка

Теорию закрепляет задание на своём кластере: 3 шага с проверкой. Кластер поднимается по треку Kubernetes локально, задания лежат в репозитории k8s-practice.

./run.sh start k8s-cronjob     # развернуть стартовое состояние
./run.sh verify k8s-cronjob    # проверить текущий шаг

Коротко

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Что такое Job и CronJob?

K8S-013

Прошли материал до конца? Отметьте урок пройденным.