Diagrama explicativo sobre la instalación y configuración de MetalLB en Kubernetes, mostrando el balanceo de carga en un clúster sin proveedor de nube.
Diagrama explicativo sobre la instalación y configuración de MetalLB en Kubernetes, mostrando el balanceo de carga en un clúster sin proveedor de nube.

Instalación y Configuración de MetalLB en Kubernetes

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.

Share on:

Categories

Latest posts

Hopla Software se convierte en Partner Autorizado de F5 NGINX en España.

Estamos emocionados de anunciar que Hopla Software ha alcanzado un hito significativo al convertirse en el primer Partner de consultoría [...]

Ciberseguridad en la nube con un candado digital y los colores corporativos de Hopla.

Muchas empresas han adoptado la nube como su nuevo hogar tecnológico. La flexibilidad, escalabilidad y eficiencia que ofrece son innegables. [...]

Diagrama explicativo sobre la Directiva NIS2 y sus implicaciones en la ciberseguridad empresarial.

¿Qué es NIS2? La Directiva NIS2 (Directiva sobre Seguridad de Redes y Sistemas de Información) es una actualización de la normativa europea [...]