Capítulo 7.3 - Jobs
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender qué es un Job
- Crear y gestionar Jobs
- Configurar completions y parallelism
- Gestionar fallos y retries
- Comprender los diferentes tipos de Jobs
- Utilizar Jobs para el procesamiento batch
Introducción
Los Jobs crean uno o varios Pods y garantizan que una cierta cantidad de ellos finalicen con éxito. A diferencia de los Deployments, que mantienen Pods en ejecución, los Jobs ejecutan tareas puntuales.
¿Qué es un Job?
Un Job crea uno o varios Pods y garantiza que una cierta cantidad de ellos finalicen con éxito. Los Pods creados por un Job no se eliminan automáticamente, lo que permite ver los logs y depurar.
Características
- Tarea puntual: Ejecuta una tarea y finaliza
- Completions: Número de éxitos requeridos
- Parallelism: Número de Pods en paralelo
- Retries: Nuevos Pods en caso de fallo
Tipos de Jobs
1. Job Simple (No paralelo)
Un solo Pod que debe finalizar con éxito:
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 con Completions
Varios Pods deben finalizar con éxito:
apiVersion: batch/v1
kind: Job
metadata:
name: completion-job
spec:
completions: 5 # 5 Pods deben finalizar con éxito
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo Processing item $JOB_COMPLETION_INDEX"]
restartPolicy: Never
3. Job Paralelo
Varios Pods en paralelo:
apiVersion: batch/v1
kind: Job
metadata:
name: parallel-job
spec:
completions: 10 # 10 Pods deben finalizar con éxito
parallelism: 3 # 3 Pods en paralelo
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo Processing && sleep 10"]
restartPolicy: Never
Proceso:
Ejemplo: Procesamiento de Datos
Job de Procesamiento Batch
apiVersion: batch/v1
kind: Job
metadata:
name: data-processing
spec:
completions: 100 # Procesar 100 ítems
parallelism: 10 # 10 workers en paralelo
backoffLimit: 3 # 3 retries máximo
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
Gestión de Fallos
Backoff Limit
Número máximo de retries:
apiVersion: batch/v1
kind: Job
metadata:
name: retry-job
spec:
backoffLimit: 5 # 5 retries máximo
template:
spec:
containers:
- name: task
image: my-app:1.0
command: ["/app/run.sh"]
restartPolicy: Never
Comportamiento:
- Si un Pod falla, se crea un nuevo Pod
- Retardo exponencial entre los retries
- Después de
backoffLimitfallos, el Job se marca como failed
Active Deadline Seconds
Timeout para el Job:
apiVersion: batch/v1
kind: Job
metadata:
name: timeout-job
spec:
activeDeadlineSeconds: 300 # 5 minutos máximo
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: Never
Resultado: El Job se cancela después de 5 minutos.
Ejemplo: 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 Útiles
Crear y Gestionar
# Crear un Job
kubectl apply -f job.yaml
# Ver los Jobs
kubectl get jobs
# Detalles
kubectl describe job data-processing
# Ver los Pods
kubectl get pods -l job-name=data-processing
# Logs
kubectl logs -l job-name=data-processing
Eliminar
# Eliminar un Job (elimina también los Pods)
kubectl delete job data-processing
# Eliminar con los Pods
kubectl delete job data-processing --cascade=foreground
Ver los Resultados
# Ver el estado
kubectl get job data-processing -o yaml
# Ver los Pods finalizados
kubectl get pods --field-selector=status.phase=Succeeded
Buenas Prácticas
1. RestartPolicy
Utilice Never o OnFailure, nunca Always.
2. Recursos
Defina límites de recursos para evitar el agotamiento.
3. Timeouts
Utilice activeDeadlineSeconds para evitar Jobs que se ejecuten indefinidamente.
4. Limpieza
Elimine los Jobs finalizados para liberar recursos.
5. Monitoring
Supervise los Jobs para detectar fallos.
Resumen
En este capítulo, usted ha aprendido:
Job: Tarea puntual que crea Pods hasta el éxito
Tipos: Simple, con completions, paralelo
Completions: Número de éxitos requeridos
Parallelism: Número de Pods en paralelo
Gestión de fallos: backoffLimit, activeDeadlineSeconds
Casos de uso: Procesamiento batch, backups, migraciones
RestartPolicy: Never u OnFailure
Buenas prácticas: Recursos, timeouts, limpieza
Próximos Pasos
Capítulo 7.4: CronJobs
Lab 7.3: Jobs y CronJobs
Capítulo creado el: Diciembre 2024