Con el auge actual de los contenedores es posible que te hayas empezado a plantear el poner tu aplicación en contenedores. O es posible que ya lo estés haciendo. Sea cual sea tu caso, es probable que estés usando (o considerando el uso) de Kubernetes. En este artículo vamos a ver qué es Kubernetes y cómo funciona. No es el objetivo de este post el que veas "cómo desarrollar para Kubernetes" sino que entiendas qué componentes forman parte de Kubernetes y cuál es el rol de cada uno de ellos.
¿Qué hace Kubernetes?
Esa es la primera pregunta que debemos responder: para entender cómo funciona, es importante que veamos qué rol juega Kubernetes. Como seguramente sabrás se lo cataloga como un "orquestador de contenedores", lo que lo sitúa en la misma lista de productos como Swarm, Marathon o ECS.
Aquí te dejamos una lista con los 10 mejores orquestadores de Docker
Un orquestador es el encargado de gestionar el ciclo de vida de los contenedores de una aplicación (cierto es que el concepto de "orquestador" en general es mucho más amplio, pero en este artículo nos centraremos solo en los orquestadores de contenedores). Por lo tanto, los servicios que suele ofrecer un orquestador son los siguientes:
- Manejo del clúster (permitir añadir o quitar nodos al clúster)
- Gestión del ciclo de vida de los contenedores (p. ej. reiniciar contenedores que fallen)
- Service Discovery (que un contenedor pueda encontrar las rutas IP/DNS de otro contenedor)
- Servicios de red y load-balancing (repartir la carga entre las distintas máquinas del clúster)
- Servicios de monitorización
- Servicios de chequeo de estado de salud (del clúster y de cada uno de los contenedores)
Kubernetes ofrece todos esos servicios (y algunos más como auto-escalado o gestión del estado) y se ha convertido en el estándar de facto para el despliegue de aplicaciones basadas en contenedores.
La arquitectura de Kubernetes
Debes ver a Kubernetes más como un "proyecto" que como un "producto": en efecto, Kubernetes se apoya en muchos otros productos ya previamente existentes (como etcd) y los combina con otros desarrollos propios. Instalar y configurar un clúster de Kubernetes on-premises no es algo sencillo y es precisamente por eso que los servicios de Kubernetes "manejados" son tan populares. Estos servicios permiten disponer de un clúster Kubernetes correctamente instalado y levantado en cuestión minutos.
Los servicios "manejados" son los proporcionados por un proveedor de cloud y gestionados por éste, como por ejemplo AKS, EKS o GKE.
Un clúster de Kubernetes se compone de varias máquinas. Cada una de esas máquinas (nodos) debe jugar uno de los siguientes roles:
No hay más: una máquina o es un nodo master o es un nodo minion. A pesar de que Kubernetes puede funcionar con un solo nodo, un clúster de Kubernetes productivo debería tener un mínimo de 5 máquinas (tres nodos master y dos minion).
Nodos master
Los nodos master son los encargados de coordinar el clúster. Por lo general los nodos master no ejecutan contenedores. Aunque está permitido que lo hagan, no es un escenario recomendado en producción. Todo clúster de Kubernetes debe tener al menos un nodo master.
Los nodos master son los encargados de decidir en qué nodo (minion) se ejecuta cada contenedor, de mantener el estado del clúster, de asegurar que en todo momento hay el número deseado de contenedores en ejecución y de actualizar las aplicaciones de forma coordinada cuando se despliegan nuevas versiones.
Un nodo master ejecuta los siguientes procesos:
- etcd: Etcd es una base de datos de tipo (clave, valor) que se utiliza para mantener la configuración global del clúster. La información contenida en etcd es crítica y debe tenerse siempre un plan de copias de seguridad.
- kube-apiserver: los nodos master exponen una API que es usada para los nodos minion y los clientes del clúster para comunicarse.
- kube-scheduler: es el componente de Kubernetes encargado de decidir en qué nodo se ejecuta un determinado contenedor.
- kube-controller-manager: es el encargado de ejecutar los distintos controladores. Un "controlador" es el encargado de asegurar que en todo momento se cumple el estado deseado de la aplicación y del clúster (p. ej. que en todo momento haya 5 instancias de un contenedor determinado).
Un nodo master no ejecuta contenedores, así que no necesita tener instalado Docker y ninguno del resto de elementos necesarios para un nodo minion que enseguida veremos.
¿Por qué un clúster productivo debe tener un mínimo de 3 nodos máster?
Esto es debido a etcd. Recuerda que etcd se usa para guardar el estado global del clúster y su información es crítica. Si tienes tres nodos de etcd y pierdes uno, el sistema puede seguir funcionando, ya que los dos nodos restantes pueden seguir verificándose el uno al otro. Pero ya no puedes perder ningún otro. Por eso, los nodos de etcd se escalan siempre de dos en dos: si tienes tres te puedes permitir perder uno, si tienes cinco puedes perder dos y así sucesivamente. Por supuesto se asume que estas pérdidas son temporales (es decir un nodo se cae y el clúster sigue funcionando mientras añadimos otro nodo).
Precisamente como Kubernetes se compone de varios productos, es complicado crear un clúster de alta disponibilidad: en el párrafo anterior se mencionaba etcd, pero la disponibilidad del resto de componentes debe tenerse en cuenta también. De hecho hay instalaciones de Kubernetes en las que etcd corre en nodos separados: es decir tenemos un mínimo de tres nodos master (sin etcd), tres nodos más con etcd y dos nodos minion.
En definitiva: gestionar un clúster de Kubernetes con alta disponibilidad no es nada sencillo.
Nodos minion
Un nodo minion es aquel que ejecuta los contenedores desplegados en el clúster. Se compone de tres elementos básicos:
- Motor de contenedores: obviamente el motor de contenedores debe estar instalado en el clúster. Mucha gente presupone que Kubernetes solo puede ejecutar contenedores Docker pero eso no es estríctamente cierto. De serie, Kubernetes puede ejecutar Docker y rkt siendo posible integrarlo con otros motores existentes a través de CRI.
- kube-proxy: encargado de gestionar la red virtual y las IPs virtuales asignadas a cada contenedor.
- kubelet: el componente más importante de un nodo minion, cuya función principal es asegurarse de que todos los contenedores que deben ejecutarse en este nodo se están ejecutando. Es decir, cuando a kubelet se le ordena poner en marcha un contenedor, lo pone en marcha y luego monitoriza que siga en marcha (reiniciándolo si el contenedor termina debido a una excepción no controlada) hasta que le llega la orden de parar el contenedor.
Otros elementos de Kubernetes
Al margen de los elementos anteriores hay un conjunto de addons que se ejecutan en el clúster. Estos addons son como contenedores (pods en la terminología de Kubernetes) y son opcionales: pueden estar presentes o no. Suelen ejecutarse en el espacio de nombres kube-system
y ofrecen servicios transversales. Los más conocidos son:
- Web Dashboard: ofrece una interfaz web gráfica para monitorizar y gestionar el clúster:
- Monitorización de clúster, basado en cAdvisor y que kubelet expone para ser consultado.
- Sistemas de logging centralizado.
- DNS interno: este addon es especial porque, a pesar de ser opcional por definición, se puede considerar como si fuese obligatorio ya que casi siempre se asume que tenemos un sistema de DNS dentro del clúster. La mayoría de clústeres usan kube-dns para ello.
Estos son los addons principales, pero hay muchos más.