DEV Community

Guillermo Garcia
Guillermo Garcia

Posted on • Originally published at ahioros.info on

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:

Image description

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:

    kubectl edit configmap -n kube-system kube-proxy
Enter fullscreen mode Exit fullscreen mode
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true
Enter fullscreen mode Exit fullscreen mode

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):

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Nota: en spec.addresses: en mi caso ese es el rango que tomarán 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
Enter fullscreen mode Exit fullscreen mode

Image description

Prueba

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

    kubectl create deployment nginx-web-server-test --image=nginx
    kubectl expose deployment nginx-web-server-test --port=80 --target-port=80 --type=LoadBalancer
Enter fullscreen mode Exit fullscreen mode

Image description

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

Image description

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.

Top comments (0)