Comparativa de orquestadores: Docker Swarm vs Kubernetes vs Apache Mesos

El apogeo de los contenedores ha transformado la manera de enfocar el desarrollo, el despliegue y el mantenimiento de aplicaciones.

En este artículo vamos a hablar de los tres orquestadores más comunes dentro de la comunidad OpenSource: Docker Swarm, Kubernetes y Apache Mesos. Analizaremos las ventajas e inconvenientes que nos ofrecen cada uno, así como su enfoque.

Gracias a este análisis podremos elegir el orquestador que mejor se adapta a la arquitectura que vamos a implantar.

VM y Contenedores

Para contextualizar el post comenzamos recordando la herramienta más útil y eficaz en entornos distribuidos hasta la aparición de los contenedores: la máquina virtual (VM, Virtual Machine).

Una VM incluía un sistema operativo (SO) junto con la aplicación a utilizar. Si se ejecutaban varias máquinas virtuales, todas corrían sobre el mismo hardware base, cada una con su SO y sus recursos. Lógicamente, a medida que se necesitaba mayor número de VM, el coste de hardware se incrementaba.

Con la aparición de los contenedores solventamos el problema de hardware, pues disponemos del mismo SO, memoria y espacio en disco para todos los contenedores, lo que se traduce en un ahorro de recursos.

Un contenedor es una imagen que empaqueta conjuntamente la aplicación, sus dependencias y su configuración.

La aplicación en el contenedor puede gestionarse como una unidad e implementarse como una instancia dentro de un Contenedor de Host (que se encarga de asignar lo necesario a cada contenedor para el correcto uso). Este Contenedor de Host, a su vez, se ejecuta dentro del SO.

Contenedor de Host

¿Qué es un orquestador y para qué sirve?

Un orquestador, como la propia palabra indica, lo podemos definir con un “director de orquesta”, donde cada uno de los elementos a dirigir es un contenedor. Un orquestador tiene sentido cuando tenemos que manejar un sistema con muchos contenedores implementados sobre multitud de servidores, es decir, en un entorno clusterizado. En este escenario el manejo manual se complica demasiado.

Un orquestador se encarga, entre otras cosas, de:

  • Controlar y dirigir la creación de contenedores,
  • Verificar su correcta ejecución
  • Ofrecer una correcta gestión de errores.

Comparativa de Orquestadores

Vamos ya con el análisis de los 3 orquestadores OpenSource más comunes: Docker Swarm, Kubernetes y Apache Mesos.

a. Docker Swarm

Docker Swarm es el mecanismo de orquestación propio de Docker y está completamente integrado con la API Docker Engine. Esto hace que a cualquier persona que conozca Docker le sea muy sencillo empezar a usar Docker Swarm.

Este orquestador está soportado por AWS, de ahí su valor distribuido, y está basado en una arquitectura de controlador y nodos, donde un nodo es un cluster o instancia de swarm.

Está formado por dos tipos de elementos principales: los managers y los workers.

Los diferentes Managers se organizan entre sí para que uno de ellos sea el líder, asignando tareas a los workers. Un mánager puede también funcionar como worker si el sistema lo requiere.

Esquema Docker Swarm
Fuente: Docker docs

En un cluster Docker Swarm se crean servicios a partir de una imagen y una configuración, y estos servicios se distribuyen en el cluster como tareas.

Los servicios pueden ser replicados y globales:

  • Servicios replicados: es necesario indicar el número de réplicas que deben tener, proporcionando un buen servicio de escalado
  • Servicios globales: se creará una tarea por cada worker del cluster.

El nodo Manager de Swarm también se encarga de asegurar el estado del cluster y de notificar si las tareas se están ejecutando correctamente. Si un nodo entra en estado de mantenimiento, el nodo manager puede crear nuevas tareas y redistribuir la carga entre el resto de los nodos asegurando una alta disponibilidad.

El nodo Manager gestionará los recursos, Nombres DNS, dirección IP, cantidad de contenedores corriendo, parará y arrancará lo que le indiquemos, podrá balancear los Contenedores en los workers, agrega o quita contenedores y gestionará los denominados “servicios”.

Como hemos indicado, Docker Swarm utiliza la API de Docker, por lo que los comandos a utilizar son los propios de Docker, y no permite agregar nuevas operaciones.

Como nota negativa debemos indicar que no dispone de control de fallos, y esto en sistemas de alta disponibilidad supone un problema muy peligroso.

b. Kubernetes

Creado por Google, Kubernetes automatiza la gestión de aplicaciones en contenedores, permitiendo su despliegue, escalado y monitorización, entre otras características.

El despliegue se realiza a través de un datacenter, pero en lugar de gestionar contenedores, gestiona PODs, que pueden estar compuestos por uno o varios contenedores formando un servicio. Los contenedores de un mismo POD corren en el mismo nodo y comparten recursos.

Kubernetes se basa en un modelo de nodos master-slave, donde el master (que puede actuar también como slave) gestiona la creación de PODs y la distribución de los mismos en los diferentes nodos, según la disponibilidad de los recursos en el cluster.

Modelo de nodos de Kubernetes
Fuente: Open Knowledge Base

A diferencia de Docker Swarm, Kubernetes utiliza su propia API, con la ventaja de que pueden añadirse nuevas operaciones personalizadas según las necesidades que vayan surgiendo.

Puede trabajar con distintos tipos de contenedores como docker, rkt, cri-o o frakti, y puede trabajar conjuntamente con Apache Mesos.

La instalación de Kubernetes es manual y requiere configuraciones no automáticas, así como conocimiento del cluster que se quiera crear (gestión de roles, IPs…), en consecuencia, es más complejo que Docker Swarm.

Kubernetes permite el escalado de aplicaciones automáticamente mediante Deployments, que son scripts en YAML para la construcción y eliminación de PODs.

Otra ventaja es la alta disponibilidad, proporcionada mediante la supervisión de nodos, detectando los que no están funcionando correctamente y permitiendo eliminarlos.

Al ser de Google, podemos encontrarlo implementado en recursos de su propia plataforma (Google Cloud Platform), como Gmail, Maps, Drive… así como gestionando servidores disponibles en otras plataformas, ya sean públicas (AWS o Rackspace) o privadas (Openshift, Cloud Foundry o Deis).

c. Apache Mesos

Apache Mesos es un administrador de clusters Opensource basado en el kernel de Linux, aunque puede correr en cualquier plataforma (Linux, Windows o OSX)

Proporciona aplicaciones con APIs para la gestión y planificación de recursos.

Mesos permite el uso del cluster para la ejecución de frameworks sobre los cuales se ejecutan las aplicaciones, distribuyendo la carga entre distintos servidores y evitando sobrecargas.

 

Esquema de Apache Mesos
Fuente: Digital Ocean

Los frameworks más comunes son:

  • Apache Spark: plataforma de programación distribuida donde prima la velocidad de proceso
  • Cassandra: BBDD NoSQL que soporta grandes volúmenes de datos)
  • Akka: framework para la programación concurrente y distribuida
  • Apache Kafka: plataforma de alto rendimiento que actúa como intermediario de mensajes

Mesos utiliza un sistema de dos niveles de planificación que decide el número de recursos a asignar a cada framework, y el framework decide qué recursos aceptar y qué tareas debe correr en esos recursos. Así, permite optimización y escalado.

La arquitectura de Apache Mesos está basada en:

  • 3 nodos master: 1 activo y 2 en standby preparados ante fallos, que actúan como gestor de servicios,
  • 3 Zookeepers: sistemas centralizados de configuraciones que proporcionan sincronización distribuida y que permiten la tolerancia a fallos asignando un nuevo master cuando el activo falla,
  • y 3 slaves donde corren los frameworks.

Mesos soporta escalabilidad lineal y ofrece alta disponibilidad gracias a los Zookeeper

Puede trabajar con Kubernetes y da soporte para contenedores Docker y Appc.

Twitter, Apple, Paypal, Atlassian son ejemplos de compañías que utilizan Mesos en sus datacenter.

Conclusión

Después de analizar las ventajas e inconvenientes de los tres orquestadores, sólo quedaría elegir cuál es más completo y eficiente. Esto dependerá en cada caso de las necesidades, uso y desempeño de la arquitectura a desarrollar.

En líneas generales, Kubernetes es mucho más completo y complejo; mientras que, por sencillez y arranque inmediato Swarm, sería la mejor opción. Pero si hablamos de tolerancia a fallos aquí Swarm pierde toda la fuerza, de la misma forma que si consideramos los tipos de contenedores soportados.

Mesos, por potencia y servicio, podría presentarse como el contenedor ideal, si no fuera por una comunidad de soporte que, comparada con la de Kubernetes, le hace perder gran valor; a pesar de ello, hablamos de un orquestador perfectamente válido, añadido el hecho de que Kubernetes y Mesos pueden trabajar de forma conjunta.

¿Te pareció interesante? Compártelo:
Share on Facebook
Facebook
Share on Google+
Google+
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Print this page
Print
Email this to someone
email

Carlos Iván Morales Terrer

J2EE Senior Developer en Profile