Maximizando la Eficiencia de Microservicios Java Contenerizados: Una Guía Práctica
En mi experiencia en los últimos años gestionando microservicios Java en clusters de Kubernetes en diferentes proyectos y consultorías. He notado que los principales problemas que afrontamos son:
Escalabilidad eficiente de microservicios.
Asignación correcta de recursos del Java Runtime dentro del pod.
Tiempo elevado de startup del pod.
Tamaño y consumo de recursos del contenedor (microservicio).
Seguridad del contenedor.
Como se puede apreciar, estos problemas están enfocados directamente a los contenedores mas que al cluster en sí. Es decir lo primero a atacar, debería ser elegir una imagen base que sea eficiente, ligera, segura, escalable y con soporte.
Existen muchas alternativas de imagenes base para microservicios Java, hoy les comparto la que me ha dado mejores resultados estos últimos años. Se trata de https://hub.docker.com/r/bellsoft/liberica-runtime-container , una imagen base creada por BellSoft que usa Alpaquita como OS y Liberica JDK/JRE.
Alpaquita es un sistema operativo basado en Alpine Linux, optimizado para contenedores base. Asi como Liberica JDK/JRE que es 100% codigo abierto y está optimizado para poder ejecutar microservicios Java de forma flexible, eficiente, ahorrando costos y de forma segura. Ambos Bellsoft brinda soporte y es la mejor opción para ambientes contenerizados.
A continuación muestro las opciones que nos brinda Bellsoft dependiendo la necesidad. En mi caso yo uso liberica-runtime-container:jre-21-musl para microservicios, el cual pesa 40 MB y solo tiene el JRE que es lo único necesario para poder correr el JAR de mi microservicio.

Es decir un Dockerfile para mi microservicio, tendría el siguiente formato:
FROM bellsoft/liberica-runtime-container:jdk-21-musl AS TEMP_BUILD_IMAGE
COPY src /usr/src/app/src
COPY pom.xml settings.xml /usr/src/app/
RUN mvn -s /usr/src/app/settings.xml -f /usr/src/app/pom.xml clean install -q -DcoverRatio=80 -Dmaven.test.skip=true
FROM --platform=linux/amd64 bellsoft/liberica-runtime-container:jre-21-musl
ENV TIME_ZONE America/Lima
ENV TZ=$TIME_ZONE
ENV JAVA_OPTS "-Djava.awt.headless=true -Xmx1250m -Xms256m"
COPY --from=TEMP_BUILD_IMAGE /usr/src/app/target/*.jar /app/spring-boot-application.jar
RUN apk --no-cache add openssl && \
apk --no-cache add curl && \
addgroup -S javauser && adduser -S javauser -G javauser && \
chown -R javauser:javauser /app && \
USER javauser
ENTRYPOINT exec java -jar /app/spring-boot-application.jar
Como podemos apreciar, primero uso la imagen bellsoft/liberica-runtime-container:jdk-21-musl solo para generar mi JAR. Luego utilizo la imagen bellsoft/liberica-runtime-container:jre-21-musl para poder ejecutar el JAR.
Qué pude lograr realizando este cambio?
El peso de mi imagen base, de
350MBa47MB. (Cabe resaltar que algunas imágenes pesan mas de 1GB, lo he visto en clientes).La cantidad de procesos que corren dentro del pod, solo existe
1 proceso, la de mi aplicación JAVA, esto por la optimización de alpaquita como SO.El startup de mi microservicio de
2-3 minutosa27 segundos, por la optimización deLibericaJRE.La seguridad de mi contenedor, antes usaba imágenes como la de amazon-coretto, openJDK, oracleJDK, entre otros. Pero aún así encontraba vulnerabilidades escaneando con
trivy. Usando Alpaquita y Liberica tenemos0 vulnerabilidades, esto debido a queBellsoftse enfoca mucho en la seguridad.La cantidad de nodos de mi cluster se
redujeron al 50%porque administraba mejor los recursos, a menos asignación de recursos, mas capacidad de pods y menos nodos desplegados.
Conclusión
La optimización de microservicios Java contenerizados es crucial para mejorar la eficiencia, seguridad y escalabilidad de las aplicaciones. Al elegir una imagen base adecuada, como la proporcionada por BellSoft con Alpaquita y Liberica, se pueden lograr mejoras significativas en el rendimiento y la seguridad. La reducción del tamaño de la imagen, el tiempo de inicio más rápido y la eliminación de vulnerabilidades son beneficios clave que se traducen en un uso más eficiente de los recursos del cluster. Implementar estas prácticas no solo optimiza el rendimiento de los microservicios, sino que también contribuye a una gestión más efectiva de los recursos en entornos contenerizados.
Espero pueda servirles, cualquier duda o comentario no duden en contactarme.



