Kubernetes y la necesidad de ser Cloud Native y 12-Factor

Anselmo Abadía
Flux IT Thoughts
Published in
4 min readApr 30, 2020

--

Velar por la calidad de nuestros desarrollos y la sanidad de las aplicaciones que creamos es un principio que, como fluxers, nos identifica. Y es por eso que tomamos la decisión de que todos los desarrollos que estén en nuestras manos se guíen por los conceptos de Cloud Native y de 12-Factor.

¿Qué es una aplicación Cloud Native?

Una aplicación es Cloud Native no cuando puede correr en un servicio de la nube como AWS, sino cuando puede correr en cualquier tipo de nube. No sólo hace referencia a microservicios o Kubernetes: es un paradigma que habla de las prácticas, herramientas e infraestructura para que nuestra aplicación sea ejecutable en cualquier cloud, sea privada o pública, facilitando aspectos como disponibilidad, confiabilidad, escalabilidad, etc.
Tiene que ver con cómo se construyen y despliegan nuestras aplicaciones, sin importar el dónde. Cuanto más portable es nuestro desarrollo entre diferentes providers, mayor es el nivel de madurez de nuestra aplicación con respecto a Cloud Native.

¿Qué es 12-Factor?

12-Factor es una metodología de trabajo creada por desarrolladores de Heroku, en pos de construir aplicaciones SaaS de la mejor forma, siguiendo una serie de principios:

Esta metodología se presentó a través de un manifiesto publicado en 13 idiomas, en el cual se explican los objetivos que busca cumplir "12 Factor":

  • Configuraciones automatizables y explícitas.
  • Dependencias claras con el entorno, para máxima compatibilidad.
  • La aplicación debe ser desplegada en la nube.
  • Despliegue continuo.
  • Aplicaciones enfocadas en la escalabilidad.

Los 12 factores

A continuación te cuento cómo entendemos los 12 factores en Flux IT, y cuáles son las keywords principales que asociamos a cada uno.¹

  1. Código base (codebase): el código fuente debe ser gestionado con un esquema de branching y versionado.
    Keywords: Git, GitFlow, trazabilidad, semantic version.

2. Dependencias: todas las dependencias de la aplicación deben ser explícitas y existir un sistema que las instale.
Keywords: Maven, Npm, Artifactory.

3. Configuraciones: las configuraciones deben ser externalizadas del paquete generado de la compilación del código fuente.
Keywords: variables de entorno, configuración externalizada, ConfigMaps.

4. Backing services: tratar a los backing services como pueden ser bases de datos o volúmenes con commodities, evitando el vendor lock-in.
Keywords: RDS, Kubernetes Volumes.

5. Construir, desplegar, ejecutar: separar completamente la etapa de construcción de la etapa de ejecución de la aplicación.
Keywords: Pipelines independientes de cada etapa, paquete único independientemente del ambiente.

6. Procesos: ejecutar la aplicación como uno o más procesos sin estado.
Keywords: Stateless.

7. Asignación de puertos: la aplicación tiene que ser autocontenida y exponer puertos para su exposición. Es decir, no depender de ningún application server externo.
Keywords: Docker, Spring Boot.

8. Concurrencia: escalar mediante el modelo de procesos, delegando al gestor de procesos esta tarea.
Keywords: Kubernetes, Docker Swarm.

9. Desechabilidad: hacer el sistema más robusto, intentando conseguir inicios rápidos y finalizaciones seguras. Los procesos pueden destruirse y crearse en cualquier momento.
Keywords: Kubernetes Deployments, Microservicios.

10. Paridad en desarrollo y producción: mantener desarrollo, preproducción y producción tan parecidos como sea posible. Homogeneizar al máximo los ambientes, y el uso de mocks.

11. Historiales: los eventos de logs deben ser tratados como stream de datos y no ser manipulados por la aplicación.
Keywords: Observability, ELK, Grafana, Prometheus, Loki, stdout

12. Administración de procesos: ejecutar las tareas de gestión/administración como procesos que solo se ejecutan una vez.Automatizar todo, hasta los scripts de la BD
Keywords: Liquibase, Kubernetes Job.

¿Cual es la importancia de estos atributos y qué relación tienen con Kubernetes?

Kubernetes es el orquestador de contenedores. Hoy en día picó en punta y ganó la batalla sobre el resto de las herramientas. El uso de K8S OnPremise, por ejemplo con OpenShift o en Cloud (como EKS, AKS o GKS) nos incita a evolucionar nuestros desarrollos para poder desplegar en estas plataformas.

Cuando las aplicaciones son Cloud Native y cumplen con los 12-factores, todo se simplifica.

Los cambios de infraestructura: se vuelve relativamente sencillo mover nuestra aplicación a diferentes clusters. Por ejemplo, mover de un cluster on-prem a otro cluster de K8s en la nube, como puede ser EKS de AWS.

Los despliegues: desplegar aplicaciones y actualizaciones se vuelve una tarea natural evitando la degradación de servicio. Por ejemplo, realizar un Blue/Green deployment con Kubernetes.

El escalado: la independencia entre nuestra aplicación y la capacidad de cómputo permite que conceptos como el escalado horizontal y vertical sean posibles. El auto-scaling es una realidad que permite principalmente atender los picos de demanda abaratando costos.

Los desarrollos se vuelven más confiables y sostenibles con un costo de mantenimiento más bajo de lo habitual.

¹ https://12factor.net/

Conocé más sobre Flux IT: Website · LinkedIn · Breezy · Instagram ·Twitter · Dribbble

--

--