¡Compártelo!

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

  • Consistencia: Asegura que la imagen Docker generada sea consistente con la aplicación Spring Boot, eliminando errores de configuración manual.
  • Eficiencia: Ahorra tiempo y esfuerzo al automatizar la creación de imágenes, permitiendo a los desarrolladores centrarse en la lógica de negocio sin necesidad de crear un dockerfile para poder crear las imágenes.
  • Compatibilidad: Garantiza que la imagen Docker sea compatible con cualquier entorno que soporte contenedores, facilitando el despliegue y la portabilidad de la aplicación.

¿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

  • Pods: La unidad mínima de despliegue en Kubernetes, que puede contener uno o más contenedores.
  • Services: Proveen un punto de acceso estable para acceder a los pods.
  • ConfigMaps: Almacenan datos de configuración no sensibles.
  • Secrets: Almacenan datos sensibles como contraseñas y certificados.
  • Deployments: Gestionan el estado deseado de la aplicación y permiten actualizaciones sin tiempo de inactividad.

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

Integración de Spring Boot y Kubernetes

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.

Integración de Spring Boot y Kubernetes

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.

integración de spring boot con Docker y KUbernetes

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

  • Nombre del Deployment: Define un nombre único para identificar el Deployment dentro del namespace.
  • Namespace: Especifica el namespace en el cual se desplegará el Deployment.

2. Réplicas

  • Número de Pods: Define el número de réplicas que deseas para tu aplicación. Esto asegura que siempre haya la cantidad deseada de pods ejecutándose.

3. Selector

  • Selector de Pods: Utiliza labels para identificar qué pods son gestionados por este Deployment.

4. Plantilla de Pod

  • Labels: Etiquetas para los pods, facilitando la gestión y el acceso a los pods.
  • Contenedor: Define la configuración del contenedor principal.

5. Health Checks

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

  • Liveness Probe: Determina si el contenedor está en buen estado y debe seguir ejecutándose. Reinicia el contenedor si la sonda falla.
  • Readiness Probe: Determina si el contenedor está listo para recibir tráfico. Si falla, Kubernetes no enviará tráfico al contenedor hasta que pase la prueba.

6. Variables de Entorno

  • Variables de Entorno: Define variables de entorno necesarias para la aplicación. En este caso, se utiliza para configurar el path de los secrets que serán leídos para proveer los valores junto a los configmap para poder resolver los ficheros application.yml en neto.

7. Montaje de Secrets

Resumen

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

  • El nombre del Deployment y el namespace.
  • El número de réplicas para garantizar la disponibilidad.
  • Los labels para la selección de pods.
  • La configuración del contenedor, incluyendo la imagen Docker.
  • Las sondas de health (liveness y readiness) para monitorear el estado del contenedor.
  • Las variables de entorno y los montajes de ConfigMaps y Secrets para manejar configuraciones y datos sensibles.

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. 

integración de Spring Boot con Docker y Kubernetes

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.

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

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.

integración de Spring Boot con Docker y Kubernetes

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! 

Artículos ​ relacionados