Skip to content

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 Controller: Deployments

Descripción

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.

Objetivos

  • Crear un Deployment en kubernetes.
  • Entender las propiedades y funciones de un Deployment

Antes de comenzar

  • Contar con el acceso al ambiente del laboratorio
  • Haber realizado la guía de Instalación Rancher Kubernetes Engine (RKE)
  • Haber realizado la guía de Acceso a rancher y kubernetes cluster

Inicio de laboratorio

  1. Ingrese al CLI del sistema operativo del servidor usado como Bastion con el usuario y la contraseña proporcionados.

Ingresar al cluster de Kubernetes cluster-users con sus respectivas credenciales

Crear un nuevo namespace llamado example-deployment

kubectl create ns example-deployment

Establcer el nuevo namespace por defecto en el contexto actual:

kubectl config set-context --current --namespace=example-deployment
2. Descargar y verificar el siguiente manifiesto:
wget https://k8s.io/examples/controllers/nginx-deployment.yaml
3. Después de examinar el archivo puedesejecutar el Deployment con el siguiente comando:
kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
4. 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
5. 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
6. 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:
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
7. 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
8. Asumiendo que ahora quieres actualizar los Pods nginx para que usen la imagen nginx:1.9.1
kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1
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:
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx-deployment" successfully rolled out
10. Para ver el ReplicaSet (rs) creado por el Deployment, ejecuta el comando kubectl get rs.
kubectl get rs
11. Si ejecutas el comando get pods deberías ver los nuevos Pods:
kubectl get pods
12. Verificando el detalles del Deployment
kubectl describe deployment
13. 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 vez de nginx:1.9.1
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
14. Verificamos que el despliegue se atasca y no progresa.
kubectl rollout status deployment.v1.apps/nginx-deployment
15. Presiona Ctrl-C para detener la monitorización del despliegue, y verificar los ReplicaSet (rs) creado.
kubectl get rs
16. 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
17. Comprobar la Historia de Despliegues de un Deployment
kubectl rollout history deployment.v1.apps/nginx-deployment
18. Para ver más detalles de cada revisión, ejecuta:
kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2
19. Ahora hemos decidido deshacer el despliegue actual y retrocederlo a la revisión previa:
kubectl rollout undo deployment.v1.apps/nginx-deployment
20. El Deployment se ha revertido ahora a una revisión previa estable
kubectl get rs
kubectl get pods
kubectl get deployment
kubectl describe deployment
21. Puedes escalar un Deployment usando el siguiente comando:
kubectl scale deployment.v1.apps/nginx-deployment --replicas=10
22. 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 --record=true
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 --record=true
Luego de verificar el comportamiento, haga un rollback de los cambios realizados con el siguiente comando:
kubectl rollout undo deployment.v1.apps/nginx-deployment
23. 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 conteendor, 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 --record=true
22. Eliminar el namespace llamado example-deployment
kubectl delete ns example-deployment
Es posible gestionar, verificar el estado y las configuraciones del Deployment desde Rancher Management Server, asi como realizar las operaciones de Roll Back.