Containers

Principales diferencias entre Kubernetes y Docker

Kubernetes vrs Docker actualmente es un tema que se esta mencionado a diario en la industria de la computación en la nube.

Muchos se preguntan si existen diferencias o similitudes entre ellos. Hoy voy a hablar un poco sobre este tema para quienes ya tengan un conocimiento del mismo o también para aquellos que no tenga la formación técnica y busquen un guía al respecto,

¿En algun momento se han preguntando si deben usar Kubernetes o docker? Esta respuesta y muchas mas las encontraras acá, espero lograr aclarar todas las dudas que tengan en sus mentes de una vez por todas.

Kubernetes vrs Docker

El hacerse esta pregunta como administradores de centros de Datos es tan descabellado como comparar manzanas con naranjas. Uno no es alternativa del otro. Todo lo contrario; Kubernetes puede ser ejecutado sin necesidad de Docker así como Docker puede ser utilizado sin la necesidad de Kubertenes. Pero, Kubernetes puede ser integrado para funcionar en conjunto con docker lo que traerá grandes beneficios en nuestra infraestructura.

Docker es un Software independiente el cual puede ser instalado en cualquier servidor o computador para correr aplicaciones en contenedores.

Este mecanismo se enfoca en ejecutar aplicaciones dentro de un sistema operativo donde la aplicación esta aislada del resto de sistema y demás aplicaciones. Podemos hacer creer a la aplicación que esta obteniendo su propia instancia de sistema operativo, aunque pueden existir otros contenedores ejecutándose en el mismo sistema.

Con esto llegamos a la conclusión que Docker es quien nos permite ejecutar, crear y administrar contenedores en una misma instancia de sistema operativo.

Kubertenes, por otra parte, es el orchestrator que podemos utilizar para administrar, actualizar, mejorar y eliminar contenedores que han sido puestos en funcionamiento en un grupo de nodos Docker. Kubernetes puede automatizar el aprovisionamiento de contenedores, redes, balanceo de cargas y seguridad desde una sola interfaz de linea de comandos o panel administrativo para el grupo de Nodos Docker.

Estos nodos bajo la administración de Kubertenes se les conoce como un Cluster Kubernetes.

¿Por qué necesitamos tener múltiples nodos Docker?

La primer ventaja que nos brinda tener un diseño de Cluster Kubernetes es que nuestra infraestructura sea mas robusta y confiable, ya que se garantiza que la aplicación estará un 99% del tiempo en linea, incluso si alguno de los nodos falla; lo que nos proveerá alta disponibilidad.

Ademas, podemos balancear las cargas de las aplicaciones si estas aumentan entre los nodos agregando mas contenedores, hasta la necesidad de poder agregar mas nodos a su cluster Kubertenes para satisfacer la necesidad de carga.

Diferencias entre Docker y Kubernetes

Kubernetes puede trabajar con cualquier tecnología de contenedorización. Dos de las opciones más populares con las que se puede integrar son rkt y Docker. Sin embargo, Docker esta presente en la mayor parte de las implementaciones, lo que ha llevado a un esfuerzo mucho mayor para perfeccionar la integración con Kubernetes más que cualquier otra tecnología de contenedorización.

Del mismo modo, Docker Inc., la compañía detrás de Docker, ofrece su propio motor de orquestación de contenedores, Docker Swarm. Pero incluso la empresa ha entendido el hecho de que Kubernetes ha tenido tanta aceptación en las implementaciones de contenedores que incluso Docker para escritorio (MacOS y Windows) viene con su propia distribución de Kubernetes.

Similitudes entre Docker y Kubernetes

Kubernetes y Docker son soluciones integrales para administrar de manera inteligente las aplicaciones en contenedores y proporcionar capacidades increibles. Acá unas de las ideas que ambas plataformas comparten:

  • Software de código Abierto. Ambos son grandes proyectos “Open Source”
  • Ambos están escritos en gran parte en el lenguaje de programación Go. Lo que les permite ser enviados como pequeños paquetes binarios.
  • Arquitectura basada en Microservicios (Mas sobre esto adelante)
  • Uso de archivos YAML que sean legibles por seres humanos, mucho mas amigables que XML o JSON.

