Saltar al contenido principal

Capítulo 7.4 - CronJobs

Objetivos de Aprendizaje​

Al final de este capítulo, usted será capaz de:

  • Comprender qué es un CronJob
  • Crear y gestionar CronJobs
  • Configurar los schedules con la sintaxis cron
  • Gestionar múltiples jobs y los timeouts
  • Comprender las zonas horarias
  • Implementar tareas programadas

Introducción​

Un CronJob crea Jobs de manera recurrente según un schedule (como cron). Es ideal para tareas programadas: respaldos, reportes, limpieza, etc.


¿Qué es un CronJob?​

Un CronJob crea Jobs de manera recurrente según un schedule definido con la sintaxis cron.

Características​

  • Schedule: Sintaxis cron estándar
  • Job Template: Plantilla para crear los Jobs
  • Concurrency Policy: Gestionar múltiples jobs
  • Suspend: Pausar el CronJob

Sintaxis Cron​

Formato​

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday)
│ │ │ │ │
* * * * *

Ejemplos​

ScheduleDescripción
0 * * * *Cada hora (minuto 0)
0 2 * * *Todos los días a las 2:00
*/15 * * * *Cada 15 minutos
0 0 * * 0Todos los domingos a medianoche
0 9-17 * * 1-5De lunes a viernes, de 9h a 17h
0 0 1 * *El 1 de cada mes a medianoche

Ejemplo Básico​

CronJob Simple​

apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cronjob
spec:
schedule: "*/1 * * * *" # 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

Ejemplo: Respaldo Diario​

CronJob de Respaldo​

apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # Todos los días a las 2:00
timeZone: "America/New_York" # Zona horaria
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 # Mantener 7 respaldos exitosos
failedJobsHistoryLimit: 3 # Mantener 3 respaldos fallidos

Concurrency Policy​

Controla cómo gestionar múltiples jobs:

Allow (Por Defecto)​

Permite varios jobs en 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​

Impide nuevos jobs si un job anterior aún está en ejecución:

spec:
concurrencyPolicy: Forbid

Comportamiento: Si un job aún está en ejecución, el nuevo job es ignorado.

Replace​

Reemplaza el job anterior por uno nuevo:

spec:
concurrencyPolicy: Replace

Comportamiento: El job anterior es eliminado y se crea uno nuevo.


Starting Deadline Seconds​

Timeout para iniciar un 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

Comportamiento: Si un job no puede iniciarse en 5 minutos, se considera perdido.


Suspend​

Pausar un CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
name: suspended-job
spec:
schedule: "0 * * * *"
suspend: true # CronJob suspendido
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure

Vía kubectl:

# Suspender
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'

# Reanudar
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'

Job History​

Successful Jobs History Limit​

Cantidad de jobs exitosos a conservar:

spec:
successfulJobsHistoryLimit: 3 # Mantener 3 jobs exitosos

Failed Jobs History Limit​

Cantidad de jobs fallidos a conservar:

spec:
failedJobsHistoryLimit: 1 # Mantener 1 job fallido

Ventajas:

  • Ver los logs de jobs anteriores
  • Depurar fallos
  • Auditoría e historial

Ejemplo: Limpieza Periódica​

CronJob de Limpieza​

apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-old-files
spec:
schedule: "0 3 * * *" # Todos los días a las 3:00
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 Útiles​

Crear y Gestionar​

# Crear un CronJob
kubectl apply -f cronjob.yaml

# Ver los CronJobs
kubectl get cronjob
kubectl get cj

# Detalles
kubectl describe cronjob daily-backup

# Ver los Jobs creados
kubectl get jobs -l app=backup

# Ver los Pods
kubectl get pods -l job-name=daily-backup-1234567890

Suspender/Reanudar​

# Suspender
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'

# Reanudar
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'

Eliminar​

# Eliminar un CronJob
kubectl delete cronjob daily-backup

# Eliminar junto con los Jobs
kubectl delete cronjob daily-backup --cascade=foreground

Buenas Prácticas​

1. Schedule Apropiado​

Elegir un schedule que no sobrecargue el clúster.

2. Concurrency Policy​

Utilizar Forbid para evitar conflictos si es necesario.

3. Timeouts​

Definir startingDeadlineSeconds y activeDeadlineSeconds en el Job.

4. History Limits​

Configurar los límites para evitar la acumulación de Jobs.

5. Monitoring​

Monitorear los CronJobs para detectar fallos.

6. Timezone​

Especificar la zona horaria si es necesario con timeZone.


Resumen​

En este capítulo, usted ha aprendido:

CronJob: Crea Jobs de manera recurrente según un schedule
Schedule: Sintaxis cron estándar (minuto, hora, día, mes, día de la semana)
Concurrency Policy: Allow, Forbid, Replace
Starting Deadline: Timeout para iniciar un job
Suspend: Pausar un CronJob
Job History: Límites para jobs exitosos/fallidos
Casos de uso: Respaldos, limpieza, reportes, tareas periódicas
Buenas prácticas: Schedule apropiado, timeouts, monitoreo


Próximos Pasos​

Módulo 8: Ingress y Load Balancing
Lab 7.4: Auto-scaling con HPA


Capítulo creado el: Diciembre 2024