Escalando Microservicios

Spring Cloud y Kubernetes son 2 tecnologías para crear Arquitecturas MSA (microservice-based architectures) en las que una compañía puede llevar a cabo una estrategia de transformación digital mediante el  desarrollo y ejecución de  microservicios.

En un sistema basado en una arquitectura de  microservicios tendremos cientos de servicios, por lo que es fundamental gestionarlos y gobernalos de forma centralizada.

Spring Cloud implementa una Arquitectura MSA sobre servicios funcionales (statistics service, account service y notification service) y servicios de infraestructura de soporte (log analysis, configuration server, service discovery, auth service):

Kubernetes es una plataforma de código abierto muy útil que sirve para automatizar el despliegue, la escala y las operaciones en las aplicaciones de contenedores proporcionando una infraestructura centralizada de los contenedores y sus aplicaciones.

¿Qué es Kubernetes?
El proyecto Kubernetes fue iniciado por Google en el año 2014. Google ha desarrollado este “producto” desde hace mas de una década y lo ha mejorado basándose en la experiencia que tiene Google con el funcionamiento de las cargas de trabajo de producción a gran escala, todo ello mezclado y combinado con las ideas y las mejores prácticas de otras organizaciones de la comunidad open source.

La idea general es que con Kubernetes serás capaz de responder rápida y eficazmente a la demanda de tu cliente.

¿Qué son los contenedores con Docker?
Docker no es más que una plataforma de código abierto para que administradores y desarrolladores puedan crear, empaquetar y distribuir sus aplicaciones rápidamente. No es mas que un entorno donde vamos a ejecutar “máquinas virtuales” ligeras con sus aplicaciones.

La característica principal en Docker versus un modelo tradicional de virtualización de sistemas donde tenemos máquinas virtuales es que en Docker tenemos contenedores ligeros donde residen las aplicaciones y estos se puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del sistema operativo que la máquina tenga por debajo, facilitando así también los despliegues y la portabilidad de sus aplicaciones.

¿Por qué necesito Kubernetes y Docker juntos?
Con Kubernetes en Docker puedes programar y ejecutar las aplicaciones en los contenedores en grupos de máquinas virtuales o físicos a gran escala.

En definitiva, Kubernetes proporciona la infraestructura para construir un entorno de desarrollo verdaderamente centrado en el contenedor con funcionalidades tales como re-arranque automático, auto-replicación y auto-escalado.

Spring Cloud por el contrario no se encarga de la parte de integración continua, escalado, alta disponibilidad,… que son también muy importantes en una Arquitectura MSA y que si resuelve Kubernetes.

Spring Cloud ofrece un completo conjunto de librerías Java para resolver todas las necesidades MSA en término de ejecución, como client-side service discovery, load balancing, configuration update, metrics tracking, schedulin, singleton application,…

Kubernetes es políglota, no encaja solo en la Plataforma Java, y resuelve las necesidades de programación distribuida de una forma genérica para todos los lenguajes, ofreciendo: configuration management, service discovery, load balancing, tracing, metrics, singletons, scheduled jobs on the platform level fuera del stack de aplicación.

En algunos puntos ambas plataformas se basan en las mismas herramientas.
Existen áreas donde ambas plataformas son complementarias y pueden combinarse para crear una solución más potente (como KubeFlix y Spring Cloud Kubernetes).

Podemos decir que usando ambas tecnologías podré crear una arquitectura MSA muy potente:

  • Spring Boot para construir despliegues Single JAR
  • Despliegues declarativos vía Docker
  • Hystrix para resiliencia de la solución
  • Ribbon para balanceo de carga
  • Kubernetes health checks, restart, autoescalado,…

Si comprobamos sus virtudes y defectos de nuevo concluimos que interesa usarlos en conjunto: Spring Cloud es muy potente dentro de la JVM y Kubernetes gestionando esas JVMS.