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
| Schedule | Descripción |
|---|---|
0 * * * * | Cada hora (minuto 0) |
0 2 * * * | Todos los días a las 2:00 |
*/15 * * * * | Cada 15 minutos |
0 0 * * 0 | Todos los domingos a medianoche |
0 9-17 * * 1-5 | De 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