Arquitectura Cloud Native
La arquitectura cloud native es un modelo de diseño de aplicaciones basado en cinco componentes fundamentales: contenedores, microservicios, APIs, orquestación con Kubernetes y automatización DevOps. Este enfoque descompone las aplicaciones en servicios independientes que se despliegan, escalan y actualizan por separado, en lugar de operar como un único bloque monolítico, una diferencia estructural que explicamos en detalle en nuestra comparativa entre aplicaciones cloud native y aplicaciones tradicionales.
La arquitectura cloud native utiliza contenedores y Kubernetes para construir aplicaciones como conjuntos de piezas más pequeñas y combinables, que se escalan de manera eficiente, se actualizan de manera ininterrumpida y migran sin problemas a otros entornos. Es una tecnología rentable, con una mayor seguridad y una automatización más flexible.
El stack de Kubernetes on-premise
Vamos a explorar las diferentes capas del stack de Kubernetes on-premise, desde la infraestructura sobre la que se ejecuta Kubernetes hasta los servicios que se ejecutan sobre Kubernetes y que los desarrolladores pueden aprovechar para acelerar la entrega de aplicaciones. Tenga en cuenta que algunos componentes se pueden incluir en varias partes del stack. Por ejemplo, una distribución de Kubernetes puede incluir un registro de contenedores como Harbor o Quay. Como alternativa, se puede ofrecer un registro de contenedores como servicio alojado o administrado para su uso con cualquier distribución.
Plataforma de procesamiento
Kubernetes es muy flexible en cuanto a dónde se puede implementar, gracias a que la innovación está ampliando las opciones de cómo y dónde se puede operar. Por lo general, Kubernetes requiere un mínimo de 3 nodos con conectividad de red completa entre ellos y almacenamiento conectado. Hoy en día, Kubernetes se ejecuta más comúnmente sobre una infraestructura virtual como VMware. Los equipos físicos y la HCI son otras dos opciones comunes.
Las capacidades adicionales pueden facilitar el aprovisionamiento y el funcionamiento de un clúster Kubernetes. Las infraestructuras controladas mediante API (por ejemplo, Cluster API, Terraform, etc.) facilitan el aprovisionamiento y la conexión de nuevos nodos. Los hipervisores personalizados pueden ofrecer aislamiento de la carga de trabajo para conectar los agujeros de seguridad en los contenedores. Un equilibrador de carga fuera del clúster de Kubernetes es útil para hacer que las cargas de trabajo estén disponibles y reubicarlas y escalarlas dinámicamente. Algunas cargas de trabajo pueden beneficiarse de hardware personalizado, como GPUs o TPUs.
Distribuciones de Kubernetes
Desde el crecimiento explosivo de Kubernetes tras su lanzamiento en 2015, existen más de 100 distribuciones de Kubernetes y plataformas alojadas de gigantes tecnológicos y startups por igual. Estas empresas toman el código central de Kubernetes y lo combinan con otros proyectos como un stack de redes, herramientas de gestión de clústeres, registro, supervisión, etc., para generar una distribución.
Servicios de contenedores
Un entorno útil de Kubernetes requiere servicios de infraestructura adicionales más allá de Kubernetes. A veces se incluyen en las distribuciones o se añaden como servicios independientes, e incluyen algunos elementos básicos como un registro de contenedores, Ingress, equilibrador de carga, almacenes secretos o gestor de certificados, por nombrar algunos.
Según las muchas empresas que construyen e implementan aplicaciones en Kubernetes, hay muchos servicios centrales de los que dependen que también se ejecutan normalmente en Kubernetes. Algunos ejemplos son las bases de datos (por ejemplo, Redis, Postgres), Pub Sub (Kafka), indexación (ElasticSearch), servicios de CI/CD (Gitlab, Jenkins) y almacenamiento cloud native (Portworx, MayaData, Minio, Red Hat).
Muchas empresas han desarrollado productos que gestionarán o darán soporte a estas aplicaciones cloud native que se ejecutan en la distribución de Kubernetes elegida por el cliente. Lo más notable es probablemente Azure Arc Data Services de Microsoft, que proporciona Postgres y MS SQL como servicios gestionados en entornos de clientes, pero hay muchos otros, como Confluent for Kafka, Crunchy Data for Postgres, Redis Enterprise for Redis, Percona, Elasticsearch, Minio, Mayadata, etc.
Contenedores
Los contenedores son la unidad atómica del software nativo cloud. Un contenedor comprende un fragmento de código empaquetado con todas sus dependencias (binarios, bibliotecas, etc.) y se ejecuta como proceso aislado. Esto se traduce en un nuevo nivel de abstracción. Al igual que una máquina virtual (VM) abstrae los recursos de procesamiento del hardware subyacente, un contenedor abstrae una aplicación del sistema operativo subyacente.
Los contenedores se diferencian de las máquinas virtuales en varios aspectos importantes. Son significativamente más pequeños en cuanto a recursos, más rápidos de poner en marcha y mucho más fáciles de transportar entre entornos cloud. A diferencia de las máquinas virtuales, son de naturaleza efímera.
Los contenedores allanan el camino para la arquitectura de software de microservicios. Aunque las aplicaciones tradicionales son de naturaleza monolítica, las aplicaciones basadas en microservicios se construyen como conjuntos de piezas (servicios) más pequeñas combinables que pueden escalarse independientemente y permitir actualizaciones sin interrupciones. Un servicio comprende uno o más contenedores que realizan una función común.
Las aplicaciones basadas en contenedores/microservicios permiten prácticas de desarrollo de software optimizadas y aceleradas que requieren una integración y coordinación más estrictas entre los desarrolladores y las operaciones de TI, conocidas como DevOps.
Kubernetes
Debido a que las aplicaciones contenerizadas se prestan a entornos distribuidos y utilizan recursos de procesamiento, de almacenamiento y de red de manera diferente a las aplicaciones tradicionales, requieren una capa de infraestructura dedicada a orquestar cargas de trabajo contenerizadas.
Kubernetes se ha erigido como el organizador de contenedores dominante, y a menudo se lo considera el sistema operativo de la cloud. Es una plataforma portátil, extensible y de código abierto para la gestión de cargas de trabajo y servicios en contenedores, que facilita tanto la configuración declarativa como la automatización.
Específicamente, Kubernetes:
asigna contenedores a equipos (programación)
arranca los contenedores especificados a través del tiempo de ejecución del contenedor
se ocupa de las actualizaciones, las reversiones y la naturaleza constantemente cambiante del sistema
responde a fallos (caídas del contenedor, etc.)
crea recursos de clúster como descubrimiento de servicios, redes inter-VM, entrada/salida de clústeres, etc.
Kubernetes está diseñado para ofrecer escalabilidad, disponibilidad, seguridad y portabilidad. Optimiza el coste de la infraestructura, distribuyendo las cargas de trabajo entre los recursos disponibles. Todos los componentes de un clúster Kubernetes también pueden configurarse para una alta disponibilidad.
La funcionalidad de Kubernetes evoluciona rápidamente como resultado de contribuciones continuas de su activa comunidad global, permitiendo ahora la existencia de una amplia variedad de distribuciones de Kubernetes disponibles para los usuarios. Al tiempo que los usuarios están mejor servidos por las distribuciones certificadas por CNCF (la conformidad permite la interoperabilidad), la automatización inteligente en torno a las características de gestión del ciclo de vida de Kubernetes, junto con la fácil integración de las capacidades de almacenamiento, redes, seguridad y supervisión, son fundamentales para los entornos nativos cloud de nivel de producción.