Pular para o conteúdo principal

Capítulo 7.4 - CronJobs

Objetivos de Aprendizagem​

Ao final deste capítulo, você será capaz de:

  • Entender o que é um CronJob
  • Criar e gerenciar CronJobs
  • Configurar agendamentos com a sintaxe cron
  • Gerenciar múltiplos jobs e timeouts
  • Compreender os fusos horários (time zones)
  • Implementar tarefas agendadas

Introdução​

Um CronJob cria Jobs de forma recorrente de acordo com um agendamento (como o cron). É ideal para tarefas agendadas: backups, relatórios, limpeza, etc.


O que é um CronJob?​

Um CronJob cria Jobs de forma recorrente conforme um agendamento definido com a sintaxe cron.

Características​

  • Schedule: Sintaxe cron padrão
  • Job Template: Template para criar os Jobs
  • Concurrency Policy: Gerencia múltiplos jobs
  • Suspend: Pausar o CronJob

Sintaxe Cron​

Formato​

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday)
│ │ │ │ │
* * * * *

Exemplos​

ScheduleDescrição
0 * * * *A cada hora (minuto 0)
0 2 * * *Todos os dias às 2h00
*/15 * * * *A cada 15 minutos
0 0 * * 0Todos os domingos à meia-noite
0 9-17 * * 1-5De segunda a sexta, das 9h às 17h
0 0 1 * *Dia 1 de cada mês à meia-noite

Exemplo Básico​

CronJob Simples​

apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cronjob
spec:
schedule: "*/1 * * * *" # A cada minuto
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.35
command:
- /bin/sh
- -c
- date; echo "Hello from CronJob"
restartPolicy: OnFailure
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1

Exemplo: Backup Diário​

CronJob de Backup​

apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # Todos os dias às 2h00
timeZone: "America/New_York" # Fuso horário
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres:14
command:
- /bin/bash
- -c
- |
echo "Starting backup at $(date)"
pg_dump -h postgres-service -U postgres mydb > /backup/backup-$(date +%Y%m%d).sql
gzip /backup/backup-$(date +%Y%m%d).sql
aws s3 cp /backup/backup-$(date +%Y%m%d).sql.gz s3://backups/
echo "Backup completed at $(date)"
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: backup-storage
mountPath: /backup
volumes:
- name: backup-storage
emptyDir: {}
restartPolicy: OnFailure
successfulJobsHistoryLimit: 7 # Manter 7 backups bem-sucedidos
failedJobsHistoryLimit: 3 # Manter 3 backups com falha

Concurrency Policy​

Controla como gerenciar múltiplos jobs:

Allow (Padrão)​

Permite múltiplos jobs em paralelo:

apiVersion: batch/v1
kind: CronJob
metadata:
name: allow-concurrent
spec:
schedule: "*/5 * * * *"
concurrencyPolicy: Allow
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure

Forbid​

Impede novos jobs se um job anterior ainda estiver em execução:

spec:
concurrencyPolicy: Forbid

Comportamento: Se um job ainda estiver em execução, o novo job é ignorado.

Replace​

Substitui o job anterior por um novo:

spec:
concurrencyPolicy: Replace

Comportamento: O job anterior é removido e um novo é criado.


Starting Deadline Seconds​

Timeout para iniciar um job:

apiVersion: batch/v1
kind: CronJob
metadata:
name: deadline-job
spec:
schedule: "0 * * * *"
startingDeadlineSeconds: 300 # 5 minutos
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure

Comportamento: Se um job não puder ser iniciado em 5 minutos, ele é considerado perdido.


Suspend​

Pausar um CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
name: suspended-job
spec:
schedule: "0 * * * *"
suspend: true # CronJob suspenso
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure

Via kubectl:

# Pausar
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'

# Retomar
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'

Job History​

Successful Jobs History Limit​

Quantidade de jobs bem-sucedidos a manter:

spec:
successfulJobsHistoryLimit: 3 # Manter 3 jobs bem-sucedidos

Failed Jobs History Limit​

Quantidade de jobs com falha a manter:

spec:
failedJobsHistoryLimit: 1 # Manter 1 job com falha

Vantagens:

  • Visualizar os logs de jobs anteriores
  • Depurar falhas
  • Auditoria e histórico

Exemplo: Limpeza Periódica​

CronJob de Limpeza​

apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-old-files
spec:
schedule: "0 3 * * *" # Todos os dias às 3h00
jobTemplate:
spec:
template:
spec:
containers:
- name: cleanup
image: busybox:1.35
command:
- /bin/sh
- -c
- |
echo "Cleaning up files older than 30 days"
find /data -type f -mtime +30 -delete
find /data -type d -empty -delete
echo "Cleanup completed"
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: data-pvc
restartPolicy: OnFailure
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1

Comandos Úteis​

Criar e Gerenciar​

# Criar um CronJob
kubectl apply -f cronjob.yaml

# Ver os CronJobs
kubectl get cronjob
kubectl get cj

# Detalhes
kubectl describe cronjob daily-backup

# Ver os Jobs criados
kubectl get jobs -l app=backup

# Ver os Pods
kubectl get pods -l job-name=daily-backup-1234567890

Pausar/Retomar​

# Pausar
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'

# Retomar
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'

Remover​

# Remover um CronJob
kubectl delete cronjob daily-backup

# Remover junto com os Jobs
kubectl delete cronjob daily-backup --cascade=foreground

Boas Práticas​

1. Agendamento Apropriado​

Escolha um agendamento que não sobrecarregue o cluster.

2. Concurrency Policy​

Use Forbid para evitar conflitos, se necessário.

3. Timeouts​

Defina startingDeadlineSeconds e activeDeadlineSeconds no Job.

4. Limites de Histórico​

Configure os limites para evitar acúmulo de Jobs.

5. Monitoramento​

Monitore os CronJobs para detectar falhas.

6. Timezone​

Especifique o fuso horário se necessário com timeZone.


Resumo​

Neste capítulo, você aprendeu:

CronJob: Cria Jobs de forma recorrente conforme um agendamento
Schedule: Sintaxe cron padrão (minuto, hora, dia, mês, dia da semana)
Concurrency Policy: Allow, Forbid, Replace
Starting Deadline: Timeout para iniciar um job
Suspend: Pausar um CronJob
Job History: Limites para jobs bem-sucedidos/com falha
Casos de uso: Backups, limpeza, relatórios, tarefas periódicas
Boas práticas: Agendamento apropriado, timeouts, monitoramento


Próximos Passos​

Módulo 8: Ingress e Load Balancing
Lab 7.4: Auto-scaling com HPA


Capítulo criado em: Dezembro 2024