Cómo desplegar una aplicación de varios niveles con Kubernetes
Una aplicación multinivel es una aplicación distribuida en más de una capa. Separan lógicamente las capas operativas. El número de capas varía según los requisitos del negocio y de la aplicación. En este artículo, veremos una aplicación dividida en 2 capas, backend y frontend. Utilizaremos MongoDB como backend para almacenar datos y Python Flask como servidor web frontend. Desplegaremos estas dos aplicaciones utilizando despliegues en Kubernetes y tendremos servicios para reenviarles peticiones.
Requisitos previos
- Cluster Kubernetes con al menos 1 nodo trabajador.
Si quieres aprender a crear un Cluster Kubernetes, haz clic aquí. Esta guía te ayudará a crear un cluster de Kubernetes con 1 Maestro y 2 Nodos en Instancias EC2 de AWS Ubuntu 18.04. - Comprensión básica de losDespliegues y Servicios.
Consulta losDespliegues yServicios para obtener una comprensión básica.
¿Qué vamos a hacer?
- Desplegar una aplicación de varios niveles
Desplegar una aplicación de varios niveles
Crea un nuevo archivo llamado «test-db-deployment.yaml» con el siguiente contenido. Esto definirá un despliegue de MongoDB que actuará como base de datos, una capa de backend.
vim prueba-db-despliegue.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: test-db spec: selector: matchLabels: appdb: testdb replicas: 1 template: metadata: labels: appdb: testdb spec: containers: - name: test-db image: mongo:3.3 env: - name: MONGODB_DATABASE value: testdata ports: - containerPort: 27017
Ahora, crea un servicio que servirá las peticiones a MongoDB desde nuestra aplicación frontend. Este servicio escuchará en el puerto 27017 y reenviará las peticiones a MongoDB en el mismo puerto.
vim test-db-service.yaml
apiVersion: v1 kind: Service metadata: name: mongodb labels: app: testdb spec: ports: - port: 27017 protocol: TCP selector: appdb: testdb
El siguiente paso es definir una aplicación frontal. Crea un nuevo archivo que contenga la siguiente definición de despliegue.
Ésta escuchará en el puerto 5000.
Las peticiones a MongoDB se remitirán a MONGODB_HOST, es decir, al servicio mongodb.
vim prueba-web-despliegue.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: test spec: selector: matchLabels: app: test replicas: 1 template: metadata: labels: app: test spec: containers: - name: test-app image: teamcloudyuga/rsvpapp env: - name: MONGODB_HOST value: mongodb ports: - containerPort: 5000 name: web-port
Para acceder al frontend, crearemos un servicio de tipo NodePort que escuche en el puerto 31081. Esto significa que se puede acceder al servidor web de Python Flask en IP=IP-de-un-nodo y Puerto=31081. Crea un nuevo con la siguiente definición de servicio.
vim prueba-servicio-web.yaml
apiVersion: v1 kind: Service metadata: name: test labels: apps: test spec: type: NodePort ports: - name: tcp-31081-5000 nodePort: 31081 port: 5000 protocol: TCP selector: app: test
Ahora, ya estamos preparados para crear una aplicación de ejemplo de 2 niveles. Antes de continuar, vamos a comprobar si el clúster tiene algún objeto.
Ejecuta los siguientes comandos para comprobar los pods, los despliegues y los servicios que se ejecutan en el clúster.
kubectl get pods
kubectl get deployments
kubectl get service
En la captura de pantalla anterior, se puede ver que sólo hay 1 servicio por defecto de kubernetes en el clúster.
Ahora, ejecuta el siguiente comando uno a uno desde el directorio donde has creado 4 archivos para crear el despliegue de MongoDB, el servicio de MongoDB, el despliegue de Python Flask Webserver y el servicio de Python Flask Webserver.
kubectl create -f test-db-deployment.yaml
kubectl create -f prueba-db-servicio.yaml
kubectl create -f test-web-deployment.yaml
kubectl create -f prueba-servicio-web.yaml
En la captura de pantalla anterior, puedes ver que el despliegue de MongoDB, el servicio de MongoDB, el despliegue de Python Flask Webserver y el servicio de Python Flask Webserver se han creado con éxito.
Para comprobarlo, ejecuta los siguientes comandos
kubectl get pods
kubectl get deployments
kubectl get service
En la siguiente captura de pantalla, puedes ver que se han creado 2 pods y 2 servicios. Los pods que se han creado están controlados por el despliegue que hemos creado.
Ahora, estamos preparados para acceder a la aplicación en IP-de-un-nodo:NodePort, es decir, IP-de-un-nodo:31081.
Una vez que pulses la URL en el navegador, verás la aplicación de la siguiente manera. Esta es una aplicación de ejemplo que utiliza la imagen docker disponible públicamente y que pertenece a CloudYuga. Aquí puedes ver que el recuento de RSVP es 0, esto significa que MongoDB no tiene ningún dato en él.
Ahora, podemos añadir unas cuantas entradas de demostración.
Al añadir unas cuantas entradas, podemos ver que el recuento ha cambiado. Esto significa que los datos se han almacenado en MongoDB.
Ahora, cuando ya no necesites estas aplicaciones, puedes eliminar todos los objetos ejecutando el siguiente comando desde el directorio donde tienes todos tus archivos de objetos de Kubernetes.
kubectl delete -f .
El comando anterior eliminará el despliegue de MongoDB, el servicio de MongoDB, el despliegue de Python Flask Webserver y el servicio de Python Flask Webserver que hemos creado.
Para comprobar si todos los objetos que hemos creado se han eliminado correctamente, ejecuta el siguiente comando.
kubectl get all
En la siguiente captura de pantalla, puedes ver que sólo hay un servicio kubernetes por defecto y que los objetos que habíamos creado ya no existen.
Conclusión
En este artículo, hemos creado un despliegue de la base de datos del backend MongoDB y un servicio para acceder a la base de datos, y para el frontend, hemos creado un despliegue de la aplicación basada en Python Flask y un servicio para acceder a este frontend. También hemos visto cómo se almacenan los datos en la base de datos del backend. Este es un ejemplo de aplicación de 2 niveles que utiliza imágenes docker disponibles públicamente.