Kubernetes

 

Estamos seguros de que habéis oído esta palabra en más de una ocasión, sobre todo, en alguna reunión o conversación en la que esté presente algún compañero del departamento de IT. De la misma forma, probablemente, ya os sonarán las palabras “contenedores”, “Docker”, “imágenes” o quizás ya estéis familiarizados e incluso habréis tenido la oportunidad de utilizar aplicaciones “contenerizadas” pero no termináis de entender donde encaja o cual es la figura exacta de esta tecnología que cada vez se hace más y más popular.

Si nos remitimos a lo que reza Wikipedia (ese portal que todos consultamos esperando una respuesta sencilla que nos haga quedar bien en la reunión con IT) podremos leer que: “Es un sistema de orquestación de contenedores open-source” y “se utiliza para automatizar la implementación, el escalado y la administración de aplicaciones informáticas”. Hasta aquí bien, tiene sentido cuando ya has comprendido para que sirven y cómo funcionan los contenedores. La definición en sí, aunque es clara, no parece transmitir el entusiasmo que demuestra el compañero de IT que intenta convencernos de que es la mejor opción para desplegar la plataforma donde correrán las aplicaciones de nuestro proyecto. Nos dice que abarataremos costes y que los recursos que no utilicemos en un entorno los podremos aprovechar en otro de forma rápida y sencilla.

Con esto último, quizás, empezamos a pensar que puede ser un planteamiento que merece la pena valorar. Aquí vamos a intentar explicar, de la forma más sencilla posible, cómo este sistema (que hoy está en boca de todos) nos va a permitir aprovechar al máximo los recursos del sistema y nos proporcionará un conjunto de herramientas que facilitarán la automatización del despliegue, escalado, mantenimiento y alta disponibilidad de nuestra aplicación contenerizada.

 

Empecemos con un poco de historia…

Kubernetes fue desarrollada inicialmente por un equipo de Google y fue anunciada, por primera vez, a mediados de 2014. Su desarrollo y diseño está fuertemente influenciado por el sistema Borg de Google que, de forma resumida, se trata de un proyecto que pretendía crear un sistema para la gestión que clusters programado en C++ y que fue reescrito en GO para implementar Kubernetes.

La primera versión de Kubernetes fue liberada el 21 de julio de 2015 y fue entonces cuando Google se asoció con la “Linux Foundation” para formar la “Cloud Native Computing Foundation” (CNCF) que es la entidad responsable de mantener actualmente la plataforma.

Hoy en día, Kubernetes representa una verdadera comunidad open-source donde participan ingenieros de Google, Red Hat y muchas otras compañías que contribuyen a mejorar el proyecto.

El proyecto es comúnmente citado como uno de los proyectos de mayor velocidad de crecimiento en la historia del código abierto. Considerando Github como barómetro,“Kubernetes ha sido uno de los repositorios más comentados en el portal y está entre los primeros con más reviews a lo largo de los últimos años”.

 

Pero ¿Qué es exactamente Kubernetes?

Para aquellos que estén leyendo esto y aún no tengan muy claro qué son los tan citados “contenedores”, vamos a incluir una breve definición para no dejaros atrás (esto te lo puedes saltar si ya los conoces):

De forma resumida podemos aproximar que, un contenedor es un sistema aislado que utiliza de forma controlada los recursos de un sistema anfitrión (en este caso siempre debe ser Linux). Con esto probablemente estaréis pensando, ¿Pero eso no es lo que hace una máquina virtual?, Y sí, así es, pero con una gran diferencia: Los contenedores aprovechan las capacidades de Linux relacionadas con el control de los recursos del sistema (cgroups y namespaces) que hacen posible generar diferentes “entornos de ejecución” aislados sin necesidad de tener que instalar otro sistema operativo como en el caso de las máquinas virtuales.  A continuación incluimos un par de imágenes extraídas de la página de “Docker” (https://www.docker.com/resources/what-container) que nos ayudarán a clarificarlo:

 

Utilizando contenedores eliminamos la necesidad de disponer de un “Guest Operating System”, aumentando así la capacidad que tiene el host de alojar diferentes aplicaciones y facilitando el arranque y el escalado de las mismas.

Otra ventaja importante que destacar (y con esto termino de hablar de contenedores) es el uso de imágenes.

Una imagen es, básicamente, un conjunto de instrucciones que se van a ejecutar dentro de un contenedor con el objetivo de descargar e instalar todas las herramientas y dependencias que necesita nuestra aplicación para funcionar.

La imagen, por defecto, solo contendrá lo necesario para que la aplicación funcione. Esto supone una ventaja considerable si lo comparamos con la virtualización, ya que el “Guest Operating System” necesita dependencias propias, servicios y requerimientos de espacio mínimo (entre otras..) que consumen recursos del sistema anfitrión.

Ahora bien, teniendo en cuenta lo anterior, parece lógico pensar en la necesidad de disponer de un sistema que se encargue de orquestar, mantener y gestionar la cantidad de contenedores que pueden llegar a alojar los diferentes hosts de nuestra organización. Es aquí donde aparece Kubernetes.

Vamos a utilizar una analogía para intentar completar la explicación. Pensemos en el tupper o recipiente (host) donde llevamos cada día a la oficina nuestra comida. Cada uno de los alimentos representa una “aplicación contenerizada”. Los alimentos tienen diferentes tamaños y es mejor si aislamos la fruta o el postre de la comida. Por supuesto, cada día intentamos llevar un menú distinto y por tanto los alimentos van cambiando de forma y tamaño pero el “host” sigue siendo el mismo.

Kubernetes no solo se encargará de ajustar o redimensionar los compartimentos de nuestro tupper para que quepan nuestros alimentos sino que también se encargará de vigilar el estado de los mismo y asegurarse de que siempre estén frescos y listos para consumir. Ahora que lo pienso, ¿sería una maravilla que existiera un tupper así, no crees?.

 

Ahora nos ponemos un poco más técnicos

 

Si ya tenemos clara cuál es la función de Kubernetes, dentro del universo de contenedores, ahora vamos a hablar sobre los componentes que consiguen realizar el trabajo.

Primero, empezamos por algunos más comunes de cada host:

  • Pods: es la unidad básica de orquestación en Kubernetes. Representa un conjunto de contenedores que de forma garantizada están alojados en el mismo host y pueden compartir recursos. A cada Pod se le asigna una dirección IP única en el cluster, esto permite a las aplicaciones utilizar los puertos sin riesgo de conflictos.
  • Services: un servicio se puede entender como un “endpoint” que hace posible el acceso de los diferentes pods que trabajan en conjunto. A través del servicio se proporciona acceso tanto desde dentro como fuera del cluster. Los contenedores de los pods pertenecientes al mismo servicio pueden comunicarse con otros contenedores siempre que lo hagan a través del servicio, ya que este es quien mantiene el registro de enrutamiento.

 

  • Volumes: el almacenamiento en los contenedores, por defecto, es efímero. En caso de caída o reinicio del contenedor, la información generada no persiste. Para evitar esto, es necesario hacer uso de los volúmenes. Estos proporcionan almacenamiento persistente y hacen posible el acceso compartido entre los contenedores del mismo pod.
  • Kubelet: agente responsable de vigilar la salud de los pods en el host. Se asegura que estén corriendo y funcionando correctamente.
  • Kube-proxy: responsable de implementar parte de los servicios disponibles en el host que controlan y hacen posible el acceso a los pods. Mantiene las reglas de enrutamiento de los nodos.

 

Ahora que ya conocemos los componentes incluidos en cada host, vamos a hablar de quien pilota realmente la plataforma, el “Control Plane”.

Los componentes incluidos en este módulo son los responsables de tomar las decisiones globales del cluster (ej. Planificación) y de detectar y responder a los eventos que se produzcan en el cluster (ej. iniciar replicas cuando un pod no responde). En esta capa se destacan los siguientes componentes:

  • kube-api-server: representa el front-end de la plataforma. Es el componente responsable de exponer la API que da acceso a los diferentes hosts y sus distintos componentes.
  • etcd: aquí es donde se mantiene un backup de todos los datos del cluster. Se trata de un almacén tipo clave-valor en alta disponibilidad.
  • kube-scheduler: este componente se encarga de buscar pods recién creados sin un nodo asignado y selecciona un nodo para que se ejecuten. Es el encargado de decidir donde y cuando se ejecuta un pod en función de los requerimientos teniendo en cuenta los recursos disponibles en el cluster.
  • kube-controller-manager: todos los procesos de control de la plataforma se cofiguran y gestionan en este módulo. Es el responsable de controlar la salud y el estado de los nodos, las réplicas, endpoint, accounts, tokens, etc y de disparar eventos necesarios para corregir posibles problemas.
  • cloud-controller-manager: este componente hace posible establecer la conexión del cluster con la API del proveedor de la nube. Es el encargado de diferenciar los componentes que interaccionan con la nube de aquellos que lo hacen con el cluster local.

 

Resumiendo, la plataforma dispone de un módulo de control que se encarga de orquestarla de forma automática atendiendo a diferentes factores relacionados con los ajustes seleccionados por el usuario y con el status del cluster. Por otro lado, pone a disposición un conjunto de herramientas en cada host que se ocupan de gestionar los contenedores de forma local. Ambos módulos o capas, son fácilmente escalables y proporcionan mecanismos que aseguran la alta disponibilidad.

 

Conclusión

Kubernetes, aunque no es la única opción para la gestión de contenedores, está considerada como la plataforma de automatización y orquestación más popular. Cuenta con una comunidad muy activa que mantiene la plataforma en constante evolución.

Brinda la posibilidad de ejecutar nuestras aplicaciones en entornos híbridos modernos aprovechando la extensa experiencia de Google corriendo software a escala.

Hace posible implementar de forma confiable una infraestructura productiva basada en contenedores y hacerlo de una manera que automatice muchas tareas operativas.

En otras palabras: Kubernetes es una herramienta que ayuda a IT a convertir el potencial de los contenedores en una realidad operativa.