Passer au contenu principal

Workloads (Kubernetes)

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: url
kubectl get jobs
kubectl describe job db-migration
kubectl logs -l job-name=db-migration
kubectl wait --for=condition=complete job/db-migration --timeout=300s

Jobs 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 ttlSecondsAfterFinished sur les Jobs pour éviter l'accumulation
  • Utiliser activeDeadlineSeconds pour é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)

Sources