Que es Kind
Según se indica en su web, kind es una herramienta para ejecutar clústers de Kubernetes en local, usando como “nodos”, contenedores Docker. kind se diseñó principalmente para probar Kubernetes, pero se puede usar para desarrollo local o CI.
Instalación
No lo explicaría mejor que en la web, así que como pincelada: Necesitas go y docker
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
Consulta: (https://kind.sigs.k8s.io/docs/user/quick-start/)
Uso
El uso y sus múltiples opciones se detallan en la web, aquí daré las pinceladas del uso rápido que hago yo. Básicamente quiero levantar un cluster lo más rápido posible, tener conexión a el y empezar a probar lo que necesito. Para esto, dispongo de un Makefile que me permite lanzar estas opciones lo más rápido posible,
Configuración
En el directorio de trabajo que uso para lanzar kind tengo lo siguiente:
.
├── kind-config.yaml
├── kubeconfig.yml
└── Makefile
kubeconfig.yml
Se construye en cada ejecución y es el fichero de conexión a nuestro cluster.
kind-config.yaml
Es el fichero que define que cluster queremos, número de nodos etc…
https://kind.sigs.k8s.io/docs/user/quick-start/#configuring-your-kind-cluster
Yo uso por defecto esta conf: (1 Control-Plane y 3 Workers)
# four node (three workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
Makefile
Este fichero define las opciones que podemos lanzar:
all: Opción por defeto, crea el cluster y descarga el kubeconfig
clean: Limpia el cluster que hemos creado.
info: Obtiene info de salud del cluster.
re: Recrea el cluster, lo elimina y lo lanza de nuevo.
all:
kind create cluster --config kind-config.yaml
kind get kubeconfig > kubeconfig.yml
clean:
kind delete cluster
rm -f kubeconfig.yml
info:
kubectl get nodes
kubectl get pods -o wide
kubectl get svc
re: clean all
.PHONY: all clean info re
Ejecución
Aquí las muestras de ejecución y el tiempo empleado en un portatil. (i7, 16gb, ssd)
Creación de cluster
Algo más de 43seg.
malambra@xxx:~/GITHUB/homelab/create_Kind_K8s $ time make
kind create cluster --config kind-config.yaml
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.25.3) 🖼
✓ Preparing nodes 📦 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
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 🙂
kind get kubeconfig > kubeconfig.yml
real 0m43,186s
user 0m5,158s
sys 0m2,251s
Eliminación de cluster
Menos de 2 seg.
malambra@xxx:~/GITHUB/homelab/create_Kind_K8s $ time make clean
kind delete cluster
Deleting cluster "kind" ...
rm -f kubeconfig.yml
real 0m1,367s
user 0m0,099s
sys 0m0,065s
Reconstruir cluster
Dado que el tiempo de eliminación es despreciable, tarda lo mismo que la creación.
Información del cluster
Si se quiere otro tipo de información, basta con editar el Makefile.
malambra@xxxx:~/GITHUB/homelab/create_Kind_K8s $ make info
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane 81s v1.25.3
kind-worker Ready <none> 61s v1.25.3
kind-worker2 Ready <none> 61s v1.25.3
kind-worker3 Ready <none> 61s v1.25.3
kubectl get pods -o wide
No resources found in default namespace.
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 80s
Ejemplos
Al finalizar la creación tenemos un cluster funcional, al que estamos conectados.
malambra@xxx:~/GITHUB/homelab/create_Kind_K8s $ k get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane 2m49s v1.25.3
kind-worker Ready <none> 2m29s v1.25.3
kind-worker2 Ready <none> 2m29s v1.25.3
kind-worker3 Ready <none> 2m29s v1.25.3
malambra@xxx:~/GITHUB/homelab/create_Kind_K8s $ k get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-565d847f94-n2l6d 1/1 Running 0 3m17s
kube-system coredns-565d847f94-qk7xw 1/1 Running 0 3m17s
kube-system etcd-kind-control-plane 1/1 Running 0 3m30s
kube-system kindnet-8r4tf 1/1 Running 0 3m13s
kube-system kindnet-9ddwf 1/1 Running 0 3m13s
kube-system kindnet-n5dzd 1/1 Running 0 3m17s
kube-system kindnet-rnxcm 1/1 Running 0 3m13s
kube-system kube-apiserver-kind-control-plane 1/1 Running 0 3m30s
kube-system kube-controller-manager-kind-control-plane 1/1 Running 0 3m30s
kube-system kube-proxy-7bsgb 1/1 Running 0 3m17s
kube-system kube-proxy-8f8xz 1/1 Running 0 3m13s
kube-system kube-proxy-8jqxt 1/1 Running 0 3m13s
kube-system kube-proxy-ddrmr 1/1 Running 0 3m13s
kube-system kube-scheduler-kind-control-plane 1/1 Running 0 3m30s
local-path-storage local-path-provisioner-684f458cdd-j47vs 1/1 Running 0 3m17s
Conclusión
Ya no hay escusa para no jugar con un cluster, si nos cuesta menos de 1min tenerlo listo¡¡¡