Docker vs Kubernetes: ventajas y desventajas
La virtualización se ha vuelto una práctica muy habitual, especialmente en lo servicios en la nube para poder sacar mayor partido de los servidores de los centros de datos. Pero, últimamente, la virtualización basada en contenedores es la que se está imponiendo, ya que permite una gestión mucho más eficiente (al no tener que duplicar ciertos procesos). Y es en este auge cuando surgen las batallas tipo Docker vs Kubernetes.
Dos proyectos muy populares, que seguro que ya conoces. Ambos con sus ventajas y desventajas, y con diferencias que pueden ser clave a la hora de ayudarte a elegir un proyecto según tus necesidades…
¿Qué es la virtualización basada en contenedores?
Como sabes, existen varios tipos de virtualización, como la virtualización completa, paravirtualización, etc. Pues bien, en este apartado me centraré en la virtualización completa que se usa generalmente cuando se montan máquinas virtuales, y los contenedores, para no introducir otras variables que te puedan confundir.
- Máquinas virtuales: es un enfoque de virtualización centrado al alcance. Se basa en un hipervisor, como puede ser KVM, Xen, o programas como VMWare, VirtualBox, etc. Con este software, se emula una máquina física completa (vCPU, vRAM, unidades de disco, redes virtuales, periféricos, etc.). Así se puede instalar un sistema operativo (guest) en este hardware virtual y desde él poder instalar y ejecutar las aplicaciones de la misma forma como se haría en el sistema operativo host.
- Contenedores: es otra tecnología en la que se una una especie de jaula o sandbox en la que se puede prescindir de algunas partes de eses sistema completo, lo que resulta más eficiente y con algunas ventajas de portabilidad y seguridad extra (aunque no está libre de vulnerabilidades). De hecho, en vez de tener un hipervisor, en estos casos hay un software como puede ser Docker y Kubernetes que usarán al propio sistema host para ejecutar las apps aisladas. Lo negativo es que solo te permite desplegar apps nativas del propio SO anfitrión. Es decir, mientras en una MV puedes virtualizar Windows sobre una distro Linux, por poner un ejemplo, y sobre ese Windows puedes ejecutar cualquier app nativa para éste, en un contenedor solo podrás hacerlo con apps soportadas por el sistema anfitrión, en este caso con Linux…
Recuerda que las extensiones o soporte de virtualización por hardware, como Intel VT y AMD-V han conseguido mejorar el rendimiento bastante, suponiendo tan solo una sobrecarga para la CPU de un 2%. Pero eso no es aplicable a otros recursos como la memoria o el propio almacenamiento que se parcela para la virtualiación completa, lo que significa una exigencia de recursos considerable.
Todo esto es lo que viene a resolver los contenedores, que no necesitan duplicar ciertos procesos para poder desplegar una aplicación. Por ejemplo, si quieres crear un contenedor con un servidor Apache, con la máquina virtual completa tendrías el sistema operativo host, el hipervisor, el sistema operativo guest, y la el software de dicho servicio. En cambio, con el contenedor solo tendrías que tener el software que implementa dicho servicio, ya que se estaría ejecutando en una «caja» de forma aislada y usando al propio sistema operativo anfitrión. A parte de eso, el lanzamiento de la app es muy más rápido, al eliminar el SO huésped.
¿Qué es Docker?
Docker es un proyecto de código abierto, bajo licencia Apache, escrito en lenguaje de programación Go y que sirve para automatizar el despliegue de aplicaciones dentro de contenedores. Es decir, este software te permitirá gestionar contenedores sobre distintos sistemas operativos, ya que funciona en varias plataformas.
Cuando apareció Docker, presentaba muchas ventajas, y se extendió rápidamente. Su visión aislada del sistema operativo y sencillez, permitían construir contenedores con apps, implementarlos, escalarlos, y ejecutarlos de forma rápida. Una forma de lanzar todas las apps que necesites con un consumo mínimo de recursos.
En resumen, Docker ofrece las siguientes características clave:
- Aislamiento del entorno.
- Gestión de los contenedores.
- Control de versión.
- Emplazamiento/Afinidad.
- Agilidad.
- Productividad.
- Eficiencia.
Pero no estuvo libre de ciertos problemas, como cuando esos contenedores tuvieran que coordinarse, comunicarse entre ellos. Esto fue uno de los motivos que empujaron a la creación de Kubernetes…
Como luego comentaré sobre Docker Swarm, me gustaría comentar que es un software creado por los mismos desarrolladores de Docker para poder agrupar una serie de hosts de Docker en un clúster y gestionar así los clusters de forma centralizada, además de orquestar los contenedores.
¿Qué es Kubernetes?
Originalmente fue creado por Google, y luego donado a la Cloud Native Computing Foundation. Kubernetes también es un sistema similar a Docker, de código abierto, bajo licencia Apache, y escrito usando el lenguaje de programación Go. Sirve para automatizar el despliegue y gestión de aplicaciones en contenedores. Además, soporta diferentes entornos para la ejecución de contenedores, incluido Docker.
En definitiva, Kubernetes es una plataforma de orquestación de contenedores que se ocupa de ayudar a los diferentes contenedores de las distintas máquinas, su gestión, y distribución de carga entre ellos. Es especialmente esa organización la que ha convertido a este proyecto en una parte esencial en este tipo de escenarios…
- Programación automatizada.
- Capacidades Self-healing.
- Implementaciones y reversiones automatizadas.
- Balanceo de carga y escala horizontal.
- Mayor densidad de utilización de los recursos.
- Funciones orientadas a entornos empresariales.
- Gestión centralizada de aplicaciones.
- Infraestructura auto-escalable.
- Configuración declarativa.
- Fiabilidad.
Docker vs Kubernetes
Como te has podido percatar en la definición, ambos son muy similares en muchos sentidos, pero tienes sus diferencias, además de tener sus ventajas y desventajas como todo. Podrías pensar que conociendo estos detalles lo tendrías todo para saber cuál deberías elegir, según el objetivo que tengas.
No obstante, el problema es algo más complejo que eso. No se trata de Docker vs Kuernetes, ya que sería como comparar cosas muy diferentes y caerías en el error de pensar que tienes que elegir entre uno y otro. El resultado de Docker vs Kubernetes es absurdo, más bien deberías unir ambas tecnologías de forma conjunta para poder entregar y escalar aplicaciones en contenedores de una mejor forma.
Lo más adecuado sería comparar Docker Swarm con Kubernetes. Eso sí sería más acertado, ya que Docker Swarm es una tecnología de orquestación de Docker para la creación de clústeres para contenedores. Aunque, ni aun así sería del todo acertado… De hecho, Kubernetes se diseñó para ejecutarse en un clúster pudiendo coordinar clústeres de nodos a escala en producción de forma eficiente, mientras Docker lo hace en modo único.
Diferencias Docker vs Kubernetes
Salvando esas diferentes, si quieres conocer las divergencias entre Docker Swarm y Kubernetes, serían:
- Kubernetes incluye muchas opciones de personalización carentes en Docker Swarm.
- Docker Swarm es más sencillo de configurar debido a su simplicidad. Además, también es más sencillo integrar en el ecosistema Docker.
- En cambio, la tolerancia a fallos de Kubernetes es mayor, lo que puede ser más positivo en entornos como los servidores de alta disponibilidad.
- Docker Swarm es más rápido en cuando al despliegue y ampliación de contenedores.
- Kubernetes por su parte ofrece mayores garantías a los estados del clúster.
- El balanceo de carga en Kubernetes permite un mejor equilibrio, aunque no es automático como en Docker.
- Kubernetes ofrece mejor flexibilidad, incluso en aplicaciones complejas.
- Docker Swarm soportaría hasta 2000 nodos, frente a los 5000 de Kubernetes.
- Kubernetes está optimizado para muchos pequeños clusters, mientras Dockers está para un cluster grande.
- Kubernetes es complicado, Docker más sencillo.
- Kubernetes puede permitir compartir espacios de almacenamiento entre cualquier contenedor, mientras Docker está más limitado y solo lo comparte entre contenedores del mismo pod.
- Docker Swarm permite usar software de terceros para registros y monitorización, Kubernetes incluye sus propias herramientas built-in.
- Docker Swarm está limitado a 95.000 contenedores, mientras Kubernetes puede soportar hasta 300.000.
- Mientras Docker tiene una gran comunidad de soporte, Kubernetes tiene también el respaldo de empresas como Microsoft, Amazon, Google, e IBM.
- Docker es usado por empresas como Spotify, Pinterest, eBay, Twitter, etc. Mientras Kubernetes lo prefieren 9GAG, Intuit, Buffer, Evernote, etc.
Ventajas
Una vez vistas algunas divergencias, ahora es el turno de las ventajas de cada uno:
- Kubernetes:
- Fácil organización del servicio con pods.
- Desarrollado por Google, con una dilatada experiencia en la industria de la nube.
- Una enorme comunidad y herramientas de orquestación de contenedores.
- Variedad de opciones de almacenamiento, incluidas SAN locales y nubes públicas.
- Docker:
- Configuración inicial eficiente y sencilla.
- Permite rastrear las versiones de contenedores para examinar variaciones.
- Rapidez.
- Documentación muy buena.
- Buen aislamiento entre apps.
Desventajas
En cuanto a las desventajas:
- Kubernetes:
- Migraciones más complejas.
- Proceso de instalación y configuración complejo.
- Incompatible con herramientas de Docker existentes.
- Implementación de un clúster manual es complicado.
- Docker:
- No proporciona una opción de almacenamiento.
- Mal seguimiento.
- Sin reprogramación automática de nodos inactivos.
- Las acciones se deben realizar en CLI.
- Gestión manual de múltiples instancias.
- Necesita soporte para otras herramientas.
- Implementación manual de clúster complicada.
- Sin soporte para health-checks.
- Docker es una empresa con fines de lucro y algunos de sus componentes críticos, como Docker Engine y Docker Desktop, no son de código abierto.
Docker vs Kubernetes: Conclusión
Como te puedes imaginar, no es tan sencillo elegir entre uno u otro. La batalla Docker vs Kubernetes es más compleja de lo que puede parecer. Y todo dependerá del objetivo que tengas. Uno u otro se adaptará mejor, y esa debería ser tu selección.
En otros muchos casos, usar Kubernetes con Docker será la mejor de todas las opciones. Ambos proyectos funcionan bien juntos. Así se puede mejorar la seguridad de la infraestructura y la alta disponibilidad de aplicaciones. Incluso se puede conseguir que las apps sean más escalables.