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://www.instagram.com/sergioarmgpl/
Please contribute to this awesome project: