Aller au contenu principal

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​

ScheduleDescription
0 * * * *Toutes les heures (minute 0)
0 2 * * *Tous les jours à 2h00
*/15 * * * *Toutes les 15 minutes
0 0 * * 0Tous les dimanches à minuit
0 9-17 * * 1-5Du 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