Actualizar y revertir aplicaciones

KubernetesBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás cómo actualizar y revertir aplicaciones desplegadas en un clúster de Kubernetes. Comenzarás configurando un clúster de Kubernetes local utilizando Minikube, luego desplegarás una aplicación de muestra de NGINX. A continuación, actualizarás la imagen de la aplicación y verificarás que la actualización se haya realizado con éxito. Para simular fallos de actualización, diagnosticarás los problemas y luego revertirás a una versión estable. Finalmente, ajustarás la estrategia de actualización gradual en el archivo YAML del Despliegue (Deployment).

Iniciar el clúster de Kubernetes

En este paso, aprenderás cómo iniciar y verificar un clúster de Kubernetes local utilizando Minikube. Este es un primer paso crucial para configurar tu entorno de desarrollo de Kubernetes.

Primero, asegúrate de estar en el directorio del proyecto:

cd ~/project

Inicia el clúster de Minikube:

minikube start

Ejemplo de salida:

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀  Launching Kubernetes...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

Verifica el estado del clúster:

minikube status

Ejemplo de salida:

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Comprueba los nodos del clúster:

kubectl get nodes

Ejemplo de salida:

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

Puntos clave sobre este paso:

  1. minikube start crea un clúster de Kubernetes local de un solo nodo
  2. El clúster utiliza Docker como controlador (driver) predeterminado
  3. Kubernetes v1.26.1 se configura automáticamente
  4. minikube status y kubectl get nodes confirman la preparación del clúster

Desplegar una aplicación de muestra

En este paso, aprenderás cómo crear y desplegar una aplicación web simple utilizando un Despliegue (Deployment) de Kubernetes. Utilizaremos una imagen de NGINX como nuestra aplicación de muestra para demostrar el proceso de despliegue.

Primero, navega al directorio del proyecto:

cd ~/project
mkdir -p k8s-manifests
cd k8s-manifests

Crea un nuevo manifiesto de despliegue para una aplicación web:

nano nginx-deployment.yaml

Agrega el siguiente contenido al archivo:

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

Guarda el archivo y sal del editor nano.

Despliega la aplicación utilizando kubectl:

kubectl apply -f nginx-deployment.yaml

Ejemplo de salida:

deployment.apps/web-app created

Verifica el despliegue:

kubectl get deployments

Ejemplo de salida:

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
web-app   3/3     3            3           30s

Comprueba los pods creados:

kubectl get pods -l app=web

Ejemplo de salida:

NAME                      READY   STATUS    RESTARTS   AGE
web-app-xxx-yyy           1/1     Running   0          45s
web-app-xxx-zzz           1/1     Running   0          45s
web-app-xxx-www           1/1     Running   0          45s

Puntos clave sobre este despliegue:

  1. Creamos un Despliegue con 3 réplicas de un servidor web NGINX
  2. Utilizamos una versión específica y estable de NGINX (1.23.3-alpine)
  3. Exponemos el puerto 80 del contenedor
  4. Utilizamos etiquetas (labels) para identificar y gestionar los pods

Actualizar la imagen de la aplicación en el YAML del Despliegue

En este paso, aprenderás cómo actualizar la imagen del contenedor en un Despliegue (Deployment) de Kubernetes, simulando un escenario de actualización de aplicación del mundo real.

Primero, asegúrate de estar en el directorio correcto:

cd ~/project/k8s-manifests

Abre el manifiesto de despliegue existente:

nano nginx-deployment.yaml

Actualiza la imagen de nginx:1.23.3-alpine a una versión más reciente:

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

Aplica el despliegue actualizado:

kubectl apply -f nginx-deployment.yaml

Ejemplo de salida:

deployment.apps/web-app configured

Observa el proceso de actualización del despliegue:

kubectl rollout status deployment web-app

Ejemplo de salida:

Waiting for deployment "web-app" to roll out...
Waiting for deployment spec update to be applied...
Waiting for available replicas to reach desired number...
deployment "web-app" successfully rolled out

Verifica la nueva versión de la imagen:

kubectl get pods -l app=web -o jsonpath='{.items[*].spec.containers[0].image}'

Ejemplo de salida:

nginx:1.24.0-alpine nginx:1.24.0-alpine nginx:1.24.0-alpine

Puntos clave sobre las actualizaciones de imágenes:

  1. Utiliza kubectl apply para actualizar los despliegues
  2. Kubernetes realiza una actualización gradual (rolling update) por defecto
  3. Los pods se reemplazan gradualmente para mantener la disponibilidad de la aplicación
  4. El proceso de actualización garantiza un despliegue sin tiempo de inactividad (zero-downtime deployment)

Verificar la actualización exitosa

