Aller au contenu principal

Chapitre 7.3 - Jobs

Objectifs d'Apprentissage

À la fin de ce chapitre, vous serez capable de:

  • Comprendre ce qu'est un Job
  • Créer et gérer des Jobs
  • Configurer les completions et parallelism
  • Gérer les échecs et retries
  • Comprendre les différents types de Jobs
  • Utiliser les Jobs pour le traitement batch

Introduction

Les Jobs créent un ou plusieurs Pods et garantissent qu'un certain nombre d'entre eux se terminent avec succès. Contrairement aux Deployments qui maintiennent des Pods en cours d'exécution, les Jobs exécutent des tâches ponctuelles.


Qu'est-ce qu'un Job?

Un Job crée un ou plusieurs Pods et garantit qu'un certain nombre d'entre eux se terminent avec succès. Les Pods créés par un Job ne sont pas supprimés automatiquement, permettant de voir les logs et déboguer.

Caractéristiques

  • Tâche ponctuelle: Exécute une tâche et se termine
  • Completions: Nombre de succès requis
  • Parallelism: Nombre de Pods en parallèle
  • Retries: Nouveaux Pods en cas d'échec

Types de Jobs

1. Job Simple (Non-parallèle)

Un seul Pod qui doit réussir:

apiVersion: batch/v1
kind: Job
metadata:
name: simple-job
spec:
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo 'Job completed' && sleep 30"]
restartPolicy: Never

2. Job avec Completions

Plusieurs Pods doivent réussir:

apiVersion: batch/v1
kind: Job
metadata:
name: completion-job
spec:
completions: 5 # 5 Pods doivent réussir
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo Processing item $JOB_COMPLETION_INDEX"]
restartPolicy: Never

3. Job Parallèle

Plusieurs Pods en parallèle:

apiVersion: batch/v1
kind: Job
metadata:
name: parallel-job
spec:
completions: 10 # 10 Pods doivent réussir
parallelism: 3 # 3 Pods en parallèle
template:
spec:
containers:
- name: task
image: busybox:1.35
command: ["sh", "-c", "echo Processing && sleep 10"]
restartPolicy: Never

Processus:


Exemple: Traitement de Données

Job de Traitement Batch

apiVersion: batch/v1
kind: Job
metadata:
name: data-processing
spec:
completions: 100 # Traiter 100 items
parallelism: 10 # 10 workers en parallèle
backoffLimit: 3 # 3 retries max
template:
spec:
containers:
- name: processor
image: data-processor:1.0
env:
- name: JOB_COMPLETION_INDEX
valueFrom:
fieldRef:
fieldPath: metadata.labels['batch.kubernetes.io/job-completion-index']
- name: TOTAL_ITEMS
value: "100"
command:
- /app/process.sh
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
restartPolicy: Never

Gestion des Échecs

Backoff Limit

Nombre maximum de retries:

apiVersion: batch/v1
kind: Job
metadata:
name: retry-job
spec:
backoffLimit: 5 # 5 retries max
template:
spec:
containers:
- name: task
image: my-app:1.0
command: ["/app/run.sh"]
restartPolicy: Never

Comportement:

  • Si un Pod échoue, un nouveau Pod est créé
  • Délai exponentiel entre les retries
  • Après backoffLimit échecs, le Job est marqué comme failed

Active Deadline Seconds

Timeout pour le Job:

apiVersion: batch/v1
kind: Job
metadata:
name: timeout-job
spec:
activeDeadlineSeconds: 300 # 5 minutes max
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: Never

Résultat: Le Job est annulé après 5 minutes.


Exemple: Backup

Job de Backup

apiVersion: batch/v1
kind: Job
metadata:
name: database-backup
spec:
template:
spec:
containers:
- name: backup
image: postgres:14
command:
- /bin/bash
- -c
- |
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/
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: backup-storage
mountPath: /backup
volumes:
- name: backup-storage
emptyDir: {}
restartPolicy: Never

Commandes Utiles

Créer et Gérer

# Créer un Job
kubectl apply -f job.yaml

# Voir les Jobs
kubectl get jobs

# Détails
kubectl describe job data-processing

# Voir les Pods
kubectl get pods -l job-name=data-processing

# Logs
kubectl logs -l job-name=data-processing

Supprimer

# Supprimer un Job (supprime aussi les Pods)
kubectl delete job data-processing

# Supprimer avec les Pods
kubectl delete job data-processing --cascade=foreground

Voir les Résultats

# Voir le statut
kubectl get job data-processing -o yaml

# Voir les Pods terminés
kubectl get pods --field-selector=status.phase=Succeeded

Bonnes Pratiques

1. RestartPolicy

Utiliser Never ou OnFailure, jamais Always.

2. Ressources

Définir des limites de ressources pour éviter l'épuisement.

3. Timeouts

Utiliser activeDeadlineSeconds pour éviter les Jobs qui tournent indéfiniment.

4. Nettoyage

Supprimer les Jobs terminés pour libérer les ressources.

5. Monitoring

Surveiller les Jobs pour détecter les échecs.


Résumé

Dans ce chapitre, vous avez appris:

Job: Tâche ponctuelle qui crée des Pods jusqu'à succès
Types: Simple, avec completions, parallèle
Completions: Nombre de succès requis
Parallelism: Nombre de Pods en parallèle
Gestion échecs: backoffLimit, activeDeadlineSeconds
Cas d'usage: Traitement batch, backups, migrations
RestartPolicy: Never ou OnFailure
Bonnes pratiques: Ressources, timeouts, nettoyage


Prochaines Étapes

Chapitre 7.4: CronJobs
Lab 7.3: Jobs et CronJobs


Chapitre créé le: Décembre 2024