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
- Asegurarse de estar en el servidor
bastioncon el usuariostudentstudent@lab-0-bastion:~> - Ingresar como usuario administrador al cluster de Kubernetes con el siguiente comando:
export KUBECONFIG=/home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml - Crear un nuevo namespace llamado example-deployment
kubectl create ns example-deployment - Establecer el nuevo namespace por defecto en el contexto actual:
kubectl config set-context --current --namespace=example-deployment - Descargar y verificar el siguiente manifiesto:
wget https://k8s.io/examples/controllers/nginx-deployment.yaml - 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 - Verificar el estado del Deployment con el siguiente comando:
La salida debe ser parecida a la siguiente:
kubectl get deploymentsNAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 1s - Si deseamos obtener más información del Deployment utilice el parámetro '-o wide', ejecutando el comando 'kubectl get deployments -o wide'.
La salida será parecida a la siguiente:
kubectl get deployments -o wideNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deployment 3/3 3 3 10s nginx nginx:1.7.9 app=nginx - Para ver el estado del Deployment, ejecuta el comando kubectl rollout status deployment.v1.apps/nginx-deployment
Este comando devuelve el siguiente resultado:
kubectl rollout status deployment.v1.apps/nginx-deploymentdeployment "nginx-deployment" successfully rolled out - Para ver el ReplicaSet (rs) y los pods creados por el Deployment, ejecuta el comando kubectl get rs y kubectl get pods.
kubectl get rskubectl get pods - 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 - Para ver el estado del Deployment, ejecuta el comando kubectl rollout status deployment.v1.apps/nginx-deployment
Este comando devuelve el siguiente resultado:
kubectl rollout status deployment.v1.apps/nginx-deploymentdeployment "nginx-deployment" successfully rolled out - Para ver el ReplicaSet (rs) creado por el Deployment, ejecuta el comando kubectl get rs.
kubectl get rs - Si ejecutas el comando get pods deberías ver los nuevos Pods:
kubectl get pods - Verificando el detalles del Deployment
kubectl describe deployment - 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 - Verificamos que el despliegue se atasca y no progresa.
kubectl rollout status deployment.v1.apps/nginx-deployment - Presiona Ctrl-C para detener la monitorización del despliegue, y verificar los ReplicaSet (rs) creado.
kubectl get rs - 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 podskubectl get events --sort-by='.lastTimestamp' - Comprobar la Historia de Despliegues de un Deployment
kubectl rollout history deployment.v1.apps/nginx-deployment - Para ver más detalles de cada revisión, ejecuta:
kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2 - Ahora hemos decidido deshacer el despliegue actual y retrocederlo a la revisión previa:
kubectl rollout undo deployment.v1.apps/nginx-deployment - El Deployment se ha revertido ahora a una revisión previa estable
kubectl get rskubectl get podskubectl get deploymentkubectl describe deployment - Puedes escalar un Deployment usando el siguiente comando:
kubectl scale deployment.v1.apps/nginx-deployment --replicas=10 - Abre una nueva terminal y verifica el comportamiento del Deployment Strategy por defecto: rollingUpdate, dejar ejecutando el siguiente comando en la nueva terminal:
En la primera terminal ejecutar lo siguiente:
watch kubectl get podsVerificar 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:latestLuego de verificar el comportamiento, haga un rollback de los cambios realizados con el siguiente comando:kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91kubectl rollout undo deployment.v1.apps/nginx-deployment - Cambiar el Deployment Strategy a Recreate
kubectl edit deployments nginx-deployment
matchLabels:
app: nginx
strategy:
type: Recreate
template:
metadata:
creationTimestamp: null
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.7.9
kubectl delete ns example-deployment
rm -f nginx-deployment.yaml
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.