Implementación de Actualizaciones Progresivas y Rollback en Kubernetes

La estrategia de actualización progresiva (Rolling Update) en Kubernetes permite actualizar la versión de una aplicación de manera incremental, reemplazando los pods antiguos por nuevos de uno en uno. Este enfoque garantiza una disponibilidad continua del servicio, ya que siempre hay instancias activas durante el proceso de transición, evitando tiempos de inactividad.

A continuación, se demostrará este proceso mediante el despliegue de una aplicación web con tres réplicas, iniciando con una imagen específica y actualizándola a una versión superior.

Despliegue Inicial y Actualización

Se creará un despliegue utilizando una imagen de Nginx en su versión 1.24. La definición del recurso se muestra a continuación:

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

Se aplica la configuración y se verifica el estado de los recursos:

kubectl apply -f webserver.yaml
deployment.apps/webserver created

kubectl get deployment webserver
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
webserver   3/3     3            3           30s

kubectl get replicaset
NAME                   DESIRED   CURRENT   READY   AGE
webserver-7d5b8f9c4    3         3         3       35s

Kuberntees ha creado un ReplicaSet que gestiona tres pods. Para simular una actualización de software, se modifica el manifiesto cambiando la imagen a nginx:1.25 y se ejecuta nuevamente el comando de aplicación.

kubectl apply -f webserver.yaml
deployment.apps/webserver configured

Durante la actualización, se puede observar la transición detallada mediante el comando de descripción:

kubectl describe deployment webserver
...
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  5m     deployment-controller  Scaled up replica set webserver-7d5b8f9c4 to 3
  Normal  ScalingReplicaSet  1m     deployment-controller  Scaled up replica set webserver-8b6c4d7e1 to 1
  Normal  ScalingReplicaSet  1m     deployment-controller  Scaled down replica set webserver-7d5b8f9c4 to 2
  Normal  ScalingReplicaSet  45s    deployment-controller  Scaled up replica set webserver-8b6c4d7e1 to 2
  Normal  ScalingReplicaSet  45s    deployment-controller  Scaled down replica set webserver-7d5b8f9c4 to 1
  Normal  ScalingReplicaSet  30s    deployment-controller  Scaled up replica set webserver-8b6c4d7e1 to 3
  Normal  ScalingReplicaSet  30s    deployment-controller  Scaled down replica set webserver-7d5b8f9c4 to 0

El sistema ha creado un nuevo ReplicaSet asociado a la versión 1.25. La estrategia por defecto aumenta progresivamente las réplicas del nuevo conjunto mientras reduce las del antiguo. Finalmente, el ReplicaSet original mantiene un estado de cero réplicas, permitiendo una posible reversión.

Gestión de Revisiones y Rollback

Kubernetes mantiene un historial de revisiones de los despliegues, lo que permite revertir cambios no deseados. Para ilustrar esto, se realizarán tres actualizaciones consecutivas utilizando archivos de configuración diferentes (v1, v2, v3) y se registrará la causa del cambio mediante anotaciones.

kubectl apply -f webserver_v1.yaml --record
deployment.apps/webserver created

kubectl apply -f webserver_v2.yaml --record
deployment.apps/webserver configured

kubectl apply -f webserver_v3.yaml --record
deployment.apps/webserver configured

Para visualizar el historial de cambios:

kubectl rollout history deployment webserver
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=webserver_v1.yaml --record=true
2         kubectl apply --filename=webserver_v2.yaml --record=true
3         kubectl apply --filename=webserver_v3.yaml --record=true

Si la última versión presenta fallos, se puede revertir a una revisión específica, por ejemplo, la revisión 1:

kubectl rollout undo deployment webserver --to-revision=1
deployment.apps/webserver rolled back

Al verificar nuevamente el historial, se observa que la revisión 1 ha sido promovida a la revisión 4, manteniendo el registro de las versiones intermedias:

kubectl rollout history deployment webserver
REVISION  CHANGE-CAUSE
2         kubectl apply --filename=webserver_v2.yaml --record=true
3         kubectl apply --filename=webserver_v3.yaml --record=true
4         kubectl apply --filename=webserver_v1.yaml --record=true

Este mecanismo ofrece una red de seguridad robusta para la gestión de ciclos de vida de aplicaciones en entornos de producción.

Etiquetas: Kubernetes Deployment Rolling Update DevOps kubectl

Publicado el 10-7 04:43