Chapitre 7.4 - CronJobs
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre ce qu'est un CronJob
- Créer et gérer des CronJobs
- Configurer les schedules avec la syntaxe cron
- Gérer les jobs multiples et les timeouts
- Comprendre les time zones
- Implémenter des tâches planifiées
Introduction
Un CronJob crée des Jobs de manière récurrente selon un schedule (comme cron). C'est idéal pour les tâches planifiées: backups, rapports, nettoyage, etc.
Qu'est-ce qu'un CronJob?
Un CronJob crée des Jobs de manière récurrente selon un schedule défini avec la syntaxe cron.
Caractéristiques
- Schedule: Syntaxe cron standard
- Job Template: Template pour créer les Jobs
- Concurrency Policy: Gérer les jobs multiples
- Suspend: Mettre en pause le CronJob
Syntaxe Cron
Format
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday)
│ │ │ │ │
* * * * *
Exemples
| Schedule | Description |
|---|---|
0 * * * * | Toutes les heures (minute 0) |
0 2 * * * | Tous les jours à 2h00 |
*/15 * * * * | Toutes les 15 minutes |
0 0 * * 0 | Tous les dimanches à minuit |
0 9-17 * * 1-5 | Du lundi au vendredi, de 9h à 17h |
0 0 1 * * | Le 1er de chaque mois à minuit |
Exemple Basique
CronJob Simple
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cronjob
spec:
schedule: "*/1 * * * *" # Toutes les minutes
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
Exemple: Backup Quotidien
CronJob de Backup
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # Tous les jours à 2h00
timeZone: "America/New_York" # Timezone
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 # Garder 7 backups réussis
failedJobsHistoryLimit: 3 # Garder 3 backups échoués
Concurrency Policy
Contrôle comment gérer les jobs multiples:
Allow (Par Défaut)
Permet plusieurs jobs en parallèle:
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
Empêche les nouveaux jobs si un job précédent est encore en cours:
spec:
concurrencyPolicy: Forbid
Comportement: Si un job est encore en cours, le nouveau job est ignoré.
Replace
Remplace le job précédent par un nouveau:
spec:
concurrencyPolicy: Replace
Comportement: Le job précédent est supprimé et un nouveau est créé.
Starting Deadline Seconds
Timeout pour démarrer un job:
apiVersion: batch/v1
kind: CronJob
metadata:
name: deadline-job
spec:
schedule: "0 * * * *"
startingDeadlineSeconds: 300 # 5 minutes
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure
Comportement: Si un job ne peut pas démarrer dans les 5 minutes, il est considéré comme manqué.
Suspend
Mettre en pause un CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: suspended-job
spec:
schedule: "0 * * * *"
suspend: true # CronJob suspendu
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure
Via kubectl:
# Suspendre
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'
# Reprendre
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'
Job History
Successful Jobs History Limit
Nombre de jobs réussis à conserver:
spec:
successfulJobsHistoryLimit: 3 # Garder 3 jobs réussis
Failed Jobs History Limit
Nombre de jobs échoués à conserver:
spec:
failedJobsHistoryLimit: 1 # Garder 1 job échoué
Avantages:
- Voir les logs des jobs précédents
- Déboguer les échecs
- Audit et historique
Exemple: Nettoyage Périodique
CronJob de Nettoyage
apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-old-files
spec:
schedule: "0 3 * * *" # Tous les jours à 3h00
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
Commandes Utiles
Créer et Gérer
# Créer un CronJob
kubectl apply -f cronjob.yaml
# Voir les CronJobs
kubectl get cronjob
kubectl get cj
# Détails
kubectl describe cronjob daily-backup
# Voir les Jobs créés
kubectl get jobs -l app=backup
# Voir les Pods
kubectl get pods -l job-name=daily-backup-1234567890
Suspendre/Reprendre
# Suspendre
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'
# Reprendre
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'
Supprimer
# Supprimer un CronJob
kubectl delete cronjob daily-backup
# Supprimer avec les Jobs
kubectl delete cronjob daily-backup --cascade=foreground
Bonnes Pratiques
1. Schedule Approprié
Choisir un schedule qui ne surcharge pas le cluster.
2. Concurrency Policy
Utiliser Forbid pour éviter les conflits si nécessaire.
3. Timeouts
Définir startingDeadlineSeconds et activeDeadlineSeconds dans le Job.
4. History Limits
Configurer les limites pour éviter l'accumulation de Jobs.
5. Monitoring
Surveiller les CronJobs pour détecter les échecs.
6. Timezone
Spécifier la timezone si nécessaire avec timeZone.
Résumé
Dans ce chapitre, vous avez appris:
CronJob: Crée des Jobs de manière récurrente selon un schedule
Schedule: Syntaxe cron standard (minute, hour, day, month, weekday)
Concurrency Policy: Allow, Forbid, Replace
Starting Deadline: Timeout pour démarrer un job
Suspend: Mettre en pause un CronJob
Job History: Limites pour jobs réussis/échoués
Cas d'usage: Backups, nettoyage, rapports, tâches périodiques
Bonnes pratiques: Schedule approprié, timeouts, monitoring
Prochaines Étapes
Module 8: Ingress et Load Balancing
Lab 7.4: Auto-scaling avec HPA
Chapitre créé le: Décembre 2024