MetalLB – Stap 3
LoadBalancer-IP's op bare-metal. Nodig zodat een Cilium Gateway later een Service type LoadBalancer kan krijgen met een vast LAN-IP (voor port-forward op de router).
MetalLB kan in twee modi: Layer 2 (L2) met ARP/NDP, of BGP (vereist BGP-router). Wij gebruiken L2: geen routerconfig nodig, werkt op elk LAN. De L2Advertisement in onze config zorgt daarvoor; de IPAddressPool definieert alleen het adresbereik.
NOTE – Lees verder: MetalLB Configuration (L2 vs BGP) in de officiële documentatie.
Stappenplan: 20-stappenplan-gitops.md
1. Check vóór je begint
kubectl get nodes
kubectl get gatewayclass
kubectl get pods -n kube-system -l k8s-app=cilium -o wide
→ Nodes Ready, GatewayClass cilium aanwezig, Cilium op alle nodes.
Netwerk: De pool 192.0.2.220–230 moet buiten de DHCP-range vallen van wat bij jou DHCP doet (switch, router, etc.). Zie 02-network.md. Zo niet: pas de DHCP-range daar aan, of wijzig het bereik in kubernetes/infrastructure/metallb/ip-pool.yaml.
2. MetalLB installeren
Vanaf de <beheer-vm>, in de homelab repo root.
Stap 2a – MetalLB controller + speaker (eenmalig):
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
Wacht tot de pods in metallb-system Running zijn:
kubectl get pods -n metallb-system -w
# Ctrl+C als controller en speakers (alle nodes) Running zijn
Stap 2b – IP-pool en L2-advertentie (onze config):
kubectl apply -f kubernetes/infrastructure/metallb/ip-pool.yaml
De pool homelab-lan gebruikt 192.0.2.220–192.0.2.230. L2 mode: MetalLB antwoordt met ARP op dat bereik vanaf een van de nodes.
NOTE – Lees verder: L2 configuration (interfaces, node selectors) in de officiële MetalLB-docs.
Als je een webhook-timeout krijgt (failed calling webhook ... context deadline exceeded): op "Kubernetes the Hard Way" kan de API-server (op de control plane host) de MetalLB-webhook (ClusterIP) soms niet bereiken. Workaround: webhooks tijdelijk uitzetten, pool toepassen, daarna eventueel webhooks weer aan.
kubectl get validatingwebhookconfiguration -o name | grep metallb | xargs -r kubectl delete
kubectl apply -f kubernetes/infrastructure/metallb/ip-pool.yaml
# Optioneel: webhooks weer aan → opnieuw metallb-native.yaml toepassen
3. Verificatie
LoadBalancer krijgt een IP:
kubectl get svc -A -o wide | grep LoadBalancer
Als er nog geen LoadBalancer-service is: maak een testservice, controleer EXTERNAL-IP en ruim weer op:
kubectl create deployment nginx-lb --image=nginx
kubectl expose deployment nginx-lb --type=LoadBalancer --port=80
kubectl get svc nginx-lb
# EXTERNAL-IP moet 192.0.2.220 of volgende in de pool zijn
kubectl delete deployment nginx-lb
kubectl delete svc nginx-lb
MetalLB-pods:
kubectl get pods -n metallb-system
# controller: 1/1, speaker: 1 per node
4. Volgende stap
Stap 4 – cert-manager (20-stappenplan-gitops.md): TLS-certificaten (Let's Encrypt, DNS-01) voor Gateway/HTTPS.
Referenties / Lees verder
| Onderwerp | Link |
|---|---|
| MetalLB (homepage) | metallb.io |
| Configuration (L2, BGP) | metallb.io/configuration |
| FAQ (o.a. L2, ARP) | metallb.io/faq |
| Homelab netwerk (pool-range) | 02-network.md |