Crear un clúster de Kubernetes para desarrollo con k3d

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:

clúster creado por k3d

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!