Saltar al contenido principal

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