Ir al contenido

K3d & K3s para ambientes Kubernetes locales

22 de junio de 2026 por
K3d & K3s para ambientes Kubernetes locales
Sergio Méndez

Hola, lectores. En esta ocasión, les explicaré cómo configurar un entorno Kubernetes local usando K3s, una distribución ligera. Para ello, utilizaremos K3d para instalar K3s en su máquina local. Si eres desarrollador, te resultará muy útil instalar esta distribución de Kubernetes local y ligera en tu portátil. Este artículo se centrará en: 

  • Ejecutar un entorno Kubernetes local con K3s

Lo que aprenderás

  • Instalar K3d en un ambiente Linux
  • Crear un cluster usando K3s con K3d
  • Installar el Gateway API para un nuevo cluster
  • Crear un Gateway y HttpRoute para exponer un deployment
  • Borrar cluster usando K3d

Estos son los tópicos que aprenderás en este blog post.

Requerimientos

  • Linux corriendo en tu dispositivo (Laptop, PC, etc)

Instalar K3d en un ambiente Linux

Supongamos que estás utilizando un entorno Linux, por ejemplo Ubuntu. Ahora vamos a instalar k3d. Para ello, sigue los siguientes pasos.:

1. Instala K3d, la herramienta que vamos a usar para ejecutar K3s usando contenedores en tu entorno. Para ello, ejecuta el siguiente comando.:

curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

2. Ejecuta el siguiente comando para obtener la versión de K3d instalada.:

k3d version

Crear un cluster usando K3s con K3d

Una vez instalado todo, vamos a crear un clúster con K3d, que utiliza K3s internamente para crear un clúster de Kubernetes mediante contenedores. Para ello, siga los siguientes pasos:

1. Cree un clúster con K3d sin instalar Traefik ni el servicio predeterminado de balanceador de carga en K3s:

k3d cluster create mycluster \
--no-lb --network host \
--k3s-arg '--disable=traefik@server:*' --k3s-arg '--disable=servicelb@server:*'

Esto mostrará una salida como esta:

INFO[0000] [SimpleConfig] Hostnetwork selected - disabling injection of docker host into the cluster, server load balancer and setting the api port to the k3s default
INFO[0000] [ClusterConfig] Hostnetwork selected - disabling injection of docker host into the cluster, server load balancer and setting the api port to the k3s default
INFO[0000] Prep: Network
INFO[0000] Re-using existing network 'host' (....)
INFO[0000] Created image volume k3d-mycluster-images
INFO[0000] Starting new tools node...
INFO[0000] Starting node 'k3d-mycluster-tools'
INFO[0001] Creating node 'k3d-mycluster-server-0'
INFO[0001] Using the k3d-tools node to gather environment information
INFO[0001] Starting cluster 'mycluster'
INFO[0001] Starting servers...
INFO[0001] Starting node 'k3d-mycluster-server-0'
INFO[0008] All agents already running.
INFO[0008] All helpers already running.
INFO[0008] Cluster 'mycluster' created successfully!
INFO[0008] You can now use it like this:
kubectl cluster-info

2. Para ver si el cluster esta funcionando usa los siguientes comandos:

kubectl get pods -A #All the pods should appear with STATUS Running
kubectl get nodes #Show all the nodes STATUS as Ready

3. Instala MetalLB para provisionar un servicio de load balancer para tu cluster :

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.4/config/manifests/metallb-native.yaml

4. Se ha encontrado un rango de direcciones IP para usar con su balanceador de carga. Para ello, puede comprobar sus rutas disponibles con el comando **route**. Aquí tiene un ejemplo:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         sergioarmgpl.ms 0.0.0.0         UG    0      0        0 eth0
10.42.0.0       0.0.0.0         255.255.255.0   U     0      0        0 cni0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.29.192.0    0.0.0.0         255.255.240.0   U     0      0        0 eth0
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

En este caso vamos a usar un clúster que usa la red interna del host que usa la interfaz eth0. También puedes usar una herramienta de IA (como Gemini o Chatgpt) para obtener un rango válido para configurar para tu IPAddressPool en MetalLB, en este caso para la salida

**"172.29.192.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0"**

Puedes solicitar un rango válido de 30 direcciones IP. En este caso obtuvimos el siguiente rango.:

**172.29.206.120-172.29.206.150**

Con ese valor podemos crear un grupo de direcciones IP para MetalLB para tener un rango que asignar a los servicios de balanceador de carga en su clúster.

