Skip to main content

8_Update_Rollback

Update et Rollback

La vien pas sans l'autre...

Update

J'ai préparé deux fichiers : une V1, version de base, et une V2, mise à jour de la V1.

Version V1 :

apiVersion: apps/v1 # La version de notre API
kind: Deployment # Indique que c'est pour deployer un deploiement. Pour retrouver le kind, tapez la commande "sudo kubectl api-resources"
metadata:
  name: hello-world # Le nom du deploiement
spec: # Specificites techniques
  replicas: 1 # Nombre de repliques que nous voulons
  selector: # Selecteur d'etiquettes pour les pods
    matchLabels: # matchLabels est une carte de paires {cle, valeur}. Un seul {cle, valeur} dans la carte
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - image: gcr.io/google-samples/hello-app:1.0 # L'image Docker a utiliser
          name: hello-app # Le nom du conteneur

Version V2 :

apiVersion: apps/v1 # La version de notre API
kind: Deployment # Indique que c'est pour deployer un deploiement. Pour retrouver le kind, tapez la commande "sudo kubectl api-resources"
metadata:
  name: hello-world # Le nom du deploiement
spec: # Specificites techniques
  progressDeadlineSeconds: 10
  replicas: 1 # Nombre de repliques que nous voulons
  selector: # Selecteur d'etiquettes pour les pods
    matchLabels: # matchLabels est une carte de paires {cle, valeur}. Un seul {cle, valeur} dans la carte
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - image: gcr.io/google-samples/hello-app:2.0 # L'image Docker a utiliser
          name: hello-app # Le nom du conteneur

Dans cette section, nous allons aborder la mise à jour de nos pods. Pour déployer la version initiale (V1), exécutez la commande suivante :

kubectl apply -f Hello_world_v1.yaml

Ensuite, vérifiez que tout se passe comme prévu.

kubernetes-13

Une fois nos tests terminés et validés, nous allons appliquer la mise à jour avec la V2 :

kubectl apply -f Hello_world_v2.yaml

Pour suivre l'état de la mise à jour et obtenir davantage d'informations, utilisez cette commande :

kubectl rollout status deployment hello-world

Exemple de sortie :

rohba@master1:~$ kubectl rollout status deployment hello-world
Waiting for deployment "hello-world" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "hello-world" rollout to finish: 1 old replicas are pending termination...
deployment "hello-world" successfully rolled out

![kubernetes-14](https://rohba.eu/uploads/images/gallery/2026-05/kubernetes-14.png)

Assurez-vous que la mise à jour est bien passée à app:2.0 :

kubernetes-15

Ici sur la ligne "Image" il est bien passé en app:2.0

Rollback

Cette section est en lien avec la partie Update. Imaginons qu'au moment de mon déploiement, je commette une faute d'orthographe dans mon manifeste :

apiVersion: apps/v1 # La version de notre API
kind: Deployment # Indique que c'est pour deployer un deploiement. Pour retrouver le kind, tapez la commande "sudo kubectl api-resources"
metadata:
  name: hello-world # Le nom du deploiement
  annotations:
    kubernetes.io/change-cause: "Initial deployment broken" # Annotation pour la cause du changement
spec: # Specificites techniques
  replicas: 1 # Nombre de repliques que nous voulons
  selector: # Selecteur d'etiquettes pour les pods
    matchLabels: # matchLabels est une carte de paires {cle, valeur}. Un seul {cle, valeur} dans la carte
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - image: gcr.io/google-samples/hello-appp:2.0 # L'image Docker a utiliser
          name: hello-app # Le nom du conteneur

J'ai ajouté un 'p' à la ligne.

- image: gcr.io/google-samples/hello-appp:2.0 # L'image Docker a utiliser

Il est essentiel, lors de mises à jour ou de changements importants, d’ajouter des annotations afin de partager des informations claires avec les différents collègues. C'est pour cela que j'ajoute également ajouté une ligne :

kubernetes.io/change-cause: "Initial deployment broken" # Annotation pour la cause du changement

Si cette ligne n'est pas ajoutée et que nous effectuons des mises à jour ou tout autre changement susceptible de modifier l'état des pods, nous n'avons aucune information contextuelle, comme illustré dans l'exemple de sortie ci-dessous

kubernetes-16

Que se passe-t-il si je lance mon manifeste en version V3 alors qu’il contient des erreurs ?

kubectl apply -f Hello_world_v3.yaml

Pour vérifier s'il y a des problèmes, nous utilisons la commande suivante :

kubectl rollout status deployment hello-world

Dans ce cas, nous observons que la sortie affiche une erreur.

kubernetes-17

Et maintenant, vu que nous avons ajouté des annotations :

kubectl rollout history deployment hello-world

Output:

rohba@master1:~$ kubectl rollout history deployment hello-world
deployment.apps/hello-world
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         Initial deployment broken

Nous avons ici trois révisions :

  • 1 - correspond à la V1,
  • 2 - correspond à la V2,
  • 3 - correspond à la V3 avec l'annotation 'Initial deployment broken'.

Si je veux revenir à l'état correspondant à la révision 2, est-ce possible ? Bien sûr ! Pour cela, utilisez la commande suivante :

 kubectl rollout undo deployment hello-world --to-revision=2

Vous pouvez également utiliser cette commande :

kubectl rollout history deployment hello-world --revision=2

Celle-ci permet de consulter les modifications spécifiques à la révision en question (ici, la ligne avec l’index 2).

Voyons si cela a bien fonctionné :

rohba@master1:~$ kubectl rollout undo deployment hello-world --to-revision=2
deployment.apps/hello-world rolled back
rohba@master1:~$ echo $?
0

La révision 2 devient la révision 4, car en revenant à la révision 2 après la révision 3, nous incrémentons à partir de 3. La révision 2 précédente est remplacée et devient inactive. Nouvel historique des révisions :

rohba@master1:~$ kubectl rollout history deployment hello-world
deployment.apps/hello-world
REVISION  CHANGE-CAUSE
1         <none>
3         Initial deployment broken
4         <none>