Capítulo 7.3 - Jobs
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Entender o que é um Job
- Criar e gerenciar Jobs
- Configurar completions e parallelism
- Gerenciar falhas e retries
- Compreender os diferentes tipos de Jobs
- Utilizar Jobs para processamento batch
Introdução
Os Jobs criam um ou mais Pods e garantem que um certo número deles seja concluído com sucesso. Diferente dos Deployments, que mantêm Pods em execução, os Jobs executam tarefas pontuais.
O que é um Job?
Um Job cria um ou mais Pods e garante que um certo número deles seja concluído com sucesso. Os Pods criados por um Job não são removidos automaticamente, permitindo visualizar os logs e depurar.
Características
- Tarefa pontual: Executa uma tarefa e termina
- Completions: Número de execuções bem-sucedidas necessárias
- Parallelism: Número de Pods em paralelo
- Retries: Novos Pods em caso de falha
Tipos de Jobs
1. Job Simples (Não-paralelo)
Apenas um Pod que deve ser bem-sucedido:
apiVersion: batch/v1
kind: Job
metadata:
name: simple-job
spec:
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo 'Job completed' && sleep 30"]
restartPolicy: Never
2. Job com Completions
Vários Pods precisam ser bem-sucedidos:
apiVersion: batch/v1
kind: Job
metadata:
name: completion-job
spec:
completions: 5 # 5 Pods devem ser bem-sucedidos
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo Processing item $JOB_COMPLETION_INDEX"]
restartPolicy: Never
3. Job Paralelo
Vários Pods em paralelo:
apiVersion: batch/v1
kind: Job
metadata:
name: parallel-job
spec:
completions: 10 # 10 Pods devem ser bem-sucedidos
parallelism: 3 # 3 Pods em paralelo
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo Processing && sleep 10"]
restartPolicy: Never
Processo:
Exemplo: Processamento de Dados
Job de Processamento Batch
apiVersion: batch/v1
kind: Job
metadata:
name: data-processing
spec:
completions: 100 # Processar 100 itens
parallelism: 10 # 10 workers em paralelo
backoffLimit: 3 # Máximo de 3 retries
template:
spec:
containers:
- name: processor
image: data-processor:1.0
env:
- name: JOB_COMPLETION_INDEX
valueFrom:
fieldRef:
fieldPath: metadata.labels['batch.kubernetes.io/job-completion-index']
- name: TOTAL_ITEMS
value: "100"
command:
- /app/process.sh
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
restartPolicy: Never
Gerenciamento de Falhas
Backoff Limit
Número máximo de retries:
apiVersion: batch/v1
kind: Job
metadata:
name: retry-job
spec:
backoffLimit: 5 # Máximo de 5 retries
template:
spec:
containers:
- name: task
image: my-app:1.0
command: ["/app/run.sh"]
restartPolicy: Never
Comportamento:
- Se um Pod falhar, um novo Pod é criado
- Delay exponencial entre os retries
- Após
backoffLimitfalhas, o Job é marcado como failed
Active Deadline Seconds
Timeout para o Job:
apiVersion: batch/v1
kind: Job
metadata:
name: timeout-job
spec:
activeDeadlineSeconds: 300 # Máximo de 5 minutos
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: Never
Resultado: O Job é cancelado após 5 minutos.
Exemplo: Backup
Job de Backup
apiVersion: batch/v1
kind: Job
metadata:
name: database-backup
spec:
template:
spec:
containers:
- name: backup
image: postgres:14
command:
- /bin/bash
- -c
- |
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/
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: backup-storage
mountPath: /backup
volumes:
- name: backup-storage
emptyDir: {}
restartPolicy: Never
Comandos Úteis
Criar e Gerenciar
# Criar um Job
kubectl apply -f job.yaml
# Ver os Jobs
kubectl get jobs
# Detalhes
kubectl describe job data-processing
# Ver os Pods
kubectl get pods -l job-name=data-processing
# Logs
kubectl logs -l job-name=data-processing
Remover
# Remover um Job (remove também os Pods)
kubectl delete job data-processing
# Remover com os Pods
kubectl delete job data-processing --cascade=foreground
Ver Resultados
# Ver o status
kubectl get job data-processing -o yaml
# Ver os Pods finalizados
kubectl get pods --field-selector=status.phase=Succeeded
Boas Práticas
1. RestartPolicy
Utilize Never ou OnFailure, nunca Always.
2. Recursos
Defina limites de recursos para evitar esgotamento.
3. Timeouts
Use activeDeadlineSeconds para evitar Jobs que rodem indefinidamente.
4. Limpeza
Remova Jobs finalizados para liberar recursos.
5. Monitoramento
Monitore os Jobs para detectar falhas.
Resumo
Neste capítulo, você aprendeu:
Job: Tarefa pontual que cria Pods até o sucesso
Tipos: Simples, com completions, paralelo
Completions: Número de execuções bem-sucedidas necessárias
Parallelism: Número de Pods em paralelo
Gerenciamento de falhas: backoffLimit, activeDeadlineSeconds
Casos de uso: Processamento batch, backups, migrações
RestartPolicy: Never ou OnFailure
Boas práticas: Recursos, timeouts, limpeza
Próximos Passos
Capítulo 7.4: CronJobs
Lab 7.3: Jobs e CronJobs
Capítulo criado em: Dezembro 2024