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”.