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
| Schedule | Descrição |
|---|---|
0 * * * * | A cada hora (minuto 0) |
0 2 * * * | Todos os dias às 2h00 |
*/15 * * * * | A cada 15 minutos |
0 0 * * 0 | Todos os domingos à meia-noite |
0 9-17 * * 1-5 | De 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