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.

Billboard image

Deploy and scale your apps on AWS and GCP with a world class developer experience

Coherence makes it easy to set up and maintain cloud infrastructure. Harness the extensibility, compliance and cost efficiency of the cloud.

Learn more

Top comments (0)

Billboard image

Try REST API Generation for MS SQL Server.

DreamFactory generates live REST APIs from database schemas with standardized endpoints for tables, views, and procedures in OpenAPI format. We support on-prem deployment with firewall security and include RBAC for secure, granular security controls.

See more!

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay