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

  1. 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.
  2. Comprensión básica de losDespliegues y Servicios.
    Consulta losDespliegues yServicios para obtener una comprensión básica.

¿Qué vamos a hacer?

  1. 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

archivo test-db-deployment.yaml

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

archivo test-db-service.yaml

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

archivo test-web-deployment.yaml

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

archivo test-web-service.yaml

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

comprobar los objetos existentes

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

crear despliegues y servicios

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.

comprobar los objetos recién creados

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.

acceder a la aplicación en NodeIP:NodePort

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.

añadir datos en la aplicación

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 .

eliminar todos los despliegues y servicios

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.

comprobar si se han eliminado todos los objetos que hemos creado

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.

También te podría gustar...