En entornos Bare-Metal o virtualizados con Proxmox, Kubernetes no incluye de forma nativa un balanceador de carga de red. Sin este componente, al crear un servicio de tipo LoadBalancer, el estado de la IP externa permanecerá en <pending> indefinidamente.
MetalLB soluciona esta limitación proporcionando una implementación de red que asigna direcciones IP reales de nuestra red local a los servicios del clúster mediante el protocolo ARP (Capa 2).
Para garantizar el correcto funcionamiento del balanceo en Capa 2, es necesario configurar el componente kube-proxy para que active el modo strictARP.
1. Editar el ConfigMap de kube-proxy:
kubectl edit configmap -n kube-system kube-proxy
2. Modificar el parámetro:
Localiza el campo strictARP dentro del bloque ipvs y cámbialo a true:
ipvs:
strictARP: true
3. Guardar y salir: (Pulsa Esc y escribe :wq).
Siguiendo la arquitectura de despliegue remoto de este proyecto, instalamos los componentes necesarios directamente desde el repositorio:
kubectl apply -f https://raw.githubusercontent.com/jobopaK/ProyectoIntegradoASIR/main/kubernetes/manifests/metallb/metallb-native.yaml
[!NOTE] Este comando despliega el controlador y los speakers necesarios en el namespace
metallb-system.
Antes de configurar el rango de IPs, confirmamos que el controlador principal y los speakers (uno por cada nodo del clúster) están funcionando correctamente.
kubectl get pods -n metallb-system

Como se observa en la captura, disponemos del controlador y de tres speakers en estado Running, lo que confirma que el despliegue a través de los nodos ha sido un éxito.
Definimos el segmento de red local que MetalLB gestionará para asignar a los servicios externos. Para este proyecto se ha reservado el rango: 192.168.1.200 - 192.168.1.250.
Aplicamos la configuración del pool de direcciones y el anuncio L2:
kubectl apply -f https://raw.githubusercontent.com/jobopaK/ProyectoIntegradoASIR/main/kubernetes/manifests/metallb/metallb-config.yaml
Para validar que la infraestructura asigna IPs externas correctamente, se realiza un despliegue de prueba:
1. Desplegar servidor web de prueba:
kubectl create deployment web-prueba --image=nginx
kubectl expose deployment web-prueba --port=80 --type=LoadBalancer
2. Comprobar la asignación de IP:
kubectl get svc web-prueba
Como se aprecia en la captura de pantalla de la terminal, MetalLB asigna automáticamente la IP 192.168.1.200 al servicio, permitiendo el acceso desde la red física:

[!IMPORTANT] El servicio es ahora accesible desde cualquier host de la red local sin necesidad de configuraciones adicionales de enrutamiento.
Una vez verificado el sistema, eliminamos el servicio de prueba para liberar los recursos del pool:
kubectl delete service web-prueba
kubectl delete deployment web-prueba
[!CAUTION] Es fundamental eliminar los servicios de prueba para que MetalLB libere la IP asignada (
192.168.1.200) y la devuelva al pool de direcciones disponibles, dejándola libre para el Ingress Controller que instalaremos a continuación.
Siguiente Paso: Fase 5: Instalación de Ingress Controller (Nginx)
Proyecto Integrado de Grado Superior ASIR
© 2026 - jobopaK