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