Gérer et manipuler les Deployments Kubernetes

Dans ce chapitre, nous verrons comment gérer les ReplicaSets et les Pods en un seul même objet k8s nommé le Deployment.

Introduction

Jusqu'ici, nous avions étudié deux types d'objets Kubernetes, à savoir les Pods et les ReplicaSets. Mais, il existe encore un autre niveau plus haut d'abstraction qui permet de gérer ces deux derniers en un seul même objet. Ce nouvel objet Kubernetes se nomme le Deployment (en FR : "déploiement"), que nous allons étudier à travers ce chapitre.

Comment ça marche ? Vous décrivez un état souhaité de vos Pods et de vos ReplicaSets dans un Deployment et le Deployment controller (en FR : "contrôleur de déploiement") modifie l'état actuel à l'état souhaité.

Manipulation des Deployments

Créer un Deployment


Sans un template YAML

Vous pouvez créer un Deployment sans utiliser de template au format YAML, avec la commande kubectl run. Dans cet exemple, nous allons créer trois répliques de Pods utilisant l'image alpine, possédant le label app: alpine et exécutant la commande sleep 1d afin que les Pods soient actifs pendant 1 jour :

kubectl run alpine --image=alpine -r=3 -l="app=alpine" -- sleep 1d

Résultat :

deployment.apps/alpine created

Ensuite vérifions la liste des Deployments Kubernetes en cours de création :

kubectl get deployment

Le résultat est similaire à celui-ci :

NAME     READY   UP-TO-DATE   AVAILABLE   AGE
alpine-deployment   3/3     3            3           3m59s

Avec le template YAML

Voici un autre exemple de Deployment créé depuis un template YAML, afin d'exécuter un ReplicaSet de trois Pods de type nginx :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Le squelette du template YAML, reste le même que celui des ReplicaSets avec le champ replicas ou nous spécifions le nombre de Pods et le champ selector ou nous définissons comment le Deployment trouve les Pods à gérer. Dans ce cas, il ne gérera que les Pods ayant le label app: nginx.

Créons maintenant notre Deployment, à l'aide de la commande ci-dessous :

kubectl create -f nginx-pod.yaml

Revérifions ensuite la liste de nos Deployments :

kubectl get deployment

Résultat :

NAME                READY   UP-TO-DATE   AVAILABLE   AGE
alpine-deployment   3/3     3            0           9s
nginx-deployment    3/3     3            3           3m43s

Récupérer des informations sur votre Deployment

Comme pour les Pods et les ReplicaSets, vous pouvez inspecter votre objet Kubernetes à l'aide de la commande kubectl inspect :

kubectl describe deploy nginx-deployment

En lançant cette commande, vous récupérerez pas mal d'informations comme les spécifications de votre Deployment, et les différents événements qu'a subis votre Deployment.

Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Sun, 25 Aug 2019 03:39:51 +0200
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 5
...
Events:
  Type    Reason             Age                      From                   Message
  ----    ------             ----                     ----                   -------
  Normal  ScalingReplicaSet  30h                      deployment-controller  Scaled up replica set nginx-deployment-7bffc778db to 3
  Normal  ScalingReplicaSet  30h                      deployment-controller  Scaled up replica set nginx-deployment-7d9947b84f to 1
  Normal  ScalingReplicaSet  30h                      deployment-controller  Scaled down replica set nginx-deployment-7d9947b84f to 0
  Normal  ScalingReplicaSet  30h                      deployment-controller  Scaled up replica set nginx-deployment-699d68b967 to 3
  Normal  ScalingReplicaSet  30h                      deployment-controller  Scaled down replica set nginx-deployment-7bffc778db to 0
  Normal  ScalingReplicaSet  <invalid> (x2 over 30h)  deployment-controller  Scaled up replica set nginx-deployment-699d68b967 to 1
  Normal  ScalingReplicaSet  <invalid> (x2 over 30h)  deployment-controller  Scaled down replica set nginx-deployment-7bffc778db to 2
  Normal  ScalingReplicaSet  <invalid> (x2 over 30h)  deployment-controller  Scaled up replica set nginx-deployment-699d68b967 to 2
  Normal  ScalingReplicaSet  <invalid> (x2 over 30h)  deployment-controller  Scaled down replica set nginx-deployment-7bffc778db to 1
  Normal  ScalingReplicaSet  <invalid> (x8 over 30h)  deployment-controller  (combined from similar events): Scaled down replica set nginx-deployment-7bffc778db to 0

Retour en arrière

