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