Pular para o conteúdo principal

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 backoffLimit falhas, 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