Hace unos días te conté cómo podías usar kind para crear un clúster para tu desarrollo local, sin tener que hacer grandes instalaciones o depender de proveedores cloud para esta tarea. Hoy quiero hablarte de otra herramienta en esta misma linea que es k3d, el cual es un wrapper de una distribución súper ligera llamada k3s, pensada sobre todo para el mundo IoT, para que esta funcione sobre Docker.
Instalación
Al igual que con kind, lo único que necesitas para trabajar con k3d es una máquina con Docker, además de la herramienta que puedes instalar de la siguiente manera:
curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
Crear un clúster con k3d
El comando que necesitas para crear tu primer clúster es el siguiente:
k3d cluster create mycluster
Como ves, es exactamente igual que kind en este aspecto y, si no especificas ningún parámetro, lo que crea es un clúster de un solo nodo, pero en este caso usa dos contenedores para simular el mismo:

Crear un clúster con más de un nodo
Si quisiéramos crear un clúster con más de un nodo, al comando anterior deberíamos añadirle lo siguiente:
k3d cluster create multi-node --agents 2 --servers 1
En este sentido me parece más sencillo que kind, donde debes generar una configuración a parte. Los agentes son los workers y los servers son los masters. Además, si cuando creaste el clúster este ya tenía más de un nodo, puedes añadir más al mismo con el siguiente comando:
k3d node create newserver --cluster multi-node --role server
Aplicaciones con imágenes remotas
Ahora que ya tienes tu clúster funcionando, si quisieras desplegar la misma aplicación que te mostré en el artículo de kind:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web-nginx
name: web-nginx
spec:
replicas: 3
selector:
matchLabels:
app: web-nginx
template:
metadata:
labels:
app: web-nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-nginx
spec:
selector:
app: web-nginx
type: NodePort
ports:
- port: 80
nodePort: 30080
Necesitarías publicar el puerto de alguno de los nodos de la siguiente manera:
k3d cluster create mycluster -p "30070:30080@agent[0]" --agents 2
Si ahora ejecutas la definición del archivo anterior:
kubectl apply -f nginx.yaml
Podrás acceder al mismo desde local a través de http://localhost:30070, lo que te redirigirá al agente cero, que es el que tiene el puerto 30080 a la escucha.
Otra de las cosas que puedes hacer, al ser un entorno de desarrollo, es publicar un rango de puertos de los que usa NodePort, entre el30000 al 32767, para que tengas cierto margen al publicar tus aplicaciones:
k3d cluster create mycluster -p "30000-30100:30000-30100@agent[0] --agents 2
Aplicaciones con imágenes en local
El otro escenario que también mostré en el otro artículo es qué pasa cuando tenemos imágenes en local que queremos probar dentro del clúster pero que no queremos desplegar en un registro remoto. Como esta:
FROM nginx
COPY index.html /usr/share/nginx/html/
Si genero la misma y la utilizo para desplegarla en mi clúster lo que va a ocurrir es que este no va a saber encontrarla. En este caso, k3d te permite crear un registro local a la par que creas un clúster en el cual puedes publicar tus imágenes desde el host y hacer pull desde tu entorno de manera sencilla.
k3d cluster create mycluster --registry-create
Una vez que esté creado, tanto el clúster como el registro, lo único que debes hacer es ver qué puerto se ha elegido de manera aleatoria para el registro:
docker port $(docker ps -f name=k3d-mycluster-registry -q)
En mi caso el valor que me devuelve es el 55710, por lo que deberé hacer push de la imagen de la siguiente manera:
docker build -t k3d-mycluster-registry:55710/custom-nginx:v1 .
docker push k3d-mycluster-registry:55710/custom-nginx:v1
Importante: Para poder hacer este push tu máquina debe saber resolver el nombre del registro. Para ello, la forma fácil de hacerlo es añadiendo el registro en el archivo hosts:
127.0.0.1 k3d-mycluster-registry
De no hacerlo recibirás un «Service Unavailable».
Ahora, para probar que la imagen funciona, y podemos desplegar nuestra aplicación dentro del clúster, solo debes hacer lo siguiente:
kubectl create deploy custom-web --image k3d-mycluster-registry:55710/custom-nginx:v1 --replicas 3
También es posible crear el registro de forma independiente o incluso usar uno que no genere k3d.
¡Saludos!