DevOps funcional con Scala y Kubernetes
Es claro que el BackEnd es líder en esta categoría de la programación pero sabemos que llevar el DevOps a FrontEd es todo un reto.
Usualmente, DevOps utiliza herramientas que se emplean mediante una configuración declarativa (YAML, XML, entre otras) y, en caso de haber un hueco, lo cerramos con algún script imperativo (Bash, Phyton).
Pero siempre surge la incógnita, ¿y si hacemos todo con Scala? Bien podríamos usar bibliotecas en lugar de herramientas, configuradas en un estilo de programación funcional (declarativo) y la brecha en las bibliotecas también se puede escribir en Scala.
Esto es lo que se hace cuando hablamos de desarrollo, codificando soluciones y utilizando bibliotecas para resolver problemas comunes.
Así que en este artículo probaremos hacer cosas nuevas e implementaremos actividades con el mismo enfoque de programación funcional que hemos empleado hasta ahora.
Caso de Estudio
Para explicarlo de la manera más simple, usaremos al mínimo la arquitectura del sistema que buscamos implementar. Este sistema se compone por una API BackEnd y una Base de Datos:
Tengamos en cuenta lo siguiente:
- La API BackEnd es un servicio sin estado accesible desde la web.
- La base de datos es un Elasticsearch (estado)
Este sistema tendrá que entregarse en iteraciones rápidas a la producción. La pregunta aquí es, ¿Dónde vamos a ejecutar nuestras aplicaciones?
A continuación explicamos cuáles son las mejores aplicaciones:
Kubernetes
Es un sistema de código abierto para administrar aplicaciones en contenedores en múltiples hosts; proporcionar mecanismos básicos para la implementación, el mantenimiento y el escalado de aplicaciones; buena solución para ejecutar nuestras aplicaciones sin la necesidad de preocuparse por el hardware subyacente.
Kubernetes brinda abstracción para que los desarrolladores puedan construir contenedores de sus aplicaciones y dárselos a un clúster de Kubernetes que se encargará de ejecutarlos donde haya potencia de cómputo disponible.
Ahora bien, ¿cómo se va implementar esta app?
Orkesta
Es un servidor de integración continua / implementación continua de código abierto como una biblioteca que se ejecuta en Kubernetes.
Aprovecha los conceptos de Kubernetes, como Jobs o Secrets, y la configuración como código en Scala para aprovechar al máximo la seguridad del tipo de tiempo de compilación y la compatibilidad con las bibliotecas de Scala o Java.
Las características clave que nos interesan son:
- Es extensible con bibliotecas Scala/Java.
- Se ejecuta en Kubernetes, por lo que podemos reducir la gestión operativa mediante el uso de un clúster de Kubernetes administrado como GKE o EKS. Además, podemos reutilizar la potencia de cálculo que queda en un clúster para las tareas de DevOps.
- Es altamente disponible, no es que estemos buscando el 100% de tiempo de actividad para una herramienta interna, pero permite el mantenimiento operativo posible sin afectar el uso de la herramienta durante las horas de trabajo.
- Es totalmente escalable, por lo que podemos ejecutar muchos trabajos en paralelo si el clúster de Kubernetes subyacente es lo suficientemente grande.
Integración Continua
La integración continua es muy sencilla y hay muchas herramientas para hacerlo como Travis, CircleCI, GitLabCI, Jenkins y muchos más.
Todo lo que queremos es probablemente para cada solicitud de extracción ejecutar una compilación completa, las pruebas, algún linter (como Scalafix, Scalafmt) y tal vez comprobar que se ha firmado el Acuerdo de Licencia de colaborador.
Además, Orkestra puede ejecutar esas comprobaciones en las solicitudes de extracción. Echemos un vistazo al código.