Profile Software Services

Integración de Spring Boot con Docker y Kubernetes

La integración de Spring Boot con Docker y Kubernetes se ha convertido en una combinación poderosa y popular para el desarrollo y despliegue de aplicaciones modernas. Docker permite empaquetar aplicaciones junto con todas sus dependencias en contenedores portátiles y ligeros, mientras que Kubernetes facilita la orquestación de estos contenedores a escala, gestionando el despliegue, escalado y operación de aplicaciones. 

En esta guía, basada en nuestro curso reciente, proporcionamos una visión detallada de cómo utilizar estas tecnologías para crear, contenerizar, desplegar y gestionar aplicaciones de manera eficiente. Exploramos desde la creación de una aplicación Spring Boot hasta su despliegue en un clúster de Kubernetes, abarcando conceptos clave, configuración, y prácticas recomendadas.

¿Qué es Docker?

Docker es una plataforma de contenerización que permite a los desarrolladores empaquetar aplicaciones junto con todas sus dependencias en contenedores que son portátiles y ligeros. Docker asegura que la aplicación funcione de manera uniforme y predecible en cualquier entorno, ya sea en desarrollo, pruebas o producción.

Dentro, la integración de Spring Boot y Kubernetes va a ser la pieza fundamental que una nuestra aplicación con el cluster a montar en Kubernetes.

Principales Conceptos de Docker

Imagen Docker

Una imagen Docker es una plantilla inmutable que define todo lo necesario para ejecutar una aplicación, incluyendo el sistema operativo, el código de la aplicación, las librerías, dependencias y archivos de configuración. Las imágenes Docker se crean utilizando un archivo llamado Dockerfile, pero Spring Boot facilita este proceso sin necesidad de escribir un Dockerfile manualmente mediante el uso de plugin maven.

Contenedor Docker

Un contenedor Docker es una instancia ejecutable de una imagen Docker. Los contenedores se ejecutan de manera aislada, lo que mejora la seguridad y la consistencia del entorno de ejecución. Pueden ejecutarse en cualquier sistema que soporte Docker, facilitando la migración y despliegue de aplicaciones en diferentes entornos.

Creación de Imágenes Docker con Spring Boot

Como hemos comentado anteriormente, Spring Boot facilita la creación de imágenes Docker mediante el uso del proyecto Paketo Buildpacks. Paketo Buildpacks proporciona una forma estandarizada de construir imágenes de contenedores a partir de aplicaciones, sin necesidad de escribir un Dockerfile manualmente.

Integración Nativa

Spring Boot integra soporte para Paketo Buildpacks a través del plugin spring-boot-maven-plugin. Este plugin permite ejecutar el comando spring-boot:build-image para crear una imagen Docker de la aplicación.

El comando spring-boot:build-image automatiza el proceso de creación de la imagen, siguiendo las mejores prácticas y optimizando la configuración para aplicaciones Spring Boot. Incluye automáticamente el código de la aplicación, las dependencias y cualquier configuración necesaria en la imagen Docker resultante.

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=myapp:latest

Principales ventajas

¿Qué es Kubernetes?

Kubernetes es una plataforma de orquestación de contenedores que automatiza el despliegue, escalado y operación de aplicaciones en contenedores. Gestiona clústeres de nodos y proporciona herramientas para mantener las aplicaciones en ejecución de manera confiable y eficiente. (Más tarde detallaremos cómo realizar la Integración de Spring Boot y Kubernetes).

Componentes Clave

Configuración del Proyecto Spring Boot

Para integrar una aplicación Spring Boot en Kubernetes, es esencial utilizar el plugin spring-cloud-starter-kubernetes-fabric8-config. Este plugin permite conectar la aplicación con Kubernetes, facilitando la carga de configuraciones desde ConfigMaps y Secrets.

bootstrap.yml

El archivo bootstrap.yml es crucial para la configuración de Kubernetes. En él, definimos el nombre de la aplicación y las fuentes de ConfigMaps de las que se leerán las propiedades de configuración.

Integración de Spring Boot y Kubernetes

Archivos de Configuración

En la configuración que hemos realizado definimos dos ConfigMaps que se van a leer:

  1. application-common: Un ConfigMap que contiene propiedades comunes a varias aplicaciones.
  2. kubernetes-test-api: Un ConfigMap específico para la aplicación definida por el nombre kubernetes-test-api.

Hemos definido reload a true para permitir que si se modificican los valores de un configmap o secret que usemos en nuestra aplicación, dichos valores serán refrescados en caliente sin necesidad de reiniciar nuestros aplicativos

application.yml

El archivo application.yml es utilizado por Spring Boot para cargar todas las propiedades de la aplicación, incluyendo las que dependen del entorno y se definen en ConfigMaps y Secrets.

Uso de Spring Boot Actuator para Health Checks en Kubernetes

Introducción a Spring Boot Actuator

Spring Boot Actuator proporciona una serie de características para ayudar a monitorear y gestionar aplicaciones en producción. Incluye endpoints para métricas, información del sistema, y especialmente útiles para Kubernetes, los endpoints de salud (health) y disponibilidad (readiness).

Configuración de Actuator en Spring Boot

Para utilizar Spring Boot Actuator, necesitas incluir la dependencia spring-boot-starter-actuator en tu proyecto.

Para poder  habilitar los endpoints de health y readiness en tu archivo de configuración que usaremos más tarde en Kubernetes para poder comprobar el estado real de nuestro aplicativo application.yml

Despliegue aplicativo en Kubernetes

Para poder desplegar nuestra aplicación en Kubernetes debemos crear una serie de manifiestos que permitan crear la red que se va a crear dentro del cluster.  En Kubernetes, un manifiesto es un archivo de configuración que define los recursos que se deben crear en el clúster. Estos archivos generalmente están escritos en formato YAML o JSON. Los manifiestos especifican cómo debe ser el estado deseado de los objetos del clúster, tales como Pods, Servicios, ConfigMaps, Secrets, Deployments, entre otros.

Namespace

Un namespace en Kubernetes es una forma de dividir los recursos del clúster entre varios usuarios o equipos, permitiendo la organización y gestión lógica de los recursos.

ConfigMap

El ConfigMap se utiliza para almacenar datos de configuración no sensibles. Estos datos se pueden inyectar en los contenedores como variables de entorno o archivos de configuración.

Secret

Los Secrets se utilizan para almacenar datos sensibles, como contraseñas, tokens y certificados. Estos datos están codificados en Base64 y pueden inyectarse en los contenedores.

Deployment

Un Deployment en Kubernetes permite describir el estado deseado de una aplicación y gestionar su ciclo de vida, incluyendo actualizaciones y escalado.

Al crear un archivo de Deployment en Kubernetes, hay varios puntos clave a tener en cuenta para asegurar que la aplicación se despliegue y opere correctamente. A continuación, se describen los elementos esenciales del archivo de Deployment basado en el ejemplo visto en el curso:

1. Identificación del Deployment

2. Réplicas

3. Selector

4. Plantilla de Pod

5. Health Checks

Kubernetes utiliza los endpoints de liveness y readiness para determinar el estado de los pods. 

6. Variables de Entorno

7. Montaje de Secrets

Resumen

Al configurar un Deployment en Kubernetes, es crucial asegurarse de definir correctamente:

Service

Un Service en Kubernetes expone una aplicación ejecutándose en un conjunto de Pods como un servicio de red. El objetivo de nuestros servicios es poder hacer accesibles a nuestra red los componentes seleccionados mediante el selector indicado. 

Desde este momento se podrán llamar usando el nombre directamente. Para entender este importante concepto podemos crear un pod que levanta una bbdd y mediante un servicio hacer que otro pod pueda consumir esa url de conexión usando la  url jdbc:postgresql://mysql-service:5432/test-app donde mysql-service es el nombre del servicio ha montado en la red.

Role y RoleBinding

Los Roles definen los permisos para los recursos en un namespace específico, mientras que los RoleBindings asocian esos permisos con un usuario o grupo.

Conclusión de la integración de Spring Boot con Docker y Kubernetes

La integración de Spring Boot con Docker y Kubernetes ofrece una solución robusta y escalable para el desarrollo y despliegue de aplicaciones. 

A través de la contenerización con Docker y la orquestación con Kubernetes, los desarrolladores pueden asegurar que sus aplicaciones sean consistentes, portátiles y fáciles de gestionar en diversos entornos. Además, el uso de manifiestos de Kubernetes permite definir de manera declarativa los recursos necesarios, facilitando la administración y el mantenimiento de la infraestructura. 

Esta combinación no solo mejora la eficiencia operativa, sino que también proporciona una mayor flexibilidad y resiliencia en el manejo de aplicaciones modernas. En definitiva, la adopción de estas tecnologías representa un avance significativo hacia una gestión de aplicaciones más ágil y eficaz, capaz de satisfacer las demandas de los entornos de producción actuales.

Si quieres aprender más sobre contenedores visita nuestro canal de YouTube! ¡Suscríbete! 

Salir de la versión móvil