Ahora que he sacado algo de tiempo es hora de empezar a estudiar Kubernetes, así que vamos con un poco de rollo teórico empezando con la pregunta básica, ¿que es Kubernetes? De forma rápida y simple podemos decir que es un orquestador de contenedores. Siendo más precisos, es un sistema mediante el cual podremos gestionar, desplegar y escalar los contenedores que forman y proporcionan nuestros servicios.
Por tanto, Kubernetes es una capa adicional para nuestra infraestructura de contenedores que nos proporciona multitud de funcionalidades adicionales, como por ejemplo:
- Sencillez para realizar despliegues, gracias a la posibilidad de realizar el despliegue de nuevas versiones a un ritmo fijado por nosotros.
- Control del estado de los contenedores. Kubernetes reiniciará aquellos contenedores que fallen o que no respondan a las comprobaciones que definamos.
- Orquestación del almacenamiento usado por los contenedores, tanto almacenamiento local como proporcionado por proveedores cloud.
Cómo es lógico, al despelgar Kubernetes lo que hacemos es crear un cluster de varios nodos en el cual distinguimos dos roles diferentes:
- Nodos worker. Encargados de ejecutar los contenedores que encapsulan nuestras aplicaciones.
- Nodos master. Encargados del control de los contenedores y nodos worker, así como frontend del cluster de Kubernetes con el que interactuamos para establecer el estado del mismo.
- Nodos master.
- kube-apiserver, expone el API de Kubernetes permitiéndonos interactuar y controlar el estado del cluster.
- etcd, es un almacen de datos distribuido de tipo clave-valor que almacena toda la información y configuración del cluster.
- kube-scheduler, encargado de controlar los contenedores creados y asignarlos a un worker teniendo en cuenta todas las posibles restricciones establecidas.
- kube-controller-manager, encargado de ejecutar controladores que interactuan directamente con el cluster. Estos controladores incluyen el controlador de nodos, de replicaciones, endpoints y cuentas y tokens de servicios. Aunque cada controlador es un proceso separado, todos están compilados en el mismo binario.
- cloud-controller-manager, encargado de ejecutar controladores que interactuan con proveedores de servicios cloud.
- Nodos worker.
- kubelet, agente que se ejecuta en todos los worker y que controla que cada contenedor se encapsula correctamente.
- kube-proxy, es un proxy de red que permite la comunicación con los contenedores desde el interior y exterior del cluster.
- motor de contenedores, el software encargado de la ejecución de contenedores. Kubernetes soporta diferentes motores de contenedores, como Docker.
Cómo ya he indicado, Kubernetes se encarga de que el estado actual de un cluster coincida con el que hemos fijado al configurar las aplicaciones que queremos ejecutar, las imágenes que ejecutaran los contenedores, el número de réplicas de cada uno de ellos, los recursos de red y disco asignados, etc.
Para esto y una vez establecido el estado deseado del cluster, el denominado como Kubernetes Control Plane, a partir de ahora KCP para abreviar, se encargará de realizar todas las tareas necesarias para que el estado actual del cluster coincida con el que hemos establecido.
El KCP está formado por los procesos o componentes que hemos establecido para cada tipo de nodo:
- Los procesos kube-apìserver, kube-controller-manager y kube-scheduler, que se ejecutan en los nodos master del cluster.
- Los procesos kubelet y kube-proxy que se ejecutan en todos los nodos worker del cluster.
Ahora bien, ¿cómo interactuamos con el cluster? o más concretamente ¿cómo establecemos la configuración deseada? Para esto lo normal es que utilicemos el comando kubectl, el cual nos permitirá crear objetos del API de Kubernetes fijando el estado deseado del cluster. Una vez que hayamos establecido el estado deseado del cluster, el KCP realizará todas las tareas necesarias para que el estado real del cluster coincida con el deseado. Todas estas tareas de configurción las realizaremos interactuando directamente con los nodos master, a través del kube-apiserver.
Suficiente teoría por hoy, así que en la siguiente entrada comenzaremos con los objetos del API de Kubernetes.
Suficiente teoría por hoy, así que en la siguiente entrada comenzaremos con los objetos del API de Kubernetes.