Deployment Rolling Update y Rollback en Kubernetes


Después de ver en la entrada anterior sobre kubernetes de generar de manera declarativa los diferentes objetos, vamos a ver como podemos hacer un Deployment Rolling Update y Rollback en Kubernetes. Este ejemplo práctico mostrará como podemos volver a la versión anterior de un deployment.

A continuación vamos a crear diferentes versiones de un deployment, haciendo uso de una imagen de mynginx, y vamos a ver como ver su historial de despliegues y como podemos volver hacia la versión anterior.

Para centrarnos en la idea de update y rollback, vamos a hacer el ejemplo de manera empírica.

1. Crear Deployment

Para empezar vamos a crear un Deployment con una imagen de nginx, en lugar de usarlo a través de fichero .YAML, vamos a utilizar Kubectl para crearlo:

kubectl create deployment mynginx --image=nginx:1.15-alpine

Una vez creado vamos a ver los deployment, las replica set y los pods creados, para nginx.

 kubectl get deploy,rs,po -l app=mynginx

Deployment-nginx
Deployment-nginx

Como se puede ver estamos haciendo uso de la etiqueta app=mynginx, con esto evitamos que nos muestre todos los pods, replicaset y deployments y únicamente nos muestre aquellos que tienen esta etiqueta.

2. Escalar el deployment a 3 réplicas

A continuación el deployment realizado anteriormente, vamos a escalarlo a 3 réplicas.

kubectl scale deploy mynginx --replicas=3

y volvemos a listar el los deployment, replicaSet y los Pods:

 kubectl get deploy,rs,po -l app=mynginx

Tras ejecutar la línea de comando anterior vemos como el número de Pods ha aumentado a 3.

Deployment scale 3
Deployment a 3 replicas

Nota: Vamos a guardar el nombre del ReplicaSet para después en nuestro caso es, replicaset.apps/mynginx-76bcb97766

Ahora vamos a asegurarnos de la versión de nginx que hemos desplegado, para ello podemos utilizar el siguiente comando:

kubectl describe deployment

Al desplegar este comando podréis ver algo así:

Name:                   mynginx
Namespace:              default
CreationTimestamp:      Sun, 24 May 2020 17:48:27 +0200
Labels:                 app=mynginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=mynginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=mynginx
  Containers:
   nginx:
    Image:        nginx:1.15-alpine

Y en efecto la imagen previamente desplegada es la 1.15

3. Rollout en Kubernetes

En este punto vamos a ver un rolling update a una versión superior de nginx, sin necesidad de borrar o eliminar el anterior deployment.

Para empezar vamos a ver rollout history, para ello vamos a usar el siguiente comando:

kubectl rollout history deploy mynginx

Podemos ver como por ahora solo hay una Revision:

Rollout history kubernetes
Rollout history

Podemos ver como hay una revisión, que coincide con lo que aparece en el campo annotations del comando describe del punto anterior.

Ahora vamos a ver los detalles de esta Revision, para ello ejecutamos el siguiente comando:

kubectl rollout history deploy mynginx --revision=1

Y obtendremos algo como lo siguiente

deployment.apps/mynginx with revision #1
 Pod Template:
   Labels:    app=mynginx
     pod-template-hash=76bcb97766
   Containers:
    nginx:
     Image:    nginx:1.15-alpine
     Port:    
     Host Port:    
     Environment:    
     Mounts:    
   Volumes:    

Como podemos observar, volvemos a ver la imágen 1.15, a continuación vamos a realizar una actualización de esta imagen, para ellos introducimos el siguiente comando:

kubectl set image deployment mynginx nginx=nginx:1.16-alpine

Ahora si volvemos a mirar el historial, tendremos 2 Revision, la primera que es la original y la segunda que es la que acabamos de crear.

Si miramos otra vez, los deployment, los pods, y los ReplicaSet con el siguiente comando:

kubectl get deploy,rs,po -l app=mynginx

Veremos, como la el objeto ReplicaSet origina ha sido escalado a 0, en nuestro caso corresponde al nombre, replicaset.apps/mynginx-76bcb97766, y se ha creado un nuevo.

Update Image kubernetes
Update Image

Esa Replicaset que ha sido escalada a 0, mantiene guardado el registro del original deployment.

Este nuevo Replicaset esta asociado a la Version 2, que vimos anteriormente.

4. Rollback en Kubernetes

Después de realizar la actualización anterior, hemos visto que no la deberíamos de haber realizado, por lo que queremos volver a la Version 1 de nuestro Deployment, por lo que vamos a introducir el siguiente comando:

kubectl rollout undo deployment mynginx --to-revision=1

Ahora vamos a ver de nuevo el historial y veremos que ahora la Version 1 ha desaparecido y tenemos una nueva la 3, esto es porque la 1 se asocia ahora a la 3. Es decir, se crea una nueva versión que se podría decir que un clon de la 1. Y por supuesto, la Version 2, esta asociada a la versión 1.16 de nginx.

Si volvemos de nuevo a ejecutar el siguiente comando:

kubectl get deploy,rs,po -l app=mynginx

Veremos que la Replicaset inicial vuelve a estar levantada (replicaset.apps/mynginx-76bcb97766) , y la creada con la versión 2 se encuentra a 0.

Conclusión.

En esta entrada hemos visto como hacer mediante un ejemplo un Deployment Rolling Update y Rollback en Kubernetes, y como podemos ir volviendo atrás en el historial de despliegues para volver a versiones anteriores sin problema.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *