23 de marzo de 2021, 7:41 hora local, Km. 151, un megabuque de 199.489 GT sufre un apagón. No, no es el nombre de un servidor, ni un data center secreto. Se trata del Ever Given, un supercarguero japonés con 400 metros de eslora y cerca de 220.000 toneladas de capacidad que dan para 20.000 contenedores. Lo que viene después es de sobra conocido: 6 días más tarde se reflotó el barco y el tráfico por el canal de Suez se restableció.
Lo sucedido ha hecho que por un momento nos paremos a pensar en cómo funciona nuestro mundo y lo frágil que es. Se produce en una parte del mundo (generalmente Asia), se coloca en contenedores y se envía a algún puerto por lo general lejano. En el trayecto hay innumerables situaciones a tener en cuenta para que algo aparentemente tan sencillo concluya con éxito: desde la situación del puerto, los estibadores, el estado de la mar, del barco, la pericia de la tripulación, el clima, la presencia de piratas (en la mar o en la nube), de las FAS protegiendo los envíos, su posterior transporte por carretera, etc.
A nivel de programación sucede algo parecido. Algo tan aparentemente sencillo como poder ver una película en Netflix esconde muchas decisiones, horas de planeamiento y riesgos que casi nunca se cumplen porque hay excelentes programadores detrás.
Cada nube viene a ser uno de esos supercargueros y, gracias a “la nube”, ha sido posible el desarrollo de una arquitectura de programación que, poco a poco, se ha posicionado como una de las más usadas: la “arquitectura” de microservicios.
Las aplicaciones basadas en microservicios dividen su funcionalidad en servicios especializados, muy desacoplados, que se comunican entre ellos y colaboran a través de APIs. Cada microservicio se ejecuta independientemente de los demás en su propio proceso, máquina virtual o contenedor. La ventaja principal de esto es la separación de responsabilidades, que hace que las aplicaciones sean por lo general más fáciles de desarrollar, mantener y escalar, aunque como veremos al hablar de contenedores requiere estar muy atentos a muchas cosas.
La contrapartida de los microservicios es que aumenta el trabajo de gestión y mantenimiento de infraestructura, así como la orquestación del conjunto, la integración y el versionamiento, para lo que afortunadamente existe un amplio número de aplicaciones que facilitan el proceso y hacen que compense.
Docker, el contenedor
Un contenedor vendría a ser como un kit de supervivencia. Contiene todo lo necesario para que un soldado, en este caso un programa, pueda realizar su misión sin necesidad de preocuparse por otros aspectos secundarios pero cuya gestión requiere tiempo, atención y es necesaria, como podrían ser la alimentación y en el caso del software, por ejemplo, controlar las versiones en los distintos entornos. Ofrecen por tanto autosuficiencia.
Ejemplo del contenido de una ración individual de combate del ejército español. Imagen: Expansión.com →
Los contenedores son una forma de virtualización del sistema operativo. Un solo contenedor genera el entorno necesario para ejecutar, desde un microservicio o un proceso de software a una aplicación de mayor tamaño.
Dentro de un contenedor se encuentran todos los ejecutables, el código binario, las bibliotecas y los archivos de configuración necesarios. Frente a los métodos de virtualización de máquinas o servidores, los contenedores no contienen imágenes del hardware, por lo que son más ligeros y portátiles, con una sobrecarga significativamente menor.
Habíamos dicho que no es tan obvio desarrollar, mantener y escalar las aplicaciones. Si optamos por los microservicios podemos encontrarnos que una aplicación empresarial tenga cientos e incluso miles de contenedores o instancias que se ejecutan en producción.
Como indica Microsoft, estos desafíos generan nuevas demandas al usar herramientas de DevOps, por lo que tiene que definir nuevos procesos en sus actividades y encontrar respuestas para las siguientes preguntas que debemos resolver las empresas de desarrollo:
Flujo de trabajo genérico de ciclo de vida de aplicaciones de Docker de un extremo a otro.
Fuente: Microsoft
Sus posibilidades son tantas que Netflix ha creado su propia plataforma de contenedores. Se llama Titus y es de código abierto. Impulsa aspectos críticos del negocio de Netflix, desde transmisión de video, recomendaciones y aprendizaje automático, big data, codificación de contenido, tecnología de estudio, herramientas de ingeniería internas y otras cargas de trabajo de la compañía Hay que entender que Netflix lanza “hasta medio millón de contenedores y 200.000 clústeres por día”.
Por una parte Docker comenzó como un proyecto de código abierto liderado por Solomon Hykes, que adquirió gran relevancia por sus integraciones con OpenShift, AWS, IBM, Microsoft y otros. La idea de una implementación de contenedores ampliamente aceptada por proveedores de nube a bajo costo de configuración comenzó a inundar a los emprendedores tecnológicos haciendo que el proyecto creciera en popularidad rápidamente. En junio de 2015, Docker donó la especificación de imagen del contenedor y el código de tiempo de ejecución, ahora conocido como runc, a Open Container Initiative (OCI) para ayudar a establecer la estandarización a medida que el ecosistema de contenedores crece y madura.
Siguiendo esta evolución, Docker continúa contribuyendo con el proyecto containerd, que Docker donó a Cloud Native Computing Foundation (CNCF) en 2017 y el proyecto cambió de nombre; ahora es The Moby Project.
Por otra parte, Docker In es una empresa que promueve la tecnología de contenedores, ofreciendo servicios empresariales y manteniendo la versión de la comunidad. Docker cuenta con Docker Engine, un entorno de ejecución. Permite compilar y ejecutar contenedores en cualquier equipo de desarrollo y, después, almacenar o compartir imágenes de contenedor mediante un registro de contenedor, como Docker Hub. A nivel de arquitectura se compone de un servidor llamado Docker Daemon, un API y un cliente.
Ventajas de los contenedores
Virtual Machines
Containers
Además tienen la ventaja, al igual que los contenedores físicos, de poder “apilarse”, es decir, podemos agruparlos en clústeres de contenedores y, mediante los llamados orquestadores, poder gestionarlos y así trabajar con aplicaciones/servicios de mayor tamaño.
Kubernetes, el orquestador
Como hemos visto, el número de contenedores para una aplicación suele ser elevado por lo que es necesario gestionarlos de forma simultánea. Para ello aparecen los orquestadores u organizadores.
Docker tiene su propio orquestador llamado Docker Swarm que se centra en la creación de clústeres para contenedores de Docker (por supuesto se integran a la perfección con el ecosistema de Docker y usan su propia API).
Sin embargo, Google lanzó su propio orquestador de código abierto llamado Kubernetes (K8s) que es mucho más rico, más extensible y personalizable que Swarm, especialmente cuando se trata de monitoreo del sistema y escalado automático. Admite flujos de trabajo más complejos y se usa con mucha más frecuencia en entornos de producción. Con K8s podemos, por ejemplo:
Además, Kubernetes es un servicio muy popular ofrecido por los principales proveedores de nube como: Azure Kubernetes Service, Amazon Kubernetes Service, Google Kubernetes Engine, OpenShift, IBM Kubernetes Service… Esto, unido a que se ha convertido en “otro estándar”, hace que sea el servicio elegido por Cuatroochenta para orquestar los contendores.
Kubernetes y Docker trabajan juntos para construir y ejecutar aplicaciones creadas con contenedores
Puesta en producción con Kubernetes
Las ventajas de trabajar con Kubernetes y Docker:
Detrás de cualquier aplicación existen muchas decisiones que van desde el correcto análisis y diseño de la propia aplicación, el modo más adecuado de dar solución al problema planteado, así como utilizar las herramientas adecuadas que permitan dotar de seguridad, continuidad y escalabilidad al proyecto. En Cuatroochenta nos preocupamos de utilizar las mejores herramientas para aportar soluciones al cliente.