Kubernetes · CronJob

Мониторинг Kubernetes CronJob за пределами кластера

Отслеживайте ошибки, зависшие Pod и пропущенные CronJob. Пример YAML с Secret, расписанием и внешними сигналами выполнения.

Free: 5 мониторов, Telegram и email.

Пример уведомления

● nightly-report

Задача началась, но не прислала завершение в допустимое время.

Открыть монитор

Демонстрационные данные. Вид и состав сообщения зависят от канала и типа события.

Когда это нужно

Job может завершиться ошибкой, Pod — не запланироваться, а длинный предыдущий запуск — заблокировать следующий. Просмотр kubectl помогает диагностировать кластер, но не заменяет ожидание результата по расписанию. Внешний монитор заметит отсутствие сигнала и при недоступности самого кластера.

Как подключить

  1. 1

    Создайте cron-монитор с тем же schedule и timeZone. Задайте запас времени на планирование Pod и обычную длительность задачи.

  2. 2

    Добавьте URL пинга в Secret tickwatch с ключом ping-url через ваш обычный процесс управления секретами.

  3. 3

    Замените образ и рабочую команду в примере. Проверьте успешный запуск, ошибку и пропуск на тестовом CronJob.

Готовый пример

Образ должен содержать /bin/sh, curl и ваш скрипт /app/run-job.sh. Нужен исходящий HTTPS-доступ к адресу пинга. Пример — основа для вашего существующего манифеста; проверьте политики сети и права на Secret.

cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-report
spec:
  schedule: "0 3 * * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      backoffLimit: 1
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: job
              image: your-registry/your-job:version
              env:
                - name: PING
                  valueFrom:
                    secretKeyRef:
                      name: tickwatch
                      key: ping-url
                - name: RUN_ID
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.uid
              command: ["/bin/sh", "-c"]
              args:
                - |
                  signal() {
                    curl -fsS --connect-timeout 3 --max-time 5 \
                      -X POST "$PING/$1?rid=$RUN_ID" >/dev/null 2>&1 || true
                  }
                  signal start
                  /app/run-job.sh
                  result=$?
                  if [ "$result" -eq 0 ]; then signal ""; else signal fail; fi
                  exit "$result"

Что проверить перед запуском

  • Forbid запрещает одновременные запуски одного CronJob и может привести к пропуску следующего. Настройте максимальную длительность монитора.

  • При OOMKill или принудительном завершении Pod сигнал ошибки может не уйти. Контроль отсутствующего завершения нужен дополнительно.

  • Secret ограничивает доступ к ключу через Kubernetes, но не заменяет RBAC и защиту секретов в кластере.

Частые вопросы

Tickwatch читает Kubernetes API?

В этом сценарии нет. Контейнер сам отправляет сигналы. Tickwatch не получает доступ к кластеру или его Secret.

Что происходит при повторной попытке Job?

Каждый новый Pod использует свой UID как идентификатор запуска. Ошибка первой попытки и успешное повторение могут дать инцидент и восстановление; учитывайте это в настройках уведомлений.

Проверьте первый запуск, пока задача ещё работает

Создайте монитор, подставьте свой URL пинга и убедитесь, что приходят сигналы и уведомления.

Мониторинг Kubernetes CronJob за пределами кластера · Tickwatch