En este artículo vamos a ver:
1. Introducción
Iniciamos una serie de artículos en los que vamos a trabajar en una prueba de concepto (Proof of Concept) donde desplegaremos una aplicación en un clúster de Kubernetes. Esta PoC la vamos a llevar a cabo mediante el servicio autogestionado Elastic Kubernetes Service, de Amazon Web Services (AWS).
En estos artículos explicaremos las características de cada servicio y por qué nos son de utilidad, así como su funcionamiento y configuración. El objetivo es que, al final la lectura, llegues a ser capaz de reproducir la PoC que te planteamos, independientemente de tu nivel de conocimientos del ecosistema de AWS y de las tecnologías relacionadas. Recuerda que si te quedas bloqueado en algún punto o puedes aportar información constructiva, puedes dejarnos un comentario.
Pero, antes de entrar en materia, aclaremos algunos conceptos básicos.
¿Qué son los contenedores?
Los contenedores son unidades ejecutables de software que incluyen tanto el código o el ejecutable de la aplicación, como sus bibliotecas y dependencias. Mediante esta estrategia, se obtiene la posibilidad de que una aplicación pueda ejecutarse en cualquier lugar, independientemente del sistema operativo y ya sea en la opción de escritorio, en la TI tradicional o en la nube.
Para ello, los contenedores aprovechan una forma de virtualización del sistema operativo (SO) donde las características del kernel de SO se pueden utilizar para aislar procesos y controlar la cantidad de CPU, memoria y disco a los que podrán acceder dichos procesos. A diferencia de una máquina virtual, los contenedores no necesitan incluir un SO invitado en cada instancia. En su lugar, pueden simplemente aprovechar las características y recursos del SO del host. Es decir, mientras que cada instancia de máquina virtual precisa de un sistema operativo, los contenedores pueden compartir un mismo sistema operativo entre ellos, aligerando el tamaño del paquete así como los recursos necesarios para ejecutarse.
Las principales ventajas de los contenedores incluyen:
- Ligereza: Los contenedores comparten el kernel del SO de la máquina, lo que elimina la necesidad de una instancia de SO completa por aplicación y permite que los archivos de contenedor sean pequeños y utilicen pocos recursos.
- Portabilidad e independencia respecto de la plataforma: Los contenedores llevan todas sus dependencias con ellos, lo que significa que el software puede escribirse una vez y, a continuación, ejecutarse sin necesidad de posibles reconfiguraciones según se desplieguen en equipos portátiles, en entornos informáticos, en local o en la nube.
En resumen: los contenedores son, según hemos visto, pequeños, rápidos y portátiles. Permiten empaquetar y aislar las aplicaciones junto con todo el entorno de ejecución, es decir, con todos los archivos que requieren para ejecutarse, pero sin depender de un SO. Esto permite mover la aplicación que se encuentra dentro del contenedor entre diferentes entornos (desarrollo, test, producción, etc.), sin perder ninguna de sus funciones. Asimismo, también se pueden mover de ecosistema, infraestructura, host, sistema operativo, etcétera.
Aquí tienes un vídeo que profundiza un poco más en qué es un contenedor ¿Qué son los contenedores?
¿Qué es AWS?
Amazon Web Services (AWS) es una plataforma de servicios de computación en la nube ofrecida por Amazon. Proporciona una combinación de servicios de infraestructura, como almacenamiento de datos, computación y bases de datos, que se entregan como utilidades a escala de Internet.
Millones de clientes, incluyendo empresas emergentes de rápido crecimiento, las compañías más grandes y los organismos gubernamentales líderes, lo están usando para reducir costes, aumentar su agilidad en despliegues y desarrollos e innovar de forma más rápida.
Además, está diseñado para ser el entorno de informática en la nube más flexible y seguro disponible en la actualidad, cumpliendo con los requisitos de seguridad de alto nivel como los necesarios para logística militar y ejércitos, operaciones bancarias internacionales, salud y otras organizaciones que deben cumplir requisitos de confidencialidad muy estrictos.
En resumen, Amazon Web Services es una plataforma de servicios en la nube que ayuda a las empresas a escalar y crecer al proporcionar servicios seguros y de alta calidad en diversas áreas, desde el almacenamiento de datos hasta la inteligencia artificial.
¿Qué es AWS Fargate?
Fargate es un motor de computación “serverless” es decir, de pago por uso, que permite centrarse en la creación de aplicaciones sin la necesidad de administrar servidores. Es compatible con Amazon Elastic Container Service (Amazon ECS) y Amazon Elastic Kubernetes Service.
Con Fargate, podrás:
- Olvidarte de gestionar la infraestructura: Elimina la sobrecarga operativa para escalar, aplicar actualizaciones, proteger y administrar los servidores.
- Monitorear tus aplicaciones: Este servicio se integra perfectamente con servicios como AWS CloudWatch, que permite, entre otros, consultar los consumos del contenedor o ver logs del mismo.
- Optimizar los costes: Paga solo por los recursos de computación que uses, ya sea 1 minuto o un mes entero, siendo una alternativa más flexible que una instancia EC2.
¿Qué es una EC2?
Amazon Elastic Compute Cloud (Amazon EC2) es un servicio que proporciona capacidad de computación escalable en la nube de Amazon Web Services. Este servicio permite a los usuarios alquilar servidores virtuales en los que pueden ejecutar sus propias aplicaciones.
A diferencia de Fargate, las instancias ECS están definidas y su rendimiento y recursos están también fijados. Cabe destacar que AWS tiene más de 750 tipos de instancias diferentes, con distintas arquitecturas, procesadores, configuraciones de RAM, almacenamiento, redes, etcétera, por lo que siempre encontrarás un tipo que se adapte a tu caso de uso.
EC2 es notablemente más económico que Fargate, así que hay que, como en todos los casos, es una opción que debe tenerse en cuenta cuando se analiza cada necesidad. Según todas las alternativas que ofrece en este sentido AWS y las necesidades del proyecto, podremos elegir la mejor opción.
¿Qué es una Zona de Disponibilidad de Amazon (Availability Zone)?
Una Zona de Disponibilidad (Availability Zone) en AWS es una ubicación física donde Amazon aloja sus recursos. Cada región se compone de múltiples Availability Zones aisladas y físicamente separadas dentro de un área geográfica.
Cada Availability Zone tiene alimentación, refrigeración y seguridad física independientes y está conectada a través de redes redundantes de latencia ultrabaja, lo que permite que los clientes operen aplicaciones con un nivel de disponibilidad, tolerancia a errores y escalabilidad mayor.
En resumen, las Availability Zones son una parte fundamental de la infraestructura de Amazon Web Services que ayuda a garantizar la resistencia y la disponibilidad de los servicios que se ejecutan en su plataforma.
Una vez aclarados algunos puntos esenciales para poder llevar a cabo la prueba de concepto, en este primer articulo explicaremos qué es kubernetes y para que se usa, así como las principales diferencias entre un clúster típico y uno autogestionado por el servicio Elastic Kubernetes Service.
2. ¿Qué es Kubernetes?
Kubernetes es una plataforma que nos facilita la gestión de aplicaciones y/o servicios desarrollados para funcionar como contenedores.
Desde hace tiempo, se está optando por dejar de lado aplicaciones monolíticas para dar paso a aplicaciones formadas de micro-servicios, dada la mayor agilidad que ofrecen a la hora de desarrollar mejoras, add-ons y solucionar posibles errores.
Puedes consultar el siguiente enlace para ampliar la información: https://www.geeksforgeeks.org/monolithic-vs-microservices-architecture/ .
Si queremos aprovechar las ventajas de una estructura basada en micro-servicios, parece lógico evitar dedicar un servidor con un sistema operativo para cada uno de ellos y, por ese motivo, se optó por la virtualización. Al inicio, se pensó directamente en la virtualización de máquinas (con VMs o máquinas virtuales) y posteriormente, por los contenedores que, como hemos visto en la introducción, comparten SO y ofrecen mayor rapidez y menor consumo de recursos.
Puedes consultar el siguiente enlace para ampliar la información: https://www.docker.com/resources/what-container/ .
¿Qué pasa si nuestra aplicación está compuesta por decenas o centenares de micro-servicios? ¿Cómo gestionamos la carga en los servicios?
Ahí es donde entra en juego Kubernetes. Esta plataforma nos permite la “orquestación” de los contenedores y nos libera, en gran medida, de tareas para escalar la plataforma, actualizaciones manuales, balancear la carga, gestión de redes, etc.
Kubernetes es una herramienta esencial y utilizada por defecto en cualquier aplicación desarrollada con micro-servicios con contenedores, ya que al ser Open-Source, dispone de una comunidad tan activa y comprometida que ninguno de los sistemas propietarios de los principales proveedores cloud ha sido capaz de hacerle sombra.
Puedes consultar el siguiente enlace para ampliar la información y consultar todas sus capacidades: https://kubernetes.io/docs/concepts/overview/
2. Kubernetes 101’s (conocimientos básicos)
En Kubernetes, hay 2 elementos principales: los PODS y los NODOS. En la siguiente imagen podemos hacernos una idea esquemática de a qué nivel se encuentran cada uno de estos dos elementos y, a continuación, detallaremos qué es cada elemento y qué tarea ejecuta dentro del conjunto de Kubernetes.
2.1 PODS
Un POD es la unidad básica y puede contener uno o más contenedores. Los contenedores dentro de un mismo POD comparten red y almacenamiento, y se ejecutan en un nodo del clúster. En nuestro caso, un POD sería un micro-servicio.
En la imagen superior están indicados como círculos y pueden, o no, disponer de almacenamiento.
2.2 Nodos
Un nodo es una máquina física o virtual que forma parte de un clúster y tiene la capacidad de ejecutar contenedores. Cada nodo es una instancia individual en la que se despliegan y ejecutan las aplicaciones encapsuladas en contenedores.
En la imagen superior está indicado como un hexágono.
En el caso específico de Amazon Elastic Kubernetes Service (EKS) —que es el servicio gestionado de Kubernetes de Amazon Web Services—, un nodo equivaldría a una instancia de Amazon EC2 o a una tarea de Fargate registrada en el clúster de Kubernetes. Estas instancias EC2 o tareas serán las que realmente ejecutarán los contenedores de tus aplicaciones.
2.2.1 Nodos Master
El nodo maestro (master node) es uno de los componentes clave del clúster y desempeña un papel central en la gestión y coordinación de las operaciones de este. El nodo maestro es responsable de tomar decisiones sobre la orquestación y el estado general del clúster.
2.2.2 Nodos Worker
Un nodo de trabajo (worker node) es responsable de ejecutar las cargas de trabajo reales y ejecuta las aplicaciones contenidas en los pods.
2.3 Node Gorups (grupos de nodos)
Los Node Groups se utilizan para agrupar nodos con características similares, como capacidades de hardware específicas o roles especializados, entre otros. Ayudan en la administración y el despliegue de aplicaciones al permitir la asignación selectiva de cargas de trabajo a nodos específicos según sus características o la configuración de auto-escalado.
También permiten ejecutar actualizaciones a los distintos nodos, indicando, por ejemplo y entre otras opciones, cuántos nodos se pueden actualizar a la vez.
3. ¿Qué es Elastic Kubernetes Service o EKS en AWS?
EKS es un servicio de Amazon Web Services que permite ejecutar un clúster de Kubernetes aprovechando todas las ventajas que ofrecen, como por ejemplo, respecto a la elasticidad de la capacidad de computación.
A pesar de que cualquier proveedor cloud también dispone de herramientas para crear una aplicación haciendo uso de micro-servicios escalados, hacerlo en Kubernetes permite que aplicaciones que ya están corriendo on-premise o en otro proveedor puedan ser fácilmente replicables en cualquier otro sistema.
3.1 Diferencias principales de EKS respecto al típico montaje de Kubernetes
Como hemos mencionado en este mismo artículo, existen 2 tipos de Nodos: los tipo Worker y los tipo Master. Unas de las ventajas si utilizamos EKS es precisamente que no será necesario crear de manera manual el Nodo Master, ya que EKS lo creara automáticamente. La configuración automática aplicará por defecto todas las buenas prácticas para este tipo de montaje, como por ejemplo, la redundancia del nodo (Master) en otra AZ (Availability Zone) además de en la que estemos realizando el montaje. En otras palabras, si en la zona donde estamos realizando la configuración hubiera algún problema, nuestro montaje no dejaría de dar disponibilidad.
Otras de las ventajas a destacar son la disminución de tiempo de dedicación a tareas de mantenimiento y el aumento de la seguridad. EKS ofrece un panel donde fácilmente podemos actualizar nuestro clúster con paquetes cerrados y testeados, eludiendo de esta manera una tediosa actualización de cada clúster uno a uno.
Cabe también destacar la posibilidad de añadir y mantener add-ons de manera muy sencilla. Estos add-ons pueden ser integraciones con otros servicios de AWS —como puede ser AWS Elastic File System para compartir datos entre PODS— o de terceros desde su marketplace.
Otras ventajas:
- Dashboard (Control Plane) simplificado y de alta disponibilidad.
- Escalado automático de recursos.
- Posibilidad de usar Computación Serverless con Fargate.
En el próximo artículo, empezaremos con una demostración y explicaremos cómo crear tu primera aplicación en Kubernettes.
Pagina principal: engisoftcloud.com
Siguiente artículo: 2. El proyecto, ¿Qué necesitamos?