lunes, 22 de abril de 2024

Kubernetes: Despliegue conjunto de Quarkus y BBDD

Hemos hecho hace poco un post donde explicábamos como montar un cluster de Kubernetes en local, aquí. Donde también vimos conceptos básicos de Kubernetes, que nos ayudaron a comprender mejor el despliegue. 

Hoy veremos cómo desplegar dos contenedores distintos y entablar una conexión entre ambos. Para ello seguiremos con un ejemplo de un microservicio Quarkus y su conexión con una base de datos MariaDB. Pero además también veremos nuevos conceptos de Kubernetes que ampliarán nuestro conocimiento del mismo. 

Empezaremos montando el servicio de MariaDB donde además necesitaremos de la ayuda de un configMap y un configSecret. 

  • ConfigMap: Es otro tipo de objeto disponible en Kubernetes. Utilizado para almacenar datos no confidenciales en el formato clave-valor. Pueden ser utilizados como variables de entorno, argumentos de la linea de comandos o como ficheros de configuración en un Volumen.
  • Secrets:  Otro objeto que permite almacenar y administrar información confidencial. Permitiendo flexibilidad para añadir palabras claves sin necesidad de configurarlas en los pods. 

Por un lado crearemos un ConfigMap que nos permita añadir un script.sql inicial y que se ejecute al inicializar la base de datos. Muy util para entornos de pruebas. 

apiVersion: v1
kind: ConfigMap
metadata:
name: mariadb-initdb-config
data:
initdb.sql: |
CREATE DATABASE library;
GRANT ALL PRIVILEGES ON library.* TO 'username-default'@'%' IDENTIFIED BY 'my_cool_secret';
USE `library`;
CREATE TABLE `BOOK` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(45) DEFAULT NULL,
`AUTHOR` varchar(45) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
INSERT INTO BOOK (NAME, AUTHOR) VALUES('Ender Game', 'Orson S. Card');
INSERT INTO BOOK (NAME, AUTHOR) VALUES('The stars my destination', 'Alfred Bester');
INSERT INTO BOOK (NAME, AUTHOR) VALUES('Dune', 'Frank Herbert');

Por otro, crearemos el Secret para poder almacenar de forma segura las contraseñas de usuario y administrador de la base de datos. Las claves que se incluyan en los secrets deben de estar codificados en base 64. 

apiVersion: v1
kind: Secret
metadata:
name: mariadb-secret
data:
user.pass: bXlfY29vbF9zZWNyZXQ=
root.pass: bXktc2VjcmV0LXB3

Lo siguiente es la configuración de la base de datos. Lo crearemos como un objeto deployment donde tendremos toda la configuración. A través de variables de entorno, que hacen referencia a los secrets almacenados, configuraremos los valores de las contraseñas del administrador y usuario. Y a través la configuración de los volúmenes podremos indicar el script que debe ejecutar al inicio. 

apiVersion: apps/v1
kind: Deployment # what to create?
metadata:
name: mariadb
spec: # specification for deployment resource
replicas: 1 # how many replicas of pods we want to create
selector:
matchLabels:
app: mariadb
strategy:
type: Recreate
template: # blueprint for pods
metadata:
labels:
app: mariadb # service will look for this label
spec: # specification for pods
containers: # we can have one or more containers
- name: mariadb
image: mariadb
ports:
- containerPort: 3306 #port exposed in cluster
env: # allows to define environment variables
- name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef: # allows to refer to a secret configured
name: mariadb-secret #name of the secret
key: root.pass #key of the secret that you want to use
- name: MARIADB_USER
value: username-default
- name: MARIADB_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: user.pass
volumeMounts:
- name: mariadb-initdb #configuration of the volumes
mountPath: /docker-entrypoint-initdb.d
volumes:
- name: mariadb-initdb #volumen to configure
configMap:
name: mariadb-initdb-config #refer key of the config map

El siguiente paso será configurar el microservicio Quarkus. En otro post entraremos más en las configuración de Quarkus con Kubernetes o Docker. Pero en esté solo indicaremos cómo configurar la base de datos para ver también cómo podemos realizar la conexión entre ambos contenedores. 

## bbdd testing conf
quarkus.datasource.devservices.image-name=mariadb:10.3.6
quarkus.datasource.jdbc.driver=org.mariadb.jdbc.Driver

%prod.quarkus.datasource.db-kind=mariadb
%prod.quarkus.datasource.username=username-default
%prod.quarkus.datasource.password=my_cool_secret
%prod.quarkus.datasource.jdbc.url=jdbc:mariadb://mariadb:3306/library
%prod.quarkus.datasource.jdbc.max-size=5

Como se puede apreciar, simplemente vale con indicar la etiqueta indicada en el deployment. Y los datos del usuario de BBDD que hemos indicado en la creación del pod. 

Y esto ha sido todo. Espero que os haya servido para aprender un poco más sobre Kubernetes, los ConfigMap, Secrets y Quarkus.

No hay comentarios:

Publicar un comentario