Hola y bienvenidos nuevamente a este blog.  Cuando trabajamos con implementaciones de Kubernetes en AWS EKS, Azure AKS o Google GKE, pues de manera nativa podremos crear Services de tipo LoadBalancer, los cuales serán provistos de manera automática gracias a la integración con el Cloud Provider quienes desplegaran el correspondiente Load Balancer en la Cloud y que permitirán exponer la aplicación de Kubernetes para acceso externo de manera rapida y sencilla.   Otras distribuciones como RedHat OpenShift utilizan Routes para proveer acceso a las aplicaciones de la manera sencilla sin el uso de LoadBalancer, y otras como VMware Tanzu pueden utilizar NSX o Kube-VIP para ofrecer un Services de tipo LoadBalancer de manera automatica.

En muchas de las otras distribuciones de Kubernetes no se ofrece de manera nativa una implementación de Load Balancers (Service de tipo LoadBalancer), y más aún cuando intentamos desplegar Kubernetes en un entorno de HomeLab.  En estos casos, si intentamos crear un Service de tipo LoadBalancer, este permanecerá en estado “pending” indefinidamente luego de ser creado.   Para este caso podemos desplegar MetalLB de manera rapida y sencilla para ofrecer una implementación de Load Balancer en practicamente cualquier cluster de Kubernetes.

 

Requerimientos

  • Un cluster de Kubernetes versión 1.13.0 o posterior, que no tenga otro tipo de funcionalidad de Load Balancer.
  • Un cluster con un CNI que pueda coexistir con MetalLB como Antrea, Calico o Flannel.  Más información en https://metallb.universe.tf/installation/network-addons/
  • Un rango de direcciones IPv4 que pueda ser utilizado por MetalLB

 

Instalación

De acuerdo a la documentación oficial, MetalLB puede ser desplegado utilizando Manifiestos, Kustomize o Helm.  En este caso veremos como desplegar via Helm.

En primer lugar añadimos el repositorio Helm e instalamos MetalLB

Copy to Clipboard

 

Configuración inicial

MetalLB permencerá inactivo hasta que sea configurado apropiadamente, principalmente definiendo un IP Pool que pueda ser utilizado por MetalLB para los services de tipo LoadBalancer.   Para esto creamos un fichero YAML como el que vemos a continuación, y luego lo aplicamos en el cluster con kubectl.

Copy to Clipboard

 

Una vez que hemos asignado un IP Pool para que MetalLB pueda utilizarlo, debemos anunciar este IP Pool.  MetalLB tiene configuraciones especificas para BGP asi como también para configuraciones simples en modo Layer 2.  En este ejemplo utilizaremos el modo Layer 2, si desean ver otras configuraciones avanzadas pueden ver el siguiente link: https://metallb.universe.tf/configuration/#announce-the-service-ips

El modo Layer 2 es el más sencillo y en muchos casos no se necesita ninguna configuracion especial más allá de definir el IP Pool.  Del mismo modo, el modo Layer 2 no require que las IPs esten asociadas a las interfaces de red de los nodos workers.

Para anunciar el IP Pool debemos crear un recurso de tipo L2Advertisement como vemos a continuación, asociado con el IP pool creado previamente. Para esto creamos un fichero YAML como el que vemos a continuación, y luego lo aplicamos en el cluster con kubectl.

Copy to Clipboard

 

Uso

Una vez teniendo MetalLB ya instalado y configurado, podemos comenzar a utilizarlo en nuestras aplicaciones.  Para eso podemos crear un Service como el que vemos a continuación de tipo LoadBalancer para una app utilizando WordPress.

Copy to Clipboard

 

 

Una vez creado el servicio, podemos ver que se le ha asignado una dirección IP del IP Pool que hemos definido previamente:

 

Si nos conectamos mediante un navegador, podemos acceder al sitio WordPress publicado a traves del Service y MetalLB

 

Como vemos, es una manera bastante sencilla de poder contar con Services de tipo LoadBalancer en casi cualquier cluster de Kubernetes, sin dependencias adicionales.  Para configuraciones avanzadas pueden recisar la documentación oficial de MetalLB: https://metallb.universe.tf/configuration/