Deployments - ii02735/learn-k8 GitHub Wiki
Les Deployments
Qu'est-ce qu'un Deployment ?
Un Deployment est un contrôleur qui gère les ReplicaSets, et par ricochet les Pods. C'est la manière recommandée de déployer une application sans état (stateless) sur Kubernetes.
On lui décrit l'état désiré :
- l'image et la configuration des containers (via le modèle de Pod)
- le nombre de réplicas (
spec.replicas) - la stratégie de mise à jour (
spec.strategy)
Le Deployment se charge ensuite de faire converger le cluster vers cet état, de façon déclarative.
La hiérarchie : Deployment → ReplicaSet → Pods
- Le Deployment crée et pilote un ReplicaSet par révision (une version du modèle de Pod).
- Le ReplicaSet garantit le nombre de réplicas et crée les Pods.
- À chaque modification du modèle de Pod (nouvelle image, nouvelle variable…), le Deployment crée un nouveau ReplicaSet et conserve l'ancien (mis à l'échelle à 0) pour permettre un rollback.
Les mises à jour (rolling update)
Par défaut, un Deployment utilise la stratégie RollingUpdate : il remplace les Pods progressivement, sans interruption de service.
Deux paramètres contrôlent le rythme :
maxUnavailable: le nombre (ou le pourcentage) de Pods pouvant être indisponibles pendant la mise à jourmaxSurge: le nombre (ou le pourcentage) de Pods supplémentaires pouvant être créés au-dessus du nombre désiré
L'autre stratégie, Recreate, supprime tous les Pods avant d'en recréer : plus simple, mais avec une interruption de service.
:warning: La stratégie RollingUpdate ne suffit pas à garantir zéro coupure : c'est la readinessProbe qui indique au Deployment quand un nouveau Pod est réellement prêt.
Revenir en arrière (rollback)
Le Deployment conserve l'historique de ses révisions (limité par revisionHistoryLimit). On peut donc revenir en arrière très facilement :
- revenir à la révision précédente :
kubectl rollout undo deployment/web - revenir à une révision précise :
kubectl rollout undo deployment/web --to-revision=2 - consulter l'historique :
kubectl rollout history deployment/web
Un manifeste Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: web
spec:
containers:
- name: app
image: nginx:1.27
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
Mettre à l'échelle
Comme pour un ReplicaSet :
- manuellement :
kubectl scale deployment web --replicas=5 - automatiquement : via un HorizontalPodAutoscaler (HPA)
→ Le détail (manuel vs HPA, fonctionnement, VPA, Cluster Autoscaler) est sur La mise à l'échelle.
[!NOTE] Un Deployment ne gère que des applications sans état. Pour une application avec état (base de données, file de messages…), on utilise un StatefulSet ; pour un agent présent sur chaque noeud, un DaemonSet.
Les commandes principales
- Créer un Deployment (impératif) :
kubectl create deployment web --image=nginx - Lister les Deployments :
kubectl get deployments - Obtenir les détails :
kubectl describe deployment web - Suivre une mise à jour :
kubectl rollout status deployment/web - Consulter l'historique :
kubectl rollout history deployment/web - Revenir en arrière :
kubectl rollout undo deployment/web - Changer l'image :
kubectl set image deployment/web app=nginx:1.28 - Redémarrer les Pods :
kubectl rollout restart deployment/web - Mettre à l'échelle :
kubectl scale deployment web --replicas=5 - Supprimer :
kubectl delete deployment web