Taller Kubernetes: Trabajando con Deployments
Introducción
En este taller vamos a trabajar con Deployments, que es un objeto de Kubernetes que nos permite crear un conjunto de Pods idénticos. En este caso, vamos a crear un Deployment que va a controlar un conjunto de Pods.
Ejercicio 1: Trabajando con Deployments
-
Crearemos un fichero yaml con la descripción del recurso Deployment, teniendo en cuenta los siguientes aspectos:
- Indicaremos nombres distintos para el Deployment y para el contenedor de los Pods que va a controlar.
- El Deployment va a crear 2 réplicas.
- La imagen que debemos desplegar es iesgn/test_web:latest.
- Indicaremos de manera adecuada una etiqueta en la especificación del Pod que vas a definir que coincida con el selector del Deployment.
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-web-deployment
labels:
app: web
spec:
revisionHistoryLimit: 5
strategy:
type: RollingUpdate
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: iesgn/test_web:latest
name: container-testweb
ports:
- name: http
containerPort: 80
-
Creamos el deployment:
kubectl apply -f test-web-deployment.yaml -
Comprobamos los recursos que se han creado, en nuestro caso, Deployment, ReplicaSet y Pods.
kubectl get all
- Obtenemos la información detallada del Deployment:
kubectl describe deployments.apps/test-web-deployment
- Crearemos un una redirección utilizando el port-forward para acceder a la aplicación, sabiendo que la aplicación ofrece el servicio en el puerto 80, y accede a la aplicación con un navegador web.
kubectl port-forward deployments.apps/test-web-deployment 8080:80
- Accederemos a los logs del despliegue para comprobar el acceso que has hecho en el punto anterior.
kubectl logs deployments.apps/test-web-deployment
- Elimina el Deployment y comprueba que se han borrado todos los recursos creados.
kubectl delete deployments.apps/test-web-deployment
Ejercicio 2: Actualización y desactualización de nuestra aplicación.
Primera verisón
El equipo de desarrollo ha creado una primera versión preliminar de una aplicación web y ha creado una imagen de contenedor con el siguiente nombre: iesgn/test_web:version1.
Vamos a desplegar esta primera versión de la aplicación. Recuerda que primero debemos descargarnos la imagen del contenedor con un docker pull iesgn/test_web:version1.
- Creamos un fichero yaml para desplegar la imagen: iesgn/test_web:version1.
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-web-deployment
labels:
app: web
spec:
revisionHistoryLimit: 5
strategy:
type: RollingUpdate
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: iesgn/test_web:version1
name: contendor-testweb
ports:
- name: http
containerPort: 80
- Creamos el deployment:
kubectl apply -f test-web-deployment2.yaml
NOTA: Anotaremos el despliegue para tener un registro de los cambios que se han ido realizando.
kubectl annotate deployment/test-web-deployment kubernetes.io/change-cause="Deployment version 1"
- Creamos una redirección utilizando el port-forward para acceder a la aplicación, sabiendo que la aplicación ofrece el servicio en el puerto 80, y accedemos a la aplicación con un navegador web.
kubectl port-forward deployment.apps/test-web-deployment 8080:80
Segunda versión
Nuestro equipo de desarrollo ha seguido trabajando y ya tiene lista la versión 2 de nuestra aplicación, han creado una imagen que se llama: iesgn/test_web:version2. Recuerda que primero debemos descargarnos la imagen del contenedor con un docker pull iesgn/test_web:version2.Vamos a actualizar nuestro despliegue con la nueva versión, para ello:
- Realiza la actualización del despliegue utilizando la nueva imagen y anotamos el registro de cambios.
- Cambiamos el fichero yaml y cambiamos lo siguiente:
...
containers:
- image: iesgn/test_web:version2
...
- Anotamos la versión 2 de la aplicación.
kubectl annotate deployment/test-web-deployment2 kubernetes.io/change-cause="Deployment version 2"
- Actualizamos el deployment:
kubectl apply -f test-web-deployment2.yaml
- Comprobamos que se han creado los recursos.
kubectl get all
- Visualizamos el historial de actualizaciones.
kubectl rollout history deployment/test-web-deployment
- Creamos una redirección utilizando el port-forward para acceder a la aplicación, sabiendo que la aplicación ofrece el servicio en el puerto 80, y accedemos a la aplicación con un navegador web.
kubectl port-forward deployment.apps/test-web-deployment2 8080:80
Tercera versión
Finalmente después de un trabajo muy duro, el equipo de desarrollo ha creado la imagen iesgn/test_web:version3. Recuerda que primero debemos descargarnos la imagen del contenedor con un docker pull iesgn/test_web:version3 y la vamos a poner en producción, para ello:
-
Realizamos la actualización del despliegue utilizando la nueva imagen y anotamos el registro de cambios.
-
Cambiamos el fichero yaml y cambiamos lo siguiente:
...
containers:
- image: iesgn/test_web:version3
...
- Anotamos la versión 3 de la aplicación.
kubectl annotate deployment/test-web-deployment kubernetes.io/change-cause="Deployment version 3"
- Actualizamos el deployment:
kubectl apply -f test-web-deployment2.yaml
- Comprobamos que se han creado los recursos.
kubectl get all
- Visualizamos el historial de actualizaciones.
kubectl rollout history deployment/test-web-deployment2
- Creamos una redirección utilizando el port-forward para acceder a la aplicación, sabiendo que la aplicación ofrece el servicio en el puerto 80, y accedemos a la aplicación con un navegador web.
kubectl port-forward deployment.apps/test-web-deployment 8080:80
Rollback
¡Vaya!, parece que esta versión tiene un fallo, y no se ve de forma adecuada la hoja de estilos, tenemos que volver a la versión anterior:
- Realizamos el rollback a la versión anterior.
kubectl rollout undo deployment/test-web-deployment
- Anotamos el rollback.
kubectl annotate deployment/test-web-deployment2 kubernetes.io/change-cause="Deployment rollback"
- Comprobamos que se han creado los recursos.
kubectl rollout history deployment/test-web-deployment
- Creamos una redirección utilizando el port-forward para acceder a la aplicación, sabiendo que la aplicación ofrece el servicio en el puerto 80, y accedemos a la aplicación con un navegador web.
kubectl port-forward deployment.apps/test-web-deployment 8080:80
Ejercicio 3: Despliegue de la aplicación GuestBook
En esta tarea vamos a desplegar una aplicación web que requiere de dos servicios para su ejecución. La aplicación se llama GuestBook y necesita los siguientes servicios:
-
La aplicación Guestbook es una aplicación web desarrollada en python que es servida en el puerto 5000/tcp. Utilizaremos la imagen iesgn/guestbook.
-
Esta aplicación guarda la información en una base de datos no relacional redis, que utiliza el puerto 6379/tcp para recibir las conexiones. Usaremos la imagen redis.
Por lo tanto si tenemos dos servicios distintos, tendremos dos ficheros yaml para crear dos recursos Deployment, uno para cada servicio. Con esta manera de trabajar podemos obtener las siguientes características:
-
Cada conjunto de Pods creado en cada despliegue ejecutarán un solo proceso para ofrecer el servicio.
-
Cada conjunto de Pods se puede escalar de manera independiente. Esto es importante, si identificamos que al acceder a alguno de los servicios se crea un cuello de botella, podemos escalarlo para tener más Pods ejecutando el servicio.
-
Las actualizaciones de los distintos servicios no interfieren en el resto.
-
Lo estudiaremos en un módulo posterior, pero podremos gestionar el almacenamiento de cada servicio de forma independiente.
Por lo tanto para desplegar la aplicaciones tendremos dos ficheros.yaml:
- guestbook-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: guestbook
labels:
app: guestbook
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tier: frontend
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: contenedor-guestbook
image: iesgn/guestbook
ports:
- name: http-server
containerPort: 5000
- redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: redis
tier: backend
template:
metadata:
labels:
app: redis
tier: backend
spec:
containers:
- name: contenedor-redis
image: redis
ports:
- name: redis-server
containerPort: 6379
Para realizar el despliegue realiza los siguientes pasos:
- Usando los ficheros anteriores, creamos los dos Deployments.
kubectl apply -f guestbook-deployment.yaml
kubectl apply -f redis-deployment.yaml
- Comprobamos que se han creado los recursos.
kubectl get all
-
Crea una redirección utilizando el port-forward para acceder a la aplicación, sabiendo que la aplicación ofrece el servicio en el puerto 5000, y accede a la aplicación con un navegador web.
kubectl port-forward deployment.apps/guestbook 8080:5000
Para eliminarlo ejecuta:
kubectl delete -f guestbook-deployment.yaml
kubectl delete -f redis-deployment.yaml
-
¿Qué aparece en la página principal de la aplicación?. Aparece el siguiente mensaje: Waiting for database connection…. Por lo tanto podemos indicar varias conclusiones:
-
Hasta ahora no estamos accediendo de forma “normal” a las aplicaciones. El uso de la opción port-forward es un mecanismo que realmente nos posibilita acceder a la aplicación, pero utilizando un proxy. Deberíamos acceder a las aplicaciones usando una ip y un puerto determinado.
-
Parece que tampoco hay acceso entre los Pods de los distintos despliegues. Parece que los Pods de la aplicación guestbook no pueden acceder al Pod donde se está ejecutando la base de datos redis.