🌐

CloudNativeDevPlatform

Problema:

Debido a la complejidad administrar y desplegar soluciones de manera ágil en el entorno de cloud publico (AWS en nuestro caso), se propone una solución basada en tecnologías cloud nativo / open source, que ayude a los equipos de desarrollo adoptar el poder de los recursos e infraestructura cloud, en entornos de contenedores como Amazon EKS (Elastic Kubernetes Service).

Motivación:

La dificultad de establecer claramente responsabilidades entre los equipos de administración de sistemas e infraestructura por un lado y los equipos de desarrollo por el otro, así como promover mejores practicas y establecer procesos de despliegue facilitados sobre las mismas (golden paths). Sumando complejidad, si también consideramos la administración de múltiples entornos, configuraciones, seguridad y gobernanza, se hace indispensable contar con tecnologías y herramientas pensadas en el paradigma cloud nativo que faciliten la labor de todos los equipos involucrados.

Por todo lo mencionado, planteamos como linea de investigación y desarrollo para nuestro trabajo final de posgrado, una plataforma de desarrollo para el cloud publico, basada en las tecnologías open source reconocidas por la industria, bajo el paradigma cloud nativo / open source.

Propuesta:

Tecnologías:

Se enumeran las conceptos y tecnologías desarrollados durante el cursado y su aplicación en el presente proyecto:

  • Cloud AWS
  • Arquitectura cloud
  • Networking
  • Infraestructura como codigo
  • Automatización
  • GitOps
  • Contemporización / Kubernetes
  • Alta disponibilidad / Elasticidad
  • Aplicaciones cloud native
  • Delivery engineering
  • DevOps
  • CI-CD
  • Bases de datos
  • Observabilidad
  • Seguridad y gobernanza
  • Platform Engineering

Caso de uso:

El rápido avance y auge del paradigma de desarrollo de microservicios en entorno cloud nativo enfrenta a desarrolladores y administradores de infraestructura a la hora de desarrollar, desplegar, mantener y securizar cargas de trabajo, APIs, servicios, librerías y componentes asociados.

Este esquema plantea severos retos en cuestiones como:

Si bien la filosofía de trabajo bajo el esquema DevOps mitiga algunos de estos problemas, en concreto la fragmentación de conocimiento entre desarrollo y operaciones, comúnmente llamados silos de información, como así también fomentar una cultura participativa, de colaboración y proveer a los equipos de autonomía y creatividad. Creemos que con el continuo y acelerado crecimiento de herramientas, tecnologías y frameworks relacionadas al ámbito cloud nativo, en la actualidad no solo es necesario, sino urgente, implementar mejores practicas y procesos que faciliten la pronta adopción de dichos avances.

En el presente proyecto final queremos ir un paso mas allá, explorar ultimas tendencias y practicas para así, fruto de la combinación de experiencias pasadas, junto con la experimentación de nuevas ideas, establecer un esquema de trabajo superador que siente las bases para una plataforma de desarrollo bajo el paradigma cloud nativo.

Visión

Una solución que aporte simplicidad y soporte a todos los involucrados en la adopción de un modelo de desarrollo ágil basado en el paradigma cloud nativo.

Misión

La misión de la plataforma es el de incrementar la productividad de los equipos de desarrollo, mejorar la experiencia de uso, como también reducir la complejidad inherente a los despliegues, estableciendo “golden paths” que sienten las bases para despliegues automatizados, manteniendo la estandarización en los procesos de CI-CD, como también asegurando la calidad y seguridad de las cargas de trabajo y la infraestructura subyacente.

Objetivo

El objetivo es lograr el desarrollo e implementación de una plataforma interna de desarrollo basada en AWS EKS que permita a los desarrolladores auto-proveerse de la infraestructura necesaria para el despliegue automatizado de aplicaciones y cargas de trabajo en el cloud.


Implementación

La solución plantea tres grandes bloques que constituyen en su conjunto una plataforma de automatización de infraestructura y despliegue de aplicaciones “containerizadas” en el entorno AWS EKS. Para lograrlo integraremos tecnologías maduras y recomendadas por lideres de la industria, junto con aprendizajes y mejores practicas que hemos aprendido durante el cursado, como también de la experiencia profesional en entornos públicos y privados

La solución plantea tres grandes bloques que constituyen en su conjunto una plataforma de automatización de infraestructura y despliegue de aplicaciones “containerizadas” en el entorno AWS EKS.

Para lograrlo integraremos tecnologías maduras y recomendadas por lideres de la industria, junto con aprendizajes y mejores practicas que hemos aprendido durante el cursado, como también de la experiencia profesional en entornos públicos y privados.

Mejores Practicas:

  • Desarrollo ágil
  • DevOps / CI-CD / GitOps
  • Infraestructura como código
  • Automatización
  • Platform Engineering

Tecnologías:

  • Cloud AWS
  • K8s / EKS / Fargate
  • GitHub / Actions
  • Terraform / Helm
  • ArgoCD / Crossplane

Planteo

El presente trabajo se divide en tres etapas, las cuales se han desarrollado de manera paralela y ajustando a medida de las necesidades, particularidades e inconvenientes relacionados al desarrollo de la plataforma sobre el entorno AWS Academy:

  1. IaC Toolkit - Infraestructura de base: EKS Cluster
  1. GitOps Toolkit: Despliegue y configuracion de herramientas de soporte: ArgoCD + Crossplane
  1. Sample Apps: Templating y despliegue automatizado de apps cloud native: Helm + Templates

Planteo

El presente trabajo se divide en tres etapas, las cuales se han desarrollado de manera paralela y ajustando a medida de las necesidades, particularidades e inconvenientes relacionados al desarrollo de la plataforma sobre el entorno AWS Academy:

  1. IaC Toolkit - Infraestructura de base: EKS Cluster + Terraform
  1. GitOps Toolkit - Despliegue y configuracion de herramientas de soporte: ArgoCD + Crossplane
  1. Sample Apps - Templating y despliegue automatizado de apps cloud native: Helm + Templates

Diagrama de solución


1. IaC Toolkit

Esta primera sección, se compone de la automatización de la infraestructura de base utilizando las siguientes tecnologías:

Terraform

Terraform es una herramienta de infraestructura como código, utiliza un lenguaje de configuración llamado HCL (HashiCorp Configuration Language) que nos permite describir la infraestructura cloud deseada.

En nuestro caso, la plataforma estará basada en EKS, por lo que hemos decidido crear una estructura modular de los componentes y hemos trabajado por separado las siguientes definiciones para montar la infraestructura subyacente: clúster EKS, networking, enrutamiento, seguridad, herramientas de GitOps / CI-CD.

En cuanto a configuraciones y variables de entorno, hemos decidido extraerlas fuera de las definiciones de los componentes que se detallan, para almacenarlas y administrarlas desde la herramienta de despliegue, tal como hemos venido trabajando durante el cursado, hemos elegido Github.

Github Actions

Hemos configurado dos pipelines para desplegar la infraestructura basada en el workflow: validate, plan, apply, destroy de Terraform

1. Pipeline: “Init Remote State”

En cuanto a configuraciones y variables de entorno, hemos decidido extraerlas fuera de las definiciones de los componentes que se detallan, para almacenarlas y administrarlas desde la herramienta de despliegue, tal como hemos venido trabajando durante el cursado, hemos elegido Github.

Github Actions

Hemos configurado dos pipelines para desplegar la infraestructura basada en el workflow: validate, plan, apply, destroy de Terraform

Pipeline: “Init Remote State”

La primera de ellas, se encargara solamente de la creación de dos componentes cloud: bucket y tabla DynamoDB para almacenar el estado de Terraform y su sistema de locks en remoto, lo que nos permite controlar y administrar de manera segura el despliegue de nuestra infraestructura desde diferentes terminales y equipos de desarrollo.

2. Pipeline: “Deploy EKS Cluster”

Esta segunda pipeline, es la que concentra el despliegue integro de la infraestructura que da soporte a la plataforma. Ha sido una ardua tarea conseguir el despliegue automatizado de punta a punta, desde la conectividad de red básica, hasta la instalación de componentes a través de Helm, como la obtención y guardado de credenciales y acceso a la plataforma desde ArgoCD.

AWS Credentials

El manejo de las credenciales de acceso a la cuenta de AWS, ha estado basado en las funcionalidades de secretos y variables de entorno brindadas por GitHub Actions, lo que brinda una fácil y segura administración de las mismas, como así también su aprovisionamiento y encriptación en las distintas etapas de las pipelines.

Despliegue end to end

A modo de ejemplo, se incluye una captura donde se muestra el resultado de la ejecución desde cero de la pipeline end to end, un total de 22 componentes en un tiempo aproximado de unos quince minutos, es lo que se demora en proveer toda la infraestructura y componentes de nuestra plataforma

EKS / Networking

El despliegue del clúster EKS que brinda servicio a la plataforma, ha sido complicado debido a las particularidades de los entornos de laboratorios con los que contamos en AWS Academy, por ello se ha decidido una configuracion básica, basada en la ultima versión de kubernetes, un grupo de nodos reducido en tamaño, y configuracion de red estándar para sub-redes tanto publicas como privadas.

Debido a la falta de recursos y las mencionadas limitaciones, se ha tomado la decisión de utilizar el mismo clúster que brinda servicio a la plataforma, para demostrar también el despliegue automatizado de las aplicaciones y recursos cloud.
Idealmente, y tal como se detalla en el diagrama de la solución, se recomienda montar por separado ambas cargas de trabajo, para poder demostrar el poder de despliegue sobre múltiples entornos (desarrollo, testing, pre-producción, producción) de esta plataforma en su totalidad.


2. GitOps Toolkit

En esta segunda parte, nos concentraremos en el despliegue automatizado de aplicaciones con GitOps.

GitOps se basa en la utilización de repositorios de Git como fuente de verdad para iniciar el lanzamiento de las fases del proceso de integración continua (CI), como también del proceso de distribución continua (CD).

Se hace un seguimiento de todos los cambios en el código, resultando en un despliegue continuo y actualizado de actualizaciones y cambios en código y configuraciones, además de servir de respaldo en caso de ser necesario restaurar el sistema, o bien conciliar diferencias de las que se desconoce su origen.

En resumen, GitOps ofrece:

ArgoCD

Siguiendo este enfoque, hemos optado por integrar ArgoCD en nuestra plataforma, la cual nos permite realizar un seguimiento de nuestros repositorios de configuración y aplicaciones, de una manera visual y amena para todos los tipos de perfiles que interactúan con la plataforma.

Para ello hemos decidido emplear características avanzadas de ArgoCD:

Configuración de ArgoCD

La configuración de las características anteriormente mencionadas se especifica también dentro del repositorio de infraestructura como código, de la siguiente manera:

  • ApplicationSets para desplegar proyectos y aplicaciones, como también los distintos componentes de configuracion de Crossplane
  • Definición de templates para aplicaciones y proyectos en formato de Helm Charts
  • Definición de aplicación base que engloba a todo lo anteriormente mencionado y facilita su despliegue automatizado, en el Helm Chart llamado platform-core

Crossplane

Como ultimo componente, para completar el toolkit de GitOps, se ha escogido a Crossplane, un proyecto open source, apoyado por la CNCF, que proporciona un control-plane sobre kubernetes para proveer infraestructura cloud. Crossplane ofrece y expone APIs de autoservicio de alto nivel para que los distintos equipos las puedan consumir simplemente detallando aquellos aspectos relevantes para la aplicación.

No intenta ser una herramienta de infraestructura como código (IaC) de propósito general, sino más bien un complemento de las cargas de trabajo que se despliegan en Kubernetes

Esto representa ventajas a la hora de facilitar la compresión por parte de los equipos de desarrollo, sobre las definiciones de los componentes y recursos cloud:

Configuración de Crossplane + AWS + Argo CD

De manera análoga a como lo hicimos con ArgoCD, se especifican las distintas configuraciones de Crossplane, junto con su proveedor de AWS y definición de los recursos FargateProfile y Certificates, como templates con su correspondiente Helm Chart para su despliegue automatizado a través de ArgoCD, desde la aplicación base: platform-core

XRDs

Hemos decidido implementar solamente un par de recursos en Crossplane, debido a las limitaciones de AWS Academy, como del tiempo y esfuerzo necesarios que sobrepasan el alcance y duración del presente proyecto.


3. Sample Apps

Finalmente nos encontramos con la definición de las aplicaciones en un formato de templates YAML que resulta de fácil compresión para los equipos de desarrollo.

Helm Chart

La estructura base de una aplicación cloud nativa para el entorno de Kubernetes se define a través de las siguientes templates:

https://github.com/scalzadonna/upc-cloud-arch-tfp-apps/tree/main/helm/namespaced-apps/templates

Values Templates

Esta otra template especifica los valores concretos para una aplicación de ejemplo, donde permite ver el nivel de abstracción alcanzado sobre el despliegue de la aplicación y recursos cloud asociados.

Como ejemplo sencillo, adjuntamos una template para el despliegue de un servidor web como apache/httpd o nginx:

https://github.com/scalzadonna/upc-cloud-arch-tfp-apps/blob/main/namespaced-apps/demo-nginx/demo-nginx.yaml

Conclusión

Como hemos intentado demostrar en el presente trabajo, el diseño e implementación de una plataforma de desarrollo y despliegue cloud nativo no es una tarea sencilla, y requiere del esfuerzo continuado de todas las partes involucradas.

Durante el desarrollo de la misma, hemos podido experimentar y aprender de la potencia de las herramientas open source para cloud nativo, y habiendo aprendido de ellas nos proponemos seguir trabajando sobre esta plataforma para integrar lo que consideramos avances y herramientas accesorias pero necesarias para un correcto aprovechamiento y adopción de la plataforma:

Multi-cluster setup

Extender el despliegue a diversos entornos, tanto de desarrollo, pruebas como integración y producción.

Service Catalog

Definir un catalogo de servicios, para facilitar el consumo y desarrollo de aquellos componentes y aplicaciones cloud que sean aptos para ser reutilizados y normalizados.

Web Portal → Backstage

Poder contar con una interfaz de usuario avanzada para controlar y visualizar el despliegue y configuracion de la infraestructura y aplicaciones.


Integrantes:


Referencias:

Infra Automation repo:

https://github.com/scalzadonna/upc-cloud-arch-tfp-infra

Apps repo:

https://github.com/scalzadonna/upc-cloud-arch-tfp-apps

Platform Core on ArgoCD:

https://argocd.upc-tfp-eks.santiscalzadonna.com/