Desplegar una aplicación web con Minikube

0
1777
Creative cloud background with gears. Eps10 vector for your design

Indice de contenidos

Introducción

En este tutorial veremos un ejemplo práctico de cómo desplegar una aplicación web básica en Kubernetes que para almacenar los datos se comunica con una base de datos MySql también desplegada en el clúster.

Se puede leer una introducción a Kubernetes en este tutorial.

Para simplificar el tutorial y no hacer una instalación de Kubernetes desde cero, tarea que no es especialmente sencilla, vamos a usar Minikube, que está muy bien para hacer pruebas en entornos de desarrollo, pero no es recomendable poner en producción.

Podemos ver otro tipo de instalaciones locales de Kubernetes en

Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: MacBook Pro 15’ (2,5 GHz Intel Core i7, 16GB DDR3)
  • Sistema operativo: macOS Mojave 10.14.1
  • Versiones:
    • Docker: 18.09.0
    • Minikube: v0.30.0
    • VirtualBox 5.2.22 r126460 (Qt5.6.3).

Aplicación utilizada

Para el tutorial voy a usar de ejemplo una aplicación propia de gestión de catálogos de cursos que desarrollé para probar un pequeño framework que implementé. La tengo alojada en GitHub y se puede obtener con:

Creación del despliegue con la base de datos

Antes que nada, debemos arrancar Minikube:

Una vez que tengamos minikube arrancado vamos a crear el PersistentVolume con el PersistentVolumeClaim al que se conectará la base de datos. Para no perder la información cada vez que paremos minikube, debemos crear el volumen en alguno de los siguientes directorios:

  • /data
  • /var/lib/minikube
  • /var/lib/docker

Creamos catalogocursos-mysql-pv.yaml:

Seguidamente desplegamos en kubernetes:

Mostramos la información del PersistentVolume creado:

Lo siguiente que vamos a hacer es crear el servicio catalogocursos-mysql-svc.yaml:

Establecemos «type: NodePort» para poder conectarnos a la base de datos desde algún cliente fuera del clúster.

Por último creamos el despliegue catalogocursos-mysql-deployment.yaml para que se conecte con el servicio y el PersistentVolumeClaim anteriormente creados:

Los desplegamos:

Como tiene que descargar la imagen, puede que tarde un poco. Podemos ver el estado con:

Cuando ya esté en estado «Running» podemos pedirle a minikube la url para conectarnos a la base de datos desde cualquier cliente externo:

Ya con cualquier cliente de base de datos como DBeaver podremos acceder a la base de datos en la url y puerto que nos devuelva. En este ejemplo en particular, para que la aplicación catálogo de cursos funcione, tenemos que pasar el parche db_schema.sql que se encuentra en la carpeta sql del proyecto, teniendo en cuenta que la base de datos ya tiene que estar creada.

Creación del despliegue con la aplicación web

Lo primero que vamos a hacer es generar la imagen docker con el war desplegado en el tomcat para usar en kubernetes. Generamos primero un war con el perfil kubernetes. En este caso, en esta aplicación, el perfil cambia la url de conexión de base de datos, para que pueda conectar con la que acabamos de crear de forma que la url de conexión quede del tipo:

jdbc:mysql://catalogocursos-mysql-service:3306/cursos_autentia

Generamos el war:

Ahora creamos el Dockerfile con el que tenemos que construir la imagen.

Necesitamos construir la imagen de forma que esté accesible desde minikube. Para poder trabajar con el daemon de docker desde el host mac/linux es necesario usar el comando docker-env.

Ahora ya podemos usar docker en la línea de comandos hablando con el daemon de docker que se encuentra dentro de la minikube VM.

Construimos la imagen y queda dentro del catálogo de imágenes del Docker que corre dentro de Minikube:

Creamos el servicio catalogocursos-webapp-svc.yaml:

Creamos el despliegue catalogocursos-webapp-deployment.yaml teniendo en cuenta que en el pod spec debemos poner el mismo nombre de la imagen con el que la construimos (por ejemplo cursosautentia) y establecer «imagePullPolicy» a «Never», para que kubernetes no intente descargar la imagen.

Desplegamos:

Comprobamos que todos los objetos se han creado:

Para ver el log de arranque de la aplicación web y comprobar si todo ha ido bien ejecutamos:

Ahora vemos la url que tiene la aplicación para poder acceder a ella desde fuera del clúster con nuestro navegador.

Ya podemos acceder a la aplicación desplegada en: http://192.168.99.100:32261/cursosautentia/catalogocursos/cursos?orden=titulo&pagina=1&numElementosPagina=3

Ya con todo funcionando podemos empezar a jugar con Kubernetes todo lo que queramos. Por ejemplo podemos escalar el deployment:

Comprobamos que se nos ha creado un nuevo pod.

Ahora haciendo diferentes peticiones a la aplicación desplegada, y mirando el log de cada uno de los dos pods de la webapp podemos comprobar como a veces nos responde uno de ellos y en otras ocasiones el otro.

Conclusiones

A lo largo del tutorial hemos visto de una forma muy sencilla cómo podemos desplegar una base de datos en Kubernetes y exponerla como un servicio dentro del clúster. Luego hemos podido desplegar una aplicación web y conectarla a la base de datos, para finalmente acceder a la aplicación desde fuera del clúster con nuestro navegador.

Saludos.

Dejar respuesta

Please enter your comment!
Please enter your name here