Acerca de Kind
Kind viene de “Kubernetes In Docker” y con este título tenemos claro que hace esta herramienta. Kind permite levantar un clúster de Kubernetes de manera local usando contendores Docker.
Voy a explicar el funcionamiento de Kind “al estilo compadre” de primeras para que se entienda mejor. Kind permite utilizar contenedores Docker como nodos del clúster K8S* para así tener un entorno local multinodo en un sola máquina. En la realidad los nodos de un clúster son máquinas, ya sean físicas o virtuales. Lo bueno de Kind es que nos ahorra el tener que crear estas máquinas y añadirlas manualmente. Además, si quisiéramos hacerlo con máquinas virtuales, el consumo de recursos aumentaría, puesto que estas consumen más que los contenedores.
Otra opción sería crear a mano los contendores y añadirlos al clúster, lo que a mi parecer es una tontería puesto que Kind hace este trabajo por nosotros y, si no tenemos los conocimientos suficientes en Kubernetes, podríamos tener fallos a la hora de agregar dichos nodos.
Resumiendo, teneniendo una máquina con Docker y Kind instalados tenemos un clúster de kubernetes en local con tantos nodos como queramos.
La imagen que usan estos contendores Docker es una propia desarrollada por ellos basada en Ubuntu 20.10, que utiliza como gestor de sistema systemd y que trae todos los componentes de Kubernetes instalados y funcionando. Realmente, cada contenedor a su vez corre los componentes necesarios de Kubernetes en otros contenedores. Algo así como una virtualización anidada.
¿Por qúe usar Kind?
- Es fácil de instalar.
- Es multinodo, es decir, nos permite crear tantos nodos como queramos.
- Es gratis.
Instalación y creación del clúster.
Comenzamos descargando Kind desde su página oficial. Usamos el comando curl junto con el parámetro -L (indica la localización donde se guardará el fichero) y -o (indicamos el nombre con el que guardaremos dicho fichero.)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.12.0/kind-linux-amd64
Le damos permiso de ejecución al fichero que acabamos de descargar.
chmod +x ./kind
Por último moveremos el fichero a una ruta dentro de la variable $PATH para que sea accesible sin necesidad de poner la ruta completa. También podemos agregar una ruta personalizada a esta variable.
mv ./kind /usr/local/bin
He de destacar que yo estoy usando un sistema operativo basado en Red Hat (más concretamente un Rocky Linux) y la ruta anterior no se encuantra en $PATH. La añadiremos nosotros con el siguiente comando.
export PATH=$PATH:/<ruta>
Ahora comprobamos que lo tenemos todo instalando comprobando la versión de Kind instalada con el comando kind version. El resultado tiene que ser algo parecido a esto:
kind version
kind v0.10.0 go1.15.7 linux/amd64
Empezaremos creando el clúster. El siguiente comando nos creará un clúster de un sólo nodo.
kind create cluster
Y obtendremos la siguiente salida.
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.20.2) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
Ahora comprobamos los contendores que tenemos corriendo.
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9905e6c2329a kindest/node:v1.20.2 "/usr/local/bin/entr…" 40 seconds ago Up 29 seconds 127.0.0.1:46579->6443/tcp kind-control-plane
Como vemos tenemos un contendor Docker efectuando la tarea de nodo “control plane” y la de “master”de Kubernetes.
Ya tendríamos el clúster creado. Ahora para administrarlo tendremos que descargar kubectl. En sistemas basados en Red Hat se usa el administrador de paquetes Yum, así que las siguientes líneas sólo son válidas para este tipo de sistemas operativos.
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
sudo yum install -y kubectl
Si estás usando otro tipo de sistema operativo en la documentación de Kubectl tienes paso a paso lo que tienes que hacer.
En Kubectl hay que exportar una clave del clúster a la variable de entorno $KUBECONFIG para que kubectl pueda conectarse al cúster de kubernetes. En nuestro caso Kind lo hace sólo cuando inciamos el clúster.
Para comprobar que efectivamente estamos corriendo un clúster de kubernetes obtendremos el estado de los nodos.
kubectl get nodes
Y tendremos que obtenedor algo parecido a esto.
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane,master 2m49s v1.20.2
Como dijimos antes tenemos un clúster de un sólo nodo. Ahora vamos a borrar el clúster actual y vamos a levantar uno con varios nodos.
Empezamos borrando el clúster actual.
kind delete cluster
Ahora vamos a crear un fichero .yaml donde vamos a indicar cuantos nodos queremos levantar.
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
Un nodo control-plane administra las cargas de trabajo del resto de nodos y en él se ejecutan todos los componentes necesarios como etcd, etc… Este tipo de nodo no corre ningún pod definido por nosotros.
Los nodos worker son aquellos dedicados a ejecutar las aplicaciones definidas por el usuario a través de los pods.
Guardamos el fichero y ejecutamos el siguiente comando.
kind create cluster --config kind-config.yaml
kind-config es el nombre del fichero que cree con la configuración anterior.
Ahora comprobamos los nodos con kubectl ejecutando el mismo comando que antes.
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane,master 3m16s v1.20.2
kind-worker Ready <none> 2m42s v1.20.2
kind-worker2 Ready <none> 2m42s v1.20.2
*K8S: abreviatura para referirnos a Kubernetes. Viene de seleccionar la primera y la última letra de la palabra y poner entre medias el total numérico de letras restantes (ubernete). Su pronunciación sería algo como “keichs”.