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:
minikube startcrea un clúster de Kubernetes local de un solo nodo- El clúster utiliza Docker como controlador (driver) predeterminado
- Kubernetes v1.26.1 se configura automáticamente
minikube statusykubectl get nodesconfirman 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:
- Creamos un Despliegue con 3 réplicas de un servidor web NGINX
- Utilizamos una versión específica y estable de NGINX (1.23.3-alpine)
- Exponemos el puerto 80 del contenedor
- 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:
- Utiliza
kubectl applypara actualizar los despliegues - Kubernetes realiza una actualización gradual (rolling update) por defecto
- Los pods se reemplazan gradualmente para mantener la disponibilidad de la aplicación
- 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:
- Todos los pods están ejecutando la nueva versión de la imagen
- El despliegue tiene 3 réplicas disponibles
- La estrategia de implementación (rollout strategy) garantiza actualizaciones sin tiempo de inactividad
- 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:
- Utiliza
kubectl describepara ver los eventos del despliegue y de los pods - Comprueba el estado de los pods en busca de
ImagePullBackOffu otros estados de error - Examina los registros de los pods para obtener información detallada sobre el error
- 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:
kubectl rollout undorevierte a la revisión anterior del despliegue- Kubernetes mantiene un historial de los cambios en los despliegues
- La reversión se realiza sin tiempo de inactividad
- 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:
maxUnavailable: Número máximo de pods que pueden estar no disponibles durante la actualizaciónmaxSurge: Número máximo de pods que se pueden crear por encima del número deseado- Ayuda a controlar la velocidad de actualización y la disponibilidad de la aplicación
- 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.


