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