Jobs et CronJobs
Deployments gèrent des workloads qui tournent en continu. Pour les tâches à exécution unique ou planifiée (migrations de base de données, rapports, sauvegardes), Kubernetes fournit Job et CronJob.
Job
Un Job s'assure qu'un nombre défini de pods se terminent avec succès. Si un pod échoue, le Job en recrée un (jusqu'à backoffLimit).
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
spec:
completions: 1 # Nombre de succès requis (défaut: 1)
parallelism: 1 # Pods exécutés en parallèle (défaut: 1)
backoffLimit: 3 # Tentatives avant échec définitif
activeDeadlineSeconds: 300 # Timeout global du Job
ttlSecondsAfterFinished: 3600 # Nettoyage automatique après 1h
template:
spec:
restartPolicy: OnFailure # Never ou OnFailure (pas Always)
containers:
- name: migration
image: myapp:1.0
command: ["python", "manage.py", "migrate"]
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: urlkubectl get jobs
kubectl describe job db-migration
kubectl logs -l job-name=db-migration
kubectl wait --for=condition=complete job/db-migration --timeout=300sJobs parallèles
Pour traiter une file de travaux en parallèle, on augmente parallelism et completions. Chaque pod traite un item indépendamment (work queue pattern avec une queue externe) ou un index spécifique (indexed Jobs).
spec:
completions: 10 # 10 items à traiter
parallelism: 3 # 3 workers simultanés
completionMode: Indexed # Chaque pod reçoit JOB_COMPLETION_INDEX (0-9)CronJob
Un CronJob crée des Jobs selon un planning cron. La syntaxe cron est standard (5 champs, timezone configurable depuis v1.25).
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # Chaque jour à 2h UTC
timeZone: "Europe/Paris" # v1.25+ — timezone explicite
concurrencyPolicy: Forbid # Allow | Forbid | Replace
successfulJobsHistoryLimit: 3 # Jobs réussis conservés
failedJobsHistoryLimit: 1 # Jobs échoués conservés
startingDeadlineSeconds: 60 # Délai max pour démarrer si en retard
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: backup-tool:1.0
command: ["/backup.sh"]kubectl get cronjobs
kubectl get jobs --watch # Surveiller la création des jobs planifiés
# Déclencher manuellement un CronJob
kubectl create job --from=cronjob/daily-backup manual-backup-$(date +%Y%m%d)concurrencyPolicy
- Allow : plusieurs instances peuvent tourner simultanément (défaut)
- Forbid : si le job précédent tourne encore, la nouvelle exécution est skippée
- Replace : le job précédent est terminé, un nouveau démarre
Bonnes pratiques
- Toujours définir
ttlSecondsAfterFinishedsur les Jobs pour éviter l'accumulation - Utiliser
activeDeadlineSecondspour éviter les Jobs zombies - Tester les Jobs en manuel avant de les passer en CronJob
- Pour les migrations de base de données, préférer un Job Kubernetes à un hook dans le Deployment (meilleur contrôle, rollback possible)