Vous avez la possibilité de revenir sur une version précédente de votre Deployment en utilisant la méthode kubectl rollout. Dans cet exemple nous allons mettre à jour notre Deployment nginx-deployment, en mettant le nom de l'image des Pods de notre Deployment en nginx version 1.9.1 au lieu de la version latest :

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

Vérifions ensuite l'historique de ce Deployment :

kubectl rollout history deployment/nginx-deployment

Résultat :

deployments "nginx-deployment"
REVISION    CHANGE-CAUSE
1           kubectl create -f nginx-pod.yaml
2           kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

Nous allons vérifier si les Pods de notre Deployment possèdent bel et bien la nouvelle version 1.9.1 de l'image nginx :

kubectl describe deploy nginx-deployment | grep Image

Et c'est bien le cas :

Image:    nginx:1.9.1

Supposons, que nous décidons maintenant d'annuler le Deployment actuel et revenir à la révision précédente, soit à la révision numéro 1. Pour ce faire, nous exécuterons la commande suivante :

kubectl rollout undo deployment/nginx-deployment --to-revision=1

Revérifions une nouvelle fois la version de notre image nginx :

kubectl describe deploy nginx-deployment | grep Image

Résultat :

Image:    nginx

Mise à l'échelle d'un Deployment

Vous pouvez mettre à l'échelle un Deployment à l'aide de la commande suivante :

kubectl scale deployment nginx-deployment --replicas=6

Résultat :

deployment.extensions/nginx-deployment scaled

Vérifions la liste des Deployments disponibles dans notre cluster :

kubectl get deploy

Résultat :

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   6/6     6            6           2m37

Vous pouvez configurer une mise à l'échelle horizontale automatique des Pods de votre Deployment et choisir le nombre minimal et maximal de Pods que vous souhaitez exécuter en fonction de l'utilisation du processeur de vos Pods existants.

Dans cet exemple nous allons créer un autoscaler d'un Deployment avec 2 Pods au minimum et 5 Pods au maximum.

kubectl autoscale deployment nginx-deployment  --min=2 --max=5

Ce qui aura tendance à créer un objet Kubernetes de type HorizontalPodAutoscaler, que nous verrons dans un autre chapitre.

kubectl get hpa

Résultat :

NAME               REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx-deployment   Deployment/nginx-deployment   <unknown>/80%   2         10        3          10m

Comme un Deployment contient à la fois des objets de types ReplicaSets et Pods, alors vous pouvez utiliser les mêmes commandes de manipulation de ces derniers, vu dans le chapitre consacré aux ReplicaSets mais aussi le chapitre consacré aux Pods.

Supprimer votre Deployment

Voici la commande qui permet de supprimer votre Deployment :

kubectl delete deploy nginx-deployment

Résultat :

deployment.extensions "nginx-deployment" deleted

Conclusion

Le Deployment nous permet de gérer plus facilement nos Pods et nos ReplicaSets depuis un seul objet Kubernetes. Comme à mon habitude, voici un récapitulatif des commandes liées aux Deployments.

# Afficher la liste des Deployments
kubectl get deployment [En option <DEPLOYMENT NAME>]
    -o wide : récupérer en plus, le nom de l'image et le sélecteur

# Créer un Deployment
kubectl create -f <template.yaml>

# Supprimer un Deployment
kubectl delete deployment <DEPLOYMENT NAME>

# Appliquer des nouveaux changements à votre Deployment sans le détruire
kubectl apply -f <template.yaml>

# Modifier et appliquer les changements de votre Deployment instantanément sans le détruire
kubectl edit deployment <DEPLOYMENT NAME>

# Afficher les détails d'un Deployment
kubectl describe deployment <DEPLOYMENT NAME>

# Mettre à jour l'image des Pods de votre Deployment
kubectl set image deployment/<DEPLOYMENT NAME> <CONTAINER NAME>=<NEW IMAGE NAME>

# Afficher le status du rolling update de votre Deployment
kubectl rollout status deployment/<DEPLOYMENT NAME>

# Afficher l'historique des révisions de votre Deployment
kubectl rollout history deployment/<DEPLOYMENT NAME>

# Revenir à une version précédente
kubectl rollout undo deployment/nginx-deployment --to-revision=<REVISION NUMBER>

Espace commentaire

Écrire un commentaire

Rejoignez la discussion

Vous devez être connecté pour poster un message.

26 commentaires

ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Pas de souci. Pense à bien tester tes changements avec --dry-run=client -o yaml avant d'appliquer sur le cluster.

02/09/2019 à 05:26
margaud-valette
Membre Actif
Avatar de margaud-valette
margaud-valette
Membre Actif

Merci pour le tuto, c'est beaucoup plus clair sur la gestion des ReplicaSets.

01/09/2019 à 22:06
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Il faut avoir créé le deployment avec le flag --record dans les versions plus anciennes, ou simplement avoir fait des updates successifs.

01/09/2019 à 15:17
cecile91
Membre
Avatar de cecile91
cecile91
Membre

Je n'arrive pas à voir l'historique des révisions, la commande me renvoie vide.

01/09/2019 à 10:25
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui : kubectl rollout restart deployment/<nom>.

01/09/2019 à 03:47
victor-potier
Membre Actif
Avatar de victor-potier
victor-potier
Membre Actif

Est-ce qu'on peut forcer un redémarrage des pods sans changer l'image ?

31/08/2019 à 22:15
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Vérifie tes readinessProbe. Si le pod ne répond pas sur le port défini, le contrôleur ne le considère jamais comme disponible.

31/08/2019 à 16:26
jbaudry
Membre Actif
Avatar de jbaudry
jbaudry
Membre Actif

Mon deployment reste bloqué sur AVAILABLE 0 alors que mes pods sont RUNNING. Une idée ?

31/08/2019 à 09:38
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise kubectl autoscale deployment <nom> --min=2 --max=5 comme indiqué dans le tuto.

31/08/2019 à 03:11
guy09
Membre Actif
Avatar de guy09
guy09
Membre Actif

Je veux scaler mon deployment automatiquement, c'est quoi la commande pour le HPA ?

30/08/2019 à 20:18
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

create échoue si l'objet existe déjà. apply est déclaratif : il met à jour l'objet existant avec tes nouvelles configs.

30/08/2019 à 13:14
joseph-leroy
Membre Actif
Avatar de joseph-leroy
joseph-leroy
Membre Actif

C'est quoi la différence entre kubectl apply et kubectl create pour un deployment ?

30/08/2019 à 09:08
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Non, si le déploiement est supprimé, le contrôleur détruit tout le ReplicaSet et les pods associés. Pense à versionner ton YAML.

30/08/2019 à 03:04
laurent01
Membre Actif
Avatar de laurent01
laurent01
Membre Actif

J'ai supprimé mon deployment par erreur, est-ce que je peux récupérer les pods ?

29/08/2019 à 20:52
riviere-michele
Membre Actif
Avatar de riviere-michele
riviere-michele
Membre Actif

Tu peux faire un kubectl logs -l app=nginx si tu as utilisé les labels comme dans l'exemple de l'article.

29/08/2019 à 13:20
tmarin
Membre Actif
Avatar de tmarin
tmarin
Membre Actif

J'ai besoin de voir les logs des pods gérés par mon deployment, je fais comment ?

29/08/2019 à 05:30
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui, tu dois configurer la strategy de type RollingUpdate dans ton YAML :

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
28/08/2019 à 22:01
olivier00
Membre Actif
Avatar de olivier00
olivier00
Membre Actif

Est-ce que je peux limiter le nombre de pods créés en même temps lors d'un update ?

28/08/2019 à 16:39
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Exact. Vérifie ton tag sur le registre. Si tu veux revenir en arrière rapidement, lance kubectl rollout undo deployment/<nom>.

28/08/2019 à 10:01
timothee73
Membre Actif
Avatar de timothee73
timothee73
Membre Actif

J'ai une erreur ImagePullBackOff après avoir fait un kubectl set image. Mon tag n'existe pas sûrement.

28/08/2019 à 03:22
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Tu as bien sauvegardé le fichier temporaire ? Ne pas oublier que le contrôleur attend une modification valide de la spec pour déclencher le rolling update.

27/08/2019 à 22:48
bouchet-francois
Membre Actif
Avatar de bouchet-francois
bouchet-francois
Membre Actif

J'ai essayé de modifier mon deployment avec kubectl edit mais les changements ne sont pas pris en compte. Pourquoi ?

27/08/2019 à 17:47
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise kubectl rollout status deployment/<nom-deployment>. C'est la commande standard pour suivre la progression du déploiement.

27/08/2019 à 11:24
marc70
Membre Actif
Avatar de marc70
marc70
Membre Actif

Comment je peux monitorer le rollout en temps réel quand je fais un update d'image ?

27/08/2019 à 05:39
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Vérifie tes ressources cluster. Lance kubectl describe pod <nom-du-pod> pour voir si tu n'as pas une erreur de scheduling ou un manque de CPU/RAM.

26/08/2019 à 23:02

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire