K8s em Exemplos: Jobs & CronJobs

Jobs executam uma tarefa até completar. Diferente de Deployments que rodam indefinidamente, Jobs garantem que um número especificado de Pods complete com sucesso. Use para: migrações, processamento batch, backups, tarefas únicas.

job.yaml

Job executa Pods até completar com sucesso. restartPolicy deve ser Never ou OnFailure (obrigatório). backoffLimit: 3 tenta 3 vezes antes de marcar como falho.

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migrate
spec:
  template:
    spec:
      containers:
        - name: migrate
          image: my-app:v1
          command: ["python", "migrate.py"]
      restartPolicy: Never
  backoffLimit: 3
job-parallel.yaml

Modos de completion de Job: NonIndexed (padrão) executa N Pods idênticos. Indexed atribui a cada Pod um índice único (0 a completions-1) via variável de ambiente JOB_COMPLETION_INDEX para particionamento de trabalho.

spec:
  completions: 10
  parallelism: 3
  completionMode: Indexed
  template:
    spec:
      containers:
        - name: worker
          image: worker:v1
          command: ["./process-partition.sh"]
      restartPolicy: Never
job-lifecycle.yaml

backoffLimit: 3 tenta então Job falha. activeDeadlineSeconds: 600 = deve completar em 10 min. ttlSecondsAfterFinished: 3600 = deleta 1 hora depois. OnFailure reinicia container no mesmo Pod; Never cria novo Pod para cada retry.

spec:
  backoffLimit: 3
  activeDeadlineSeconds: 600
  ttlSecondsAfterFinished: 3600
  template:
    spec:
      restartPolicy: OnFailure
job-modes.yaml

Jobs paralelos têm três modos. Primeiro exemplo: contagem fixa de completion (executa 10 total, 3 por vez). Segundo exemplo: fila de trabalho (sem completions = Pods coordenam, feito quando qualquer Pod sai com 0). Terceiro exemplo: Pod único (padrão).

spec:
  completions: 10
  parallelism: 3
---
spec:
  parallelism: 5
---
spec:
  completions: 1
  parallelism: 1
cronjob.yaml

CronJobs executam Jobs em um agendamento usando sintaxe cron (minuto hora dia-do-mês mês dia-da-semana). Exemplos de schedule no código. Use concurrencyPolicy para controlar execuções sobrepostas.

apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-backup
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: backup
              image: backup:v1
          restartPolicy: OnFailure
cronjob-policy.yaml

concurrencyPolicy: Allow (padrão) permite Jobs concorrentes, Forbid pula se anterior rodando, Replace mata anterior. successfulJobsHistoryLimit: 3 mantém 3 completados. startingDeadlineSeconds: 60 deve iniciar dentro de 60s do schedule.

spec:
  schedule: "*/10 * * * *"
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  startingDeadlineSeconds: 60
terminal

Suspenda e retome CronJobs. Dispare execuções manuais do template de CronJob existente. Veja histórico e logs de Job.

$ kubectl patch cronjob nightly-backup \
    -p '{"spec":{"suspend":true}}'
cronjob.batch/nightly-backup patched

$ kubectl patch cronjob nightly-backup \
    -p '{"spec":{"suspend":false}}'
cronjob.batch/nightly-backup patched

$ kubectl create job manual-backup --from=cronjob/nightly-backup
job.batch/manual-backup created
terminal

Debug Jobs verificando status do Pod, logs e status de completion. Jobs falhos mostram eventos de backoff. CronJobs mostram tempos agendados vs reais de execução.

$ kubectl get jobs
NAME           COMPLETIONS   DURATION   AGE
db-migrate     1/1           45s        5m
manual-backup  0/1           2m         2m

$ kubectl describe job db-migrate

$ kubectl logs job/db-migrate
Migration completed successfully

$ kubectl get cronjobs
NAME             SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE
nightly-backup   0 2 * * *     False     0        12h

$ kubectl get jobs -l app=nightly-backup

Índice | GitHub | Use as setas do teclado para navegar |