Nota: Este post ha sido importado de mi blog de geeks.ms. Es posible que algo no se vea del todo "correctamente". En cualquier caso puedes acceder a la versión original aquí
Bueno, con este post empiezo una serie de posts sobre Kubernetes. Tengo varios posts en borrador, pero creo que antes de publicarlos puede estar bien una pequeña introducción a Kubernetes: qué es. Y de esto va este post.
¿Qué es Kubernetes?
A grandes rasgos: un orquestador de contenedores. Es decir un sistema cuya misión es ejecutar un conjunto de contenedores en una o más máquinas, ofreciendo herramientas para la gestión y el escalado de dichos contenedores.
Nunca he instalado un Kubernetes on-premise y espero no tener que hacerlo nunca. Digo esto porque hablamos de “Kubernetes” como un todo, pero Kubernetes es más bien “un conjunto de herramientas” integradas entre ellas. No sé como es “instalar un clúster de Kubernetes” pero no debe ser nada sencillo. Por suerte los tres grandes proveedores de cloud ofrecen Kubernetes como servicio manejado: Azure ofrece AKS, Google ofrece GKE y Amazon tiene EKS. Todos ellos servicios que permiten crear de forma más o menos rápida y sencilla un clúster Kubernetes.
Si quieres probar en local también hay una solución: MiniKube. Con MiniKube puedes ejecutar tu propio Kubernetes (de un solo nodo) en una MV (VirtualBox o HyperV). MiniKube se encarga de todo, de descargar la imagen, montar la máquina y hasta configurar kubectl (la herramienta CLI para gestionar Kubernetes).
Por lo general en un clúster de Kubernetes hay dos tipos de máquinas:
- master: Su objetivo es tomar decisiones que afectan al conjunto del clúster (p. ej. escalado de contenedores). No suelen ejecutar contenedores (aunque no está prohibido que lo hagan). Un clúster de Kubernetes contiene al menos un nodo master, aunque pueden haber varios.
- node: Ejecutan contenedores (como se ha dicho antes, técnicamente un master es también un node, salvo que muchas veces se configura para no ejecutar contenedor alguno).
Esto es desde el punto de máquinas. Veamos ahora los componentes de software más importantes (no están listados todos) que cada tipo de máquina ejecuta. Así, pues, instalar un clúster de Kubernetes es instalar cada uno de esos sistemas y configurarlos:
- etcd: Se usa etcd en los nodos master para guardar los datos referentes a todo el clúster.
- kube-apiserver: Kubernetes ofrece una API REST para operar con el clúster. Este componente que se ejecuta en los nodos _master _es el que sirve dicha API.
- kube-controller-manager: Es un daemon que se ejecuta en los nodos master y que se encarga de gestionar “los controladores”. Un controlador en Kubernetes es un proceso en segundo plano que ejecuta determinadas tareas ordinarias para el funcionamiento del clúster,
- cloud-controller-manager: Es otro daemon que se ejecuta en los nodos master y que se encarga de gestionar “los controladores de cloud”. Esos controladores tienen dependencias con proveedores de cloud y estan separados de los normales para permitir evoluciones separadas. La idea es que cada proveedor de cloud (que quiera soportar Kubernetes) termine evolucionando dichos controladores.
- kubelet: Se ejecuta en los nodos node y tiene una sola función: dada una lista de contenedores a ejecutar en una máquina, garantizar que estos se estan ejecutando.
- kube-proxy: Se ejecuta en los nodos node y es un proxy sencillo que puede hacer forwarding a nivel de TCP/UDP.
- docker: Obviamente se ejecuta en los nodos node y es el encargado, real, de ejecutar los contenedores. Otro motor soportado por Kubernetes como alternativa a Docker, es rkt.
- supervisord: kubelet se encarga de asegurarse que los contenedores se ejecutan. Pero, ¿quien se encarga de verificar que kubelet y docker están ejecutándose? Pues este pequeño proceso que corre en todos los nodos node.
- fluentd: Se ejecuta en los nodos node y ofrece servicios de log a nivel de clúster.
Como digo, aunque no estan todos (faltan algunos que se ejecutan en los nodos master), los principales serían esos. Se puede ver que hay una mezcla de componentes propios con componentes open source externos. Hay que tener presente esto cuando hablemos de Kubernetes: Nos referimos a él como “un solo producto” pero realmente es más que eso.
Como crear un Kubernetes en local
Vamos a ver ahora como crear un clúster de Kubernetes en local. Como digo, ni idea de como se instala on-premise, así que para instalar nuestro primer cluster usaremos MiniKube 🙂
Lo primero es instalar MiniKube y kubectl en nuestra máquina (ambos son binarios que basta con descargar y poner en una carpeta que esté en el PATH). Una vez hecho deberías abrir una línea de comandos como administrador y teclear:
minikube start --kubernetes-version v1.8.0 --vm-driver hyperv --hyperv-virtual-switch [adaptador-red]
En este caso MiniKube levantará un Kubernetes (1.8.0) usando hyperv. Si no usas la opción (–vm-driver) se usa VirtualBox: el propio MiniKube se encargará de descargar la ISO, crear la máquina virtual y ponerla en marcha.
**Nota: **Si usas hyperv, en el parámetro –hyperv-virtual-switch debes indicar un adaptador de red que tenga conectividad desde el host (en otro caso fallará al intentar conectarse con la MV usando ssh).
Cuando MiniKube haya terminado tendrás un Kubernetes en local y la herramienta kubectl configurada. Puedes comprobarlo haciendo:
kubectl config get-contexts
Y te debería salir un listado parecido al siguiente:
CURRENT NAME CLUSTER AUTHINFO * minikube minikube minikube
(Si tuvieras más clústers aparecerían ahí. El asterisco indica el clúster contra el que kubectl actúa).
¡Fantástico! Ya tienes tu Kubernetes corriendo en local. Kubernetes tiene un panel de control (opcional, pero si usas v1.8.0 en MiniKube viene instalado) al que puedes acceder tecleando kubectl proxy
y luego yendo a http://localhost:8001/ui
. Esto te debería ver el panel de control de Kubernetes:
El siguiente punto será empezar a desplegar contenedores en él, y lo veremos en el siguiente post de esta serie 🙂