MetalLB es una solución de balanceo de carga para clústeres de Kubernetes en entornos on-premises o en infraestructuras sin un proveedor de nube. Es especialmente útil para servicios que requieren direcciones IP estáticas y soporte para protocolos UDP, donde un Ingress Controller no sería adecuado para exponer nuestras aplicaciones.
En este tutorial, te enseñaremos cómo instalar y configurar MetalLB en un clúster de Kubernetes utilizando Helm, y desplegar una aplicación web para exponerla a través de un rango local de IPs.
Requisitos previos
Antes de comenzar, asegúrate de cumplir con los siguientes requisitos:
- Un clúster de Kubernetes en funcionamiento (versión mínima 1.13).
- Tener instalado Helm.
- Acceso de administrador en el namespace en el que vamos a instalar MetalLB y la aplicación web.
- Un rango de direcciones IP disponibles para asignar a los servicios tipo LoadBalancer.
Instalación Metallb
Paso 1: Instalación con helm
Helm es una herramienta de gestión de paquetes para Kubernetes que facilita la instalación y configuración de aplicaciones en el clúster.
Al usar Helm, podemos automatizar el proceso de despliegue de MetalLB, asegurándonos de que todos los componentes necesarios estén correctamente configurados y listos para funcionar en tu entorno Kubernetes.
Para agregar el repositorio y realizar la instalación en el namespace recomendado por el fabricante, ejecutamos los siguientes comandos:
$ helm repo add metallb https://metallb.github.io/metallb $ kubectl create ns metallb-system $ helm install metallb metallb/metallb -n metallb-system |
Paso 2: Configuración del tipo de LoadBalancer y rango de IPs
MetalLB requiere una configuración previa para asignar los pools de direcciones IP, así como para definir las subredes o interfaces en las que se van a exponer los servicios de tipo LoadBalancer.
1. Crear un pool de direcciones IPs
Para que se pueda asignar una IP a los servicios de tipo LB se debe definir unos rangos de direcciones dentro de una de las subredes del clúster. Vamos a editar un archivo YAML llamado metallb-config.yaml con la siguiente configuración:
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: – 192.168.18.100-192.168.18.110 #Rango de IPs de nuestra subred |
En este caso, se ha especificado un rango acotado de IPs para evitar conflictos con otros dispositivos de la LAN.
Aplicamos la configuración con el siguiente comando:
$ kubectl apply -f metallb-config.yaml |
2. Configurar un L2Advertisement
MetalLB necesita un L2Advertisement para anunciar las pools de IPs en la red local. Crea un archivo llamado l2-advertisement.yaml con la siguiente configuración:
apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2-advertisement namespace: metallb-system |
Guárdalo en un archivo l2-advertisement.yaml y aplícalo:
$ kubectl apply -f l2-advertisement.yaml |
Paso 3: Crear un Servicio LoadBalancer
En nuestro caso, tenemos una aplicación web ya configurada y en funcionamiento que deseamos exponer a través de MetalLB. Para verificar el estado de la aplicación en el clúster de Kubernetes, ejecutamos el siguiente comando:
$ kubectl get pod -n hopla-web NAME READY STATUS RESTARTS AGE app-01 1/1 Running 0 39m |
Ahora vamos a crear un servicio de tipo LoadBalancer con un selector que apunte al pod de la aplicación que deseamos exponer.
Crea un archivo nginx-service.yaml con la siguiente configuración:
apiVersion: v1 kind: Service metadata: name: app-01-service namespace: hopla-web spec: selector: app: app-01 ports: – protocol: TCP port: 80 targetPort: 80 type: LoadBalancer |
Aplicamos el servicio:
$ kubectl apply -f nginx-service.yaml |
Ahora, si listamos los servicios, deberíamos ver que MetalLB ha asignado una dirección IP dentro del rango definido:
$ kubectl get svc -n hopla-web NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE app-01-service LoadBalancer 10.43.94.153 192.168.18.100 80:30095/TCP 34m |
El servicio app-01-service de tipo LoadBalancer cuenta con una CLUSTER-IP (10.43.94.153) para la comunicación interna dentro del clúster y una EXTERNAL-IP (192.168.18.100) para exponerlo externamente a través del balanceador de carga.
Paso 4: Comprobar el funcionamiento del servicio
Vamos a realizar un curl desde la red local para verificar si la aplicación es accesible:
$ curl http://192.168.18.100:80 <!DOCTYPE html> <html lang=”es”> <head> <meta charset=”UTF-8″> <meta name=”viewport” content=”width=device-width, initial-scale=1.0″> <title>Bienvenido a Hopla!</title> </head> <body> <h1>Hola desde Hopla! Software</h1> </body> </html> |
Conclusión
Con MetalLB instalado y configurado en tu clúster de Kubernetes, ahora puedes exponer aplicaciones con direcciones IP estáticas a través de un servicio tipo LoadBalancer, incluso en entornos on-premises. Esto facilita la gestión del tráfico externo y asegura la alta disponibilidad de tus servicios.