lunes, 7 de octubre de 2024

MetalLB tu Load Balancer Bare-Metal


Me han preguntando lo siguiente: ¿Es posible tener un Load Balancer local?

Respuesta: Sí, con MetalLB. FIN...

Como es habitual en este blog comenzamos explicando que es un Load Balancer.

## ¿Que es un Load Balancer?

Un Load Balancer sirve para exponer tu aplicación hacia la red externa, provee un punto de entrada para tu aplicación, y como su nombre lo dice balanceará las peticiones/carga entre los pods de la aplicación.

Acá puedes ver el video de lo que vamos hacer en el post:


Gráfica de un Load Balancer:


**Nota:** Los proveedores de nube te cobran por el tiempo y/o uso (transferencia en GB) de los Load Balancer, así que te recomiendo leer cómo es el costo dependiendo del tipo de Load Balancer que uses en tu proveedor de la nube.




## ¿Qué es MetalLB?

MetalLB es un Load Balancer para tu cluster de Kubernetes bare-metal basado en software, así de simple.

Si alguna vez intentaste aplicar un manifest de alguna aplicación con el servicio LoadBalancer en tu cluster local de kubernetes, notarás que se queda en un estado "pending", esto es por que kubernetes no cuenta con un load balancer por defecto.

## Instalación

Manos a la obra.

### Pre-requisito

Necesitamos configurar a true el valor de strictARP para que MetalLB funcione:

```bash
    kubectl edit configmap -n kube-system kube-proxy
```

    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: "ipvs"
    ipvs:
      strictARP: true

**Nota:** Si estas usando kube-proxy con IPVS mode, te cuento que desde la versión v1.14.2 ya está habilitado strict ARP mode.

### Instalación de MetalLB

Solamente debemos ejecutar un (esta es la última versión cuando se escribió este post):

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

### Configuración del IP Pool (capa 2)

Para configurar el IP Pool, necesitamos contar como su nombre dice con una IP o un rango de IP que puedan ser asignados a nuestros Load Balancer cuando los creemos con nuestros manifest.

Creamos el archivo: metallb-ipadd-pool.yaml

    ---
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: first-pool
      namespace: metallb-system
    spec:
      addresses:
        - 192.168.122.165-192.168.122.175

**Nota:** en spec.addresses: en mi caso ese es el rango que tomaran los Load Balancer.

### Vamos restringir las IPs

Ahora vamos a decirle a MetalLB que solo le permita a los Load Balancer que tengan la IP Pool que configuramos arriba, que es la IP Pool que creamos arriba.

Creamos un archivo llamado: metallb-pool-advertise.yaml

    ---
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: first-pool-advertise
      namespace: metallb-system
    spec:
      ipAddressPools:
        - first-pool


### Prueba

Vamos a crear un deployment de un Nginx y lo vamos a exponer usando un Load Balancer (MetalLB).

```bash
    kubectl create deployment nginx-web-server-test --image=nginx
    kubectl expose deployment nginx-web-server-test --port=80 --target-port=80 --type=LoadBalancer
```


Y si abrimos nuestro navegador y escribimos la IP que dice: EXTERNAL-IP podremos ver nuestro Nginx.


**Nota:** Recuerda agregar la IP y el FQDN en tus DNS de ser necesario.

Espero te sirva este post para tu trabajo, laboratorio, etc. Cualquier duda puedes dejarla en el área de comentarios.

No hay comentarios.: