Skip to content

Tema:

Kubernetes Workloads: Deployment


Introducción

En Kubernetes, un Deployment es un tipo de workload diseñado para gestionar el ciclo de vida de las aplicaciones de manera declarativa. Permite la implementación, actualización y escalado de Pods de forma controlada, garantizando la disponibilidad continua de las aplicaciones. Esta guía aborda los conceptos clave de los Deployments, cómo configurarlos y gestionarlos, y las mejores prácticas para utilizarlos en entornos productivos.


Objetivo

Objetivo General:

  • Proveer a los participantes los conocimientos y habilidades necesarios para crear, administrar y escalar aplicaciones utilizando Deployments en Kubernetes, asegurando alta disponibilidad, facilidad de actualización y alineación con las mejores prácticas de la industria.

Kubernetes Controller:Deployments

Un controlador de Deployment proporciona actualizaciones declarativas para los Pods y los ReplicaSets.

Cuando describes el estado deseado en un objeto Deployment, el controlador del Deployment se encarga de cambiar el estado actual al estado deseado de forma controlada. Puedes definir Deployments para crear nuevos ReplicaSets, o eliminar Deployments existentes y adoptar todos sus recursos con nuevos Deployments.

Nota: No deberías gestionar directamente los ReplicaSets que pertenecen a un Deployment. Todos los casos de uso deberían cubrirse manipulando el objeto Deployment.

A continuación se presentan los casos de uso típicos de los Deployments:

  • Crear un Deployment para desplegar un ReplicaSet. El ReplicaSet crea los Pods en segundo plano. Comprueba el estado del despliegue para comprobar si es satisfactorio o no.
  • Declarar el nuevo estado de los Pods actualizando el PodTemplateSpec del Deployment. Ello crea un nuevo ReplicaSet y el Deployment gestiona el cambio de los Pods del viejo ReplicaSet al nuevo de forma controlada. Cada nuevo ReplicaSet actualiza la revisión del Deployment.
  • Retroceder a una revisión anterior del Deployment si el estado actual de un Deployment no es estable. Cada retroceso actualiza la revisión del Deployment.
  • Escalar horizontalmente el Deployment para soportar más carga.
  • Pausar el Deployment para aplicar múltiples arreglos a su PodTemplateSpec y, a continuación, reanúdalo para que comience un nuevo despliegue.
  • Usar el estado del Deployment como un indicador de que el despliegue se ha atascado.
  • Limpiar los viejos ReplicaSets que no necesites más.

Laboratorio: Kubernetes Deployment

Esta guía muestra cómo crear y gestionar un recurso tipo Deployment dentro de Kubernetes

  1. Asegurarse de estar en el servidor bastion con el usuario student
    student@lab-0-bastion:~>
    
  2. Ingresar como usuario administrador al cluster de Kubernetes con el siguiente comando:
    export KUBECONFIG=/home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml
    
  3. Crear un nuevo namespace llamado example-deployment
    kubectl create ns example-deployment
    
  4. Establecer el nuevo namespace por defecto en el contexto actual:
    kubectl config set-context --current --namespace=example-deployment
    
  5. Descargar y verificar el siguiente manifiesto:
    wget https://k8s.io/examples/controllers/nginx-deployment.yaml
    
  6. Después de examinar el archivo puedes ejecutar el Deployment con el siguiente comando:
    kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
    
  7. Verificar el estado del Deployment con el siguiente comando:
    kubectl get deployments
    
    La salida debe ser parecida a la siguiente:
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE 
    nginx-deployment   3/3     3            3           1s
    
  8. Si deseamos obtener más información del Deployment utilice el parámetro '-o wide', ejecutando el comando 'kubectl get deployments -o wide'.
    kubectl get deployments -o wide
    
    La salida será parecida a la siguiente:
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
    nginx-deployment   3/3     3            3           10s   nginx        nginx:1.7.9   app=nginx
    
  9. Para ver el estado del Deployment, ejecuta el comando kubectl rollout status deployment.v1.apps/nginx-deployment
    kubectl rollout status deployment.v1.apps/nginx-deployment
    
    Este comando devuelve el siguiente resultado:
    deployment "nginx-deployment" successfully rolled out
    
  10. Para ver el ReplicaSet (rs) y los pods creados por el Deployment, ejecuta el comando kubectl get rs y kubectl get pods.
    kubectl get rs
    
    kubectl get pods
    
  11. Asumiendo que ahora quieres actualizar los Pods nginx para que usen la imagen nginx:1.9.1
    kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
    
  12. Para ver el estado del Deployment, ejecuta el comando kubectl rollout status deployment.v1.apps/nginx-deployment
    kubectl rollout status deployment.v1.apps/nginx-deployment
    
    Este comando devuelve el siguiente resultado:
    deployment "nginx-deployment" successfully rolled out
    
  13. Para ver el ReplicaSet (rs) creado por el Deployment, ejecuta el comando kubectl get rs.
    kubectl get rs
    
  14. Si ejecutas el comando get pods deberías ver los nuevos Pods:
    kubectl get pods
    
  15. Verificando el detalles del Deployment
    kubectl describe deployment
    
  16. En ocasiones necesitas revertir un Deployment; por ejemplo, cuando el Deployment no es estable, como cuando no para de reiniciarse. Vamos a suponer que hemos cometido un error al actualizar el Deployment, poniendo como nombre de imagen nginx:1.91 en lugar de nginx:1.9.1
    kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91
    
  17. Verificamos que el despliegue se atasca y no progresa.
    kubectl rollout status deployment.v1.apps/nginx-deployment
    
  18. Presiona Ctrl-C para detener la monitorización del despliegue, y verificar los ReplicaSet (rs) creado.
    kubectl get rs
    
  19. Echando un vistazo a los Pods creados, verás que uno de los Pods creados por el nuevo ReplicaSet está atascado en un bucle intentando bajar la imagen:
    kubectl get pods
    
    kubectl get events --sort-by='.lastTimestamp'
    
  20. Comprobar la Historia de Despliegues de un Deployment
    kubectl rollout history deployment.v1.apps/nginx-deployment
    
  21. Para ver más detalles de cada revisión, ejecuta:
    kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2
    
  22. Ahora hemos decidido deshacer el despliegue actual y retrocederlo a la revisión previa:
    kubectl rollout undo deployment.v1.apps/nginx-deployment
    
  23. El Deployment se ha revertido ahora a una revisión previa estable
    kubectl get rs
    
    kubectl get pods
    
    kubectl get deployment
    
    kubectl describe deployment
    
  24. Puedes escalar un Deployment usando el siguiente comando:
    kubectl scale deployment.v1.apps/nginx-deployment --replicas=10
    
  25. Abre una nueva terminal y verifica el comportamiento del Deployment Strategy por defecto: rollingUpdate, dejar ejecutando el siguiente comando en la nueva terminal:
    watch kubectl get pods
    
    En la primera terminal ejecutar lo siguiente:
    kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:latest
    
    Verificar el comportamiento de los PODS Controlados por el Deployment Cambie nuevamente la imagen de contenedor del deployment, pero esta vez con una imágen que no existe y que fallará, y verifique nuevamente el comportamiento de los PODS.
    kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91
    
    Luego de verificar el comportamiento, haga un rollback de los cambios realizados con el siguiente comando:
    kubectl rollout undo deployment.v1.apps/nginx-deployment
    
  26. Cambiar el Deployment Strategy a Recreate

kubectl edit deployments nginx-deployment
    matchLabels:
      app: nginx
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
Actualizar nuevamente el Deployment con una nueva versión de la imagen de contenedor, ahora con nginx:1.7.9 y verifique nuevamente el comportamiento de los PODS cuando son eliminados y creados nuevamente.
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.7.9
27. Eliminar el namespace llamado example-deployment y el archivo de Manifiesto del Deployment:
kubectl delete ns example-deployment
rm -f nginx-deployment.yaml
Es posible gestionar, verificar el estado y las configuraciones del Deployment desde Rancher Management Server, asi como realizar las operaciones de Roll Back.

Conclusión

El Deployment es una pieza fundamental para gestionar workloads en Kubernetes de manera eficiente y segura. Su capacidad para manejar actualizaciones sin interrupciones, escalar aplicaciones, y realizar rollbacks lo convierte en una herramienta indispensable en entornos productivos.

Esta práctica nos brindó una comprensión práctica y profunda sobre cómo los Deployments permiten simplificar la administración de aplicaciones en Kubernetes, asegurando resiliencia, flexibilidad y una experiencia de usuario final sin interrupciones. Este conocimiento es clave para diseñar y operar sistemas escalables y confiables en el ecosistema Kubernetes.