En este paso, aprenderás cómo verificar que la actualización de tu despliegue de Kubernetes se haya realizado con éxito examinando las versiones de los pods, su estado y detalles adicionales del despliegue.

Primero, lista los pods con información detallada:

kubectl get pods -l app=web -o wide

Ejemplo de salida:

NAME                      READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
web-app-xxx-yyy           1/1     Running   0          3m    10.244.0.5   minikube   <none>           <none>
web-app-xxx-zzz           1/1     Running   0          3m    10.244.0.6   minikube   <none>           <none>
web-app-xxx-www           1/1     Running   0          3m    10.244.0.7   minikube   <none>           <none>

Comprueba las versiones específicas de las imágenes de los pods:

kubectl get pods -l app=web -o jsonpath='{range.items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

Ejemplo de salida:

web-app-xxx-yyy    nginx:1.24.0-alpine
web-app-xxx-zzz    nginx:1.24.0-alpine
web-app-xxx-www    nginx:1.24.0-alpine

Describe el despliegue para obtener información más detallada:

kubectl describe deployment web-app

Ejemplo de salida:

Name:                   web-app
Namespace:              default
CreationTimestamp:      [current timestamp]
Labels:                 app=web
Annotations:            deployment.kubernetes.io/revision: 2
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=web
  Containers:
   nginx:
    Image:        nginx:1.24.0-alpine
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable

Verifica el historial de implementaciones (rollout history):

kubectl rollout history deployment web-app

Ejemplo de salida:

REVISION  CHANGE-CAUSE
1         <none>
2         <none>

Puntos clave sobre la verificación:

  1. Todos los pods están ejecutando la nueva versión de la imagen
  2. El despliegue tiene 3 réplicas disponibles
  3. La estrategia de implementación (rollout strategy) garantiza actualizaciones sin tiempo de inactividad
  4. La revisión del despliegue se ha incrementado

Simular y diagnosticar fallos de actualización

En este paso, aprenderás cómo diagnosticar posibles fallos en la actualización de un despliegue simulando una actualización de imagen problemática y utilizando las herramientas de diagnóstico de Kubernetes.

Primero, navega al directorio del proyecto:

cd ~/project/k8s-manifests

Crea un manifiesto de despliegue con una imagen no válida:

nano problematic-deployment.yaml

Agrega el siguiente contenido:

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

Aplica el despliegue problemático:

kubectl apply -f problematic-deployment.yaml

Ejemplo de salida:

deployment.apps/troubleshoot-app created

Comprueba el estado del despliegue:

kubectl rollout status deployment troubleshoot-app

Ejemplo de salida:

Waiting for deployment "troubleshoot-app" to roll out...

Presiona Ctrl+C para salir del seguimiento del estado del despliegue.

Comprueba los eventos y el estado de los pods:

kubectl get pods -l app=troubleshoot

Ejemplo de salida:

NAME                              READY   STATUS             RESTARTS   AGE
troubleshoot-app-6b8986c555-gcjj9   0/1     ImagePullBackOff   0          2m56s
troubleshoot-app-6b8986c555-p29dp   0/1     ImagePullBackOff   0          2m56s
troubleshoot-app-6b8986c555-vpv5q   0/1     ImagePullBackOff   0          2m56s

Examina los detalles y los registros (logs) del pod:

## Replace 'xxx-yyy' with your actual pod name
POD_NAME=$(kubectl get pods -l app=troubleshoot -o jsonpath='{.items[0].metadata.name}')
kubectl describe pod $POD_NAME
kubectl logs $POD_NAME

Verás el estado del pod y los registros que indican el fallo al extraer la imagen.

Failed to pull image "nginx:non-existent-tag"

Soluciona el problema corregiendo la imagen:

nano problematic-deployment.yaml

Actualiza la imagen a una etiqueta (tag) válida:

image: nginx:1.24.0-alpine

Vuelve a aplicar el despliegue corregido:

kubectl apply -f problematic-deployment.yaml

Comprueba el estado de los pods de nuevo:

kubectl get pods -l app=troubleshoot

Ejemplo de salida:

NAME                                READY   STATUS    RESTARTS   AGE
troubleshoot-app-5dc9b58d57-bvqbr   1/1     Running   0          5s
troubleshoot-app-5dc9b58d57-tdksb   1/1     Running   0          8s
troubleshoot-app-5dc9b58d57-xdq5n   1/1     Running   0          6s

Puntos clave para diagnosticar fallos:

  1. Utiliza kubectl describe para ver los eventos del despliegue y de los pods
  2. Comprueba el estado de los pods en busca de ImagePullBackOff u otros estados de error
  3. Examina los registros de los pods para obtener información detallada sobre el error
  4. Verifica la disponibilidad de la imagen y la corrección de la etiqueta

Revertir a una versión estable

En este paso, aprenderás cómo revertir un despliegue de Kubernetes a una versión estable anterior utilizando el comando kubectl rollout undo.

Primero, navega al directorio del proyecto:

cd ~/project/k8s-manifests

Comprueba el historial de implementaciones (rollout history) de la aplicación web:

kubectl rollout history deployment web-app

Ejemplo de salida:

REVISION  CHANGE-CAUSE
1         <none>
2         <none>

Verifica los detalles del despliegue actual:

kubectl describe deployment web-app | grep Image

Ejemplo de salida:

    Image:        nginx:1.24.0-alpine

Realiza la reversión (rollback) a la revisión anterior:

kubectl rollout undo deployment web-app

Ejemplo de salida:

deployment.apps/web-app rolled back

Verifica la reversión:

kubectl rollout status deployment web-app

Ejemplo de salida:

Waiting for deployment "web-app" to roll out...
deployment "web-app" successfully rolled out

Comprueba la versión de la imagen actualizada:

kubectl get pods -l app=web -o jsonpath='{range.items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

Ejemplo de salida:

web-app-xxx-yyy    nginx:1.23.3-alpine
web-app-xxx-zzz    nginx:1.23.3-alpine
web-app-xxx-www    nginx:1.23.3-alpine

Confirma el historial de implementaciones:

kubectl rollout history deployment web-app

Ejemplo de salida:

REVISION  CHANGE-CAUSE
2         <none>
3         <none>

Puntos clave sobre la reversión:

  1. kubectl rollout undo revierte a la revisión anterior del despliegue
  2. Kubernetes mantiene un historial de los cambios en los despliegues
  3. La reversión se realiza sin tiempo de inactividad
  4. La reversión crea una nueva revisión en el historial

Ajustar la estrategia de actualización gradual en el YAML del Despliegue

En este paso, aprenderás cómo personalizar la estrategia de actualización gradual (rolling update) en un Despliegue (Deployment) de Kubernetes para controlar cómo se actualizan y escalan las aplicaciones.

Primero, navega al directorio del proyecto:

cd ~/project/k8s-manifests

Crea un nuevo manifiesto de despliegue con una estrategia de actualización gradual personalizada:

nano custom-rollout-deployment.yaml

Agrega el siguiente contenido:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app-custom-rollout
  labels:
    app: web
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
      maxSurge: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.24.0-alpine
          ports:
            - containerPort: 80

Aplica el despliegue:

kubectl apply -f custom-rollout-deployment.yaml

Ejemplo de salida:

deployment.apps/web-app-custom-rollout created

Verifica el estado del despliegue:

kubectl rollout status deployment web-app-custom-rollout

Ejemplo de salida:

Waiting for deployment "web-app-custom-rollout" to roll out...
deployment "web-app-custom-rollout" successfully rolled out

Describe el despliegue para confirmar la estrategia:

kubectl describe deployment web-app-custom-rollout

El ejemplo de salida incluirá:

StrategyType:           RollingUpdate
RollingUpdateStrategy:  2 max unavailable, 3 max surge

Actualiza la imagen para desencadenar una actualización gradual:

kubectl set image deployment/web-app-custom-rollout nginx=nginx:1.25.0-alpine

Monitoriza el proceso de actualización:

kubectl rollout status deployment web-app-custom-rollout

Puntos clave sobre la estrategia de actualización gradual:

  1. maxUnavailable: Número máximo de pods que pueden estar no disponibles durante la actualización
  2. maxSurge: Número máximo de pods que se pueden crear por encima del número deseado
  3. Ayuda a controlar la velocidad de actualización y la disponibilidad de la aplicación
  4. Permite ajustar con precisión el comportamiento del despliegue

Resumen

En este laboratorio, aprendiste cómo iniciar y verificar un clúster local de Kubernetes utilizando Minikube, lo cual es un primer paso crucial para configurar tu entorno de desarrollo de Kubernetes. También aprendiste cómo crear y desplegar una aplicación web simple utilizando un Despliegue (Deployment) de Kubernetes, utilizando una imagen de NGINX como aplicación de muestra. El proceso de despliegue implicó crear un archivo de manifiesto de despliegue y aplicarlo al clúster.

Después de desplegar la versión inicial de la aplicación, aprenderás cómo actualizar la imagen de la aplicación en el archivo YAML del despliegue, verificar la actualización exitosa, simular y diagnosticar fallos de actualización, revertir a una versión estable y ajustar la estrategia de actualización gradual en el archivo YAML del despliegue.