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.

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

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

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

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.

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>