Podemos utilizar y aprender de uno sin necesidad de tener idea del otro. Pero si se conoce de ambos y se implementan en conjunto podemos sacar mucho provecho de las ventajas que ofrecen en un ambiente de un centro de datos basado en contenedores.

¿Que es Docker?

Tradicionalmente, todos los proveedores de servicios en la nube utilizaban máquinas virtuales para aislar las aplicaciones en ejecución unas de otras. Un hipervisor proporciona CPU virtual, memoria y otros recursos para muchos sistemas operativos simultáneamente, cada uno de ellos funciona como si se estuviera ejecutando en un hardware físico real y, idealmente, no tiene conocimiento de que otros sistemas operativos se ejecuten en el mismo servidor físico.

Sin embargo hay varios problemas con la virtualización. En primer lugar, el aprovisionamiento de recursos lleva tiempo. Cada imagen de disco virtual es grande y voluminosa y preparar una VM para su uso puede demorar hasta un minuto. En segundo lugar, y un problema mucho más critico, los recursos del sistema se utilizan de manera ineficiente.

El kernel del sistema operativo es fanático del control absoluto, ya que desea administrar todo los recursos que supone están disponibles para el. Por lo tanto, cuando un sistema operativo de una maquina virtual cree que dispone de 2 GB de memoria, toma el control total de la misma, incluso si las aplicaciones que se ejecutan en ese sistema operativo utilizan solo la mitad.

Cuando ejecutamos aplicaciones en contenedores, virtualizamos el sistema operativo (sus bibliotecas, paquetes, etc.), no el hardware. Por lo que, en lugar de proporcionar hardware virtualizado a una máquina virtual, proporciona un sistema operativo virtualizado a la aplicación. Con esto, puede ejecutar varias aplicaciones e imponer limitaciones en la utilización de sus recursos si lo desea, y cada aplicación se ejecutará sin tener en cuenta los cientos de otros contenedores con los que se está ejecutando. Un enfoque muy similar al de un Hypervisor.

En la siguiente imagen podemos ver la arquitectura del hipervisor tradicional con maquinas virtuales en comparación con un nodo docker ejecutando contenedores:kubernetes vs docker

 

Desafíos para el desarrollo de aplicaciones.

Uno de los problemas con los que los desarrolladores a menudo se enfrentan, es la diferencia entre el servidor de producción, donde se ejecutaran las aplicaciones, y sus propias máquinas de desarrollo (generalmente computadoras portátiles y/o estaciones de trabajo), donde se desarrollan dichas aplicaciones.

Imaginemos un Windows 10 ejecutándose en una laptop de desarrollo, pero se requiere escribir aplicaciones para Ubuntu 18.04. Tal vez esté usando Python v3.6 para escribir su aplicación, mientras que el servidor Ubuntu todavía se está ejecutando en Python v3.4.

Hay demasiadas variables para tener en cuenta, por lo que usamos Docker para abstraer esa complejidad.

Docker se puede instalar en cualquier sistema operativo; incluso Windows y Mac OS X están bien soportados. Por lo tanto, puede compilar el código en un contenedor, ejecutarla y probarla localmente utilizando Docker para garantizar que los contenedores que se crearon a partir de esa imagen de Docker se comportarán de la misma manera en producción.

¿Que es Kubernetes?

Como lo mencione anteriormente Kubernetes es el orquestador de administración para la tecnología de contenedorización que provee Docker. Lo que nos permite ejecutar contenedores a través de múltiples nodos del Cluster Kubernetes. En el sitio oficial se menciona claramente el propósito de Kubernetes:

… un sistema de código abierto para automatizar la implementación, escalado y administración de aplicaciones en contenedores.

Ademas de la función de administración de los nodos Docker; Kubernetes administra los almacenamientos donde se encuentran las aplicaciones, ademas de los registros DNS que son fundamentales en cualquier infraestructura de este tipo. Adicionalmente, Kubernetes debe asegurar que los nodos se comuniquen entre si de manera segura como parte de su arquitectura.

Introducción a la arquitectura de Kubernetes

Existen varios conceptos básicos que se deben conocer antes de entrar a la arquitectura de Kubernetes. El primero es el nodo, el cual es un término común para representar a las máquinas virtuales y / o servidores bare-metal que gestiona Kubernetes.

También tenemos el pod, que es una unidad básica de implementación en Kubernetes. Un pod una colección de contenedores Docker relacionados que se ejecutan en conjunto. Por ejemplo, es posible que un servidor web se deba implementarse con un servidor de almacenamiento en caché redis, por lo que se puedan encapsular ambos en un solo pod. En otras palabras, podemos imaginarnos que un pod que consiste de un solo contenedor, pero donde hay 2 aplicaciones o servicios ejecutándose simultáneamente

Regresando a los nodos, existen dos tipos: el Master Node el cual es corazón donde Kubernetes se encuentra instalado, este nodo controla los pods a través de los Worker Nodes el cual es el segundo tipo de nodo de la arquitectura. Este es donde sencillamente las aplicaciones en contenedores son ejecutadas.

En el Master Node encontramos los siguientes componentes:

  • Kube-API server, controla todas las operaciones de comunicación desde los Nodos Docker o Worker Nodes hasta el Master Node , en consecuencia, todo en la plataforma Kubernetes se trata como un objeto de API.
  • Kubi-Controller Manager, verifica el estado actual de los nodos y sus pods, ademas toma las decisiones para lograr un estado optimo del Cluster Kubernetes. Escucha y colecta la información que requiere desde el Kube-API Server para ejecutar sus funciones.
  • Kubi-Scheduler, programa el balanceo de cargas según la disponibilidad de recursos del cluster y las políticas establecidas por los administradores. Al Igual que Kubi-Controller-Manager, escucha y colecta la información que requiere desde el Kube-API Server para sus funciones.
  • etcd: almacena datos, configuraciones, estado y metadata. En otras palabras, etcd es la base de datos de Kubernetes.

En los Worker Nodes, tenemos los siguientes componentes:

  • kubelet: es un agente que corre en cada nodo del cluster. Verifica que cada contenedor sea ejecutado en un pod, ademas asegura que los contenedores se ejecuten y mantengan en su estado esperado de funcionamiento. Kubelet no controla contenedores que no fueron creados por Kubernetes.
  • kube-proxy: permite que varios microservicios de las aplicaciones se comuniquen con otros que se están ejecutando en los diferentes nodos del Cluster Kubernetes, ademas habilita el acceso a las aplicaciones a los usuarios finales.
  • Container Runtime: la ultima pieza del rompecabezas. Es el software responsable de ejecutar los contenedores. Kubernetes soporta diferentes runtimes, tales como: Docker, containerd, rktlet.

En la siguiente imagen podemos ver el diseño de la arquitectura Kubernetes:kubernetes vs docker

 

¿Que son Addons?

Ademas de las muchas ventajas que nos ofrece el diseño de contenedores Docker, los cuales serían administrados por Kubernetes, también tenemos la opción de extender la funcionalidad de Kubernetes utilizando add-ons. Básicamente son complementos que se pueden instalar en el Master Node con el fin de habilitar funciones que por si solo Kubernetes no ejecuta. Los add-ons mas comunes en la mayoría de escenarios Kubernetes son DNS y Web UI.

La lista completa de los add-ons disponibles acá.

 

Conclusión

La tecnología de Containers continúa avanzando rápidamente, impulsada por el crecimiento de la computación en la nube. En un futuro próximo no seria para nada extraño que los contenedores agreguen un conjunto de funciones más robustas y tal vez un componente de inteligencia artificial (AI).

Escribe tu comentario

Este sitio utiliza Akismet para disminuir el smap. Aprenda más de como sus comentarios son procesados.

Oscar Zuñiga

Oscar Zuñiga

Senior Virtualization Engineer. vExpert 2019 / VCP-DCV / JNCIP-SEC / CCNA R&S
Ingeniero Senior especialista en virtualización de Centros de Datos (SDDC) con 4 años de experiencia en IT. Apasionado por temas relacionados con virtualización y sistemas informáticos. Cuenta con el galardón VMware vExpert; además de certificaciones Cisco, Juniper, Linux y VMware
EnglishPortugueseSpanish