Que todo cambia muy rápido es algo que ya sabemos, y si, encima, estamos hablando de “cosas de ordenadores”, el término muy rápido se nos queda corto. Hoy en día queremos ejecutar nuestras aplicaciones de la manera más moderna posible y si pudiera ser, que siguiera estando a la última durante algunos meses…

Con aplicaciones modernas hablamos de aplicaciones que escalan y que son portables, fáciles de hacer y mantener gracias a la separación de funcionalidades y a la observabilidad de los sistemas.

En este post vamos a hablar de aplicaciones modernas y del stack que tendremos que usar para lograr este objetivo. Concretamente, vamos a hablar de la manera que nos propone Google que, de esto, sabe un poco.

Como podréis ver, en este post no vamos a citar ningún lenguaje de programación ¿Y eso? Esto va de cómo hacer las cosas, no de con qué y, por lo tanto, el lenguaje de programación es lo de menos (siempre que no uses ‘ese’ lenguaje que estás pensando). Una de las ventajas de usar este enfoque consiste en que se lleva bien con sistemas políglotas (aquellos que tienen servicios escritos en más de un lenguaje).

Infraestructura moderna

Google lleva mucho tiempo desarrollando su propia tecnología (con ayuda de otras soluciones Open Source) para solventar sus problemas, obteniendo buenos resultados con ello y, lo que es mejor, liberalizando gran cantidad de estas soluciones que se han convertido en los estándares de la industria. En este punto de la historia, la visión que vamos a exponer está aceptada casi unánimemente como la mejor manera de tener una infraestructura moderna y flexible.

Esta propuesta de infraestructura para aplicaciones modernas está basada en los siguientes conceptos:

Teniendo en cuenta esto, nos encontramos con que nuestra plataforma tendrá que tener las cargas de trabajo en contenedores Docker. Cada contenedor vivirá en un pod que contenga un proxy Envoy configurado por Istio para controlar las conexiones, la seguridad y el envío de telemetría. Todos los procesos se orquestan en clusters de Kubernetes y se usa Stackdriver (u otros productos) para monitorización y logs.

A continuación vamos a profundizar un poco en los componentes que podemos usar en Google Cloud Platform para seguir estas premisas.

Google Kubernetes Engine (GKE)

Kubernetes gestionado y securizado en GCP. Añade una capa de abstracción para manejar clusters fácilmente. Por describirlo con pocas palabras: “El kubernetes sin esfuerzo”. Uno de los productos estrella de GCP que cuenta con un montón de características sin, por ello, perder la compatibilidad con otros kubernetes. Veamos algunas de sus virtudes más importantes:

Istio

Posiblemente, el más famoso de los service mesh, Istio funciona perfectamente con Kubernetes y nos ofrece aislar las funciones de conexión, seguridad, control y observación de nuestros servicios.

¿Por qué es necesario un service mesh? Con el cambio de monolitos a microservicios se ganó en facilidad de desarrollo, pero gran parte de esa complejidad se trasladó de las aplicaciones a la comunicación entre los servicios: descubrimiento de los mismos, control de red, seguridad de las comunicaciones, monitorización… Según crecía nuestra red de micro servicios cada vez costaba más controlarlos y por eso se empezó a pensar en mallas de servicios (aka service mesh) como una solución para estos problemas, una manera de quitar complejidad y gestionarla uniformemente.

Ahora viene un micro-resumen de cómo funciona Istio. Para poder realizar sus tareas, Istio inyecta en cada pod un contenedor con un proxy (llamado envoy, como dijimos antes) de ayuda que se encarga de capturar todas las conexiones tanto entrantes como salientes para enrutar, asegurar la conexión y enviar los datos de telemetría. Además de estos “minions” para cada contenedor necesitamos un panel de control que se ocupe de controlarlos, inyectarlos y actualizarlos, una especie de titiritero que mueve los hilos.

En este panel de control tenemos tres componentes principales:

Es importante destacar que Istio puede enviar los datos a muchos recolectores de datos gracias a su sistema de plug ins. Dentro de GCP lo normal es usar su integración con StackDriver pero hay otras opciones que son igual de válidas. Como cambiar entre sistemas de telemetría no afecta al código de nuestras aplicaciones, desacoplamos completamente la parte de procesado y la de observabilidad.

¡Ojo a esto! Una vez que tenemos nuestras aplicaciones corriendo en este stack podemos no solo moverlas a cualquier otro entorno, sino que también podemos conectar los entornos para que trabajen conjuntamente.

Esto lo podemos hacer en gran medida gracias a Istio. Istio nos permite conectar los servicios de diferentes clusters de varias maneras, abriendo la puerta a entornos híbridos o multi nube:

Cloud Run

La versión gestionada de K native nos permite ejecutar cargas serverless sobre kubernetes o sobre la plataforma serverless de GCP, pudiendo elegir donde ejecutamos nuestros procesos. Gracias a este servicio tenemos las ventajas de los productos serverless como App Engine o Cloud Functions sin la limitación de lenguajes, librerías y el odioso vendor lock in. Si se puede ejecutar en un contendor, lo podemos ejecutar en Cloud Run.

Con Cloud Run podemos elegir cuántas llamadas puede atender cada contenedor, el uso de memoria o CPU, definir qué servicios o personas pueden ejecutarlo y ver fácilmente logs, trazas y métricas. Todo muy serverless, todo muy portable.

Stackdriver

La solución cloud gestionada para la observabilidad de los recursos de GCP (y otras fuentes gracias a sus conectores). Colecta datos de manera que no afectan al rendimiento de los componentes, analiza y monitoriza tu infraestructura en tiempo real, capacidad de crear tus propios indicadores, alarmas, métricas... Además, te permite crear dashboards con los datos de varios proyectos.

Una de las características que más gustan es el poder enviar subconjuntos de datos a BigQuery en streaming para luego poder analizarlos en caso de ser necesario. Fácil, potente y muy recomendable.

Marketplace

El marketplace de GCP nos permite encontrar soluciones listas para instalar con solo un click. Dispone de soluciones en MV, en contenedores y soluciones listas para cargar en Kubernetes.

Además de soluciones gratuitas nos encontramos con soluciones de pago que tienen integrado el coste en GCP. En una sola factura tendremos agrupados todos los costes, facilitándonos la vida. ¿Necesitas un cluster de Casandra para tu Kubernetes? Está a solo 3 clicks de distancia.

Todo muy bonito pero... ¿de verdad es portable?

Todos estos componentes tienen su versión OpenSource de forma que cuando queramos podemos llevarnos nuestras cargas a otro entorno, ya sea on premise u otra nube.

FunciónComponente en GCPComponente Libre
OrquestaciónGKEKubernetes puede ejecutarse en AWS, AZURE, Digital Ocean, vSphere...
Service MeshIstio add onIstio*
Lanzamiento serverlessCloud RunKnative*
Telemetría**StackdriverPrometheus*, Grafana*, Jaeger*, ElasticSearch*, Datadog
Repositorio de aplicacionesGCP MarketplaceHelm

Como hemos visto, hacer las cosas bien no es tan complicado como parece y los beneficios merecen mucho la pena. Gracias a conceptos como la contenerización, las mallas de servicios y los sistemas de telemetría, podemos soñar con un futuro en el que nuestras aplicaciones no se queden obsoletas… tan pronto.

Cuéntanos qué te parece.

Enviar.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.