5. Crea un grupo de direcciones IP con el rango anterior.:

cat <<EOF | kubectl create -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-pool
  namespace: metallb-system
spec:
  addresses:
  - 172.29.206.120-172.29.206.150
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2advertisement
  namespace: metallb-system
spec:
  ipAddressPools:
  - ip-pool
EOF

Instalar el Gateway API para un nuevo cluster

Ahora instalemos la API Gateway, un software común utilizado en la última versión de Kubernetes. Para ello, sigue los siguientes pasos:

1. Instale los CRD de la API de Gateway para NGINX Gateway Fabric, que es uno de los gateways disponibles para exponer aplicaciones que comparten un gateway para sus aplicaciones:

kubectl kustomize "https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard?ref=v2.4.2" | kubectl apply -f -

2. Instala el NGINX Gateway Fabric:

helm install ngf oci://ghcr.io/nginx/charts/nginx-gateway-fabric --create-namespace -n nginx-gateway

Crear un Gateway y HttpRoute para exponer un deployment

Ahora que todo está instalado, vamos a crear una puerta de enlace (Gateway) y una ruta HTTP (HttpRoute) para exponer la implementación del servidor web. Para ello, siga los siguientes pasos:

1. Crea un despliegue que ejecute NGINX llamado myapp, con un servicio que utilice el puerto 80. Los siguientes comandos crean un namespace, un deployment, un service y gateway:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: mynamespace
spec: {}
status: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: myapp
  name: myapp
  namespace: mynamespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: myapp
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: myapp
  name: myapp
  namespace: mynamespace
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: ClusterIP
status:
  loadBalancer: {}
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: mygateway
  namespace: mynamespace
spec:
  gatewayClassName: nginx
  listeners:
  - name: http
    port: 80
    protocol: HTTP
EOF

2. Ahora crea un HTTPRoute usando el IP del Load Balancer IP creado por el service. Para esto corre los siguientes comandos:

export GW=$(kubectl get svc mygateway-nginx -n mynamespace -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: approute
  namespace: mynamespace
spec:
  parentRefs:
  - name: mygateway
  hostnames:
  - "$GW.nip.io"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: myapp
      port: 80
EOF

Note: Los comando previso definel la dirección IP creada por el servicio en la variable GW, y usa el valor para crear un HttpRoute, que usa nip.io un servicio gratuito para crear una URL gratis como  IP Address.nip.io que resuelve a una dirección de IP.

3. Ahora acceda al despliegue de NGINX ejecutando:

curl http://$GW.nip.io 

Para una configuración más avanzada del Gateway API, consulta el siguiente enlace: https://dev.to/sergioarmgpl/goodbye-ingress-hello-gateway-api-migrating-the-right-way-20k9

Delete cluster using K3d

Para borrar el cluster  utiliza el siguiente comando:

k3d cluster delete mycluster

Nota: Para más comandos de K3d, puedes correr k3d en la línea de comandos y te mostrará los parámetros disponibles de esta herramienta.

Conclusion about K3d

K3d es una herramienta útil que te ayuda a crear clústeres de Kubernetes ligeros, rápidos y funcionales usando K3s. Este tutorial cubre los conceptos básicos para crear tu propio clúster. Para personalizarlo aún más, necesitas algunos conocimientos básicos de redes para experimentar un poco, pero con esta información puedes hacer mucho más que lo básico. Además, después de escribir este tutorial, descubrí que Talos Linux tiene una herramienta similar, pero no incluye el servicio de métricas en el clúster por defecto. Tampoco soy muy fan de MiniKube porque funciona más lento que K3s con K3d. Kind también es otra buena alternativa, pero K3s se siente más preparado para producción. Si buscas evitar ensuciar tu entorno con muchas instalaciones, aún puedes tener un sistema limpio usando K3d. Lo recomiendo para entornos de desarrollo rápidos usando Kubernetes sin gastar mucha RAM. Prueba a ejecutar K3s con K3d hoy mismo; lo estoy usando con mis estudiantes en la universidad con muy buenos resultados. Por último, nos vemos en mi próxima publicación del blog.

Follow me

These are my social networks:

https://www.linkedin.com/in/sergioarmgpl

https://sergiops.xyz

https://x.com/sergioarmgpl

https://www.instagram.com/sergioarmgpl/

Please contribute to this awesome project:

Creando containers con containerd & nerdctl en ARM