Jobs - ii02735/learn-k8 GitHub Wiki

Les Jobs

Qu'est-ce qu'un Job ?

Un Job est un objet Kubernetes pour le travail par lots (batch) : il exécute un ou plusieurs Pods jusqu'à la réussite, puis s'arrête.

Contrairement à un Deployment (des Pods permanents qui doivent rester vivants), un Job gère des Pods à durée finie : le Pod doit se terminer tout seul avec succès (exit 0).

  • chaque succès de Pod est compté par le Job ;
  • quand le nombre voulu est atteint, le Job est terminé (Complete) et ne redémarre plus rien ;
  • si un Pod échoue, le Job le relance (dans la limite de backoffLimit).

Un Job avec ses Pods et sa progression

Quand utiliser un Job ?

  • lancer un traitement de données (import, export, transformation) ;
  • exécuter une migration de base de données une seule fois ;
  • générer un rapport, un backup, un travail de nuit ;
  • n'importe quelle tâche qui a un début et une fin.

completions et parallelism

Un Job se pilote avec deux notions :

  • completions : le nombre total de Pods qui doivent réussir pour que le Job soit terminé (par défaut : 1).
  • parallelism : le nombre de Pods qui s'exécutent en même temps (par défaut : 1).

Exemple : completions: 6 avec parallelism: 2 → le Job lance 2 Pods à la fois et s'arrête quand 6 Pods au total ont réussi.

Les relances : backoffLimit

  • spec.backoffLimit limite le nombre de relances en cas d'échec (par défaut : 6).
  • Les relances se font avec un backoff exponentiel (10 s, 20 s, 40 s…) pour ne pas marteler le cluster.
  • Au-delà de la limite, le Job est marqué Failed.

:warning: Pour un Job, restartPolicy doit être OnFailure ou Never — jamais Always : un Pod de Job ne doit pas être redémarré indéfiniment.

Un manifeste Job

apiVersion: batch/v1
kind: Job
metadata:
  name: calcul
spec:
  completions: 6
  parallelism: 2
  backoffLimit: 4
  template:
    spec:
      restartPolicy: OnFailure
      containers:
        - name: calcul
          image: busybox
          command: ["sh", "-c", "echo traitement && sleep 2"]

[!NOTE] ttlSecondsAfterFinished permet de supprimer automatiquement le Job et ses Pods quelques secondes après sa fin (utile pour nettoyer les clusters).

Et pour planifier ? Le CronJob

Pour exécuter un Job régulièrement (sauvegarde de nuit, envoi d'e-mails, purge de logs…), on utilise un CronJob : à chaque déclenchement, il crée un Job qui exécute le travail, puis se termine.

→ Le détail (format schedule, concurrencyPolicy, startingDeadlineSeconds, historique, manifeste) est sur la page Les CronJobs.

Ne pas confondre les workloads

  • Deployment / ReplicaSet : des Pods permanents, maintenus vivants en permanence (services).
  • Job : des Pods à durée finie, jusqu'au succès (batch).
  • CronJob : des Jobs planifiés à intervalles réguliers (voir Les CronJobs).
  • DaemonSet : un Pod permanent sur chaque noeud.
  • StatefulSet : des Pods avec identité et stockage stables (bases de données…).

Les commandes principales

  • Créer un Job (impératif) : kubectl create job calcul --image=busybox -- echo hello
  • Lister les Jobs : kubectl get jobs
  • Obtenir les détails : kubectl describe job calcul
  • Voir la sortie des Pods : kubectl logs job/calcul
  • Supprimer un Job et ses Pods : kubectl delete job calcul
  • Créer un CronJob (impératif) : kubectl create cronjob sauvegarde --image=busybox --schedule="0 2 * * *" -- echo ok
  • Lister les CronJobs : kubectl get cronjobs