Combining every lesson into a production-ready architecture. This episode covers IP pool planning, choosing between L2 versus BGP mode, router integration, high availability, upgrade strategy, GitOps pipeline, observability, sizing, and an incident runbook.

After 20 episodes of theory, hands-on practice, and troubleshooting, it's time to tie everything together into one whole: a production-ready MetalLB architecture. Episode 21 isn't about a single new feature — it's about design decisions: pool planning, mode selection, router integration, high availability, upgrade strategy, GitOps pipeline, observability, sizing, and an incident runbook.
A good production architecture doesn't emerge from one "correct" configuration. It emerges from decisions made with an understanding of trade-offs — exactly what you've learned throughout this series. This episode is the complete blueprint.
Pool planning is the first step that shouldn't be rushed. Recommendations for production:
Example production configuration:
apiVersion: metallb.io/v1beta2
kind: IPAddressPool
metadata:
name: prod-pool
namespace: metallb-system
spec:
addresses:
- 192.168.20.0/24
avoidBuggyIPs: true192.168.20.0/24 provides more than 200 usable IPs — enough for most initial needs, with avoidBuggyIPs: true avoiding problem addresses.
Choosing the mode is the biggest architectural decision. The guidance:
kubectl get l2advertisement
kubectl get bgpadvertisement
kubectl get bgppeerkubectl get l2advertisement, kubectl get bgpadvertisement, and kubectl get bgppeer show which modes are active. A cluster can run both at the same time — one pool announced over L2, another over BGP.
For BGP mode, router integration is a joint project with the network team. Make sure:
routerID for each node.MetalLB high availability only means anything if the layers beneath it are also HA:
externalTrafficPolicy: Local with pod replicas spread out (episode 9).A safe upgrade strategy for production:
Argo CD or Flux applies configuration automatically from the repository. Recommended practices:
Monitor MetalLB with the stack you built in episode 11:
kubectl get pods -n metallb-system
kubectl top pods -n metallb-systemkubectl top pods -n metallb-system shows CPU and memory usage. This data is the basis for sizing: make sure the resource requests for controller and speaker match the load, especially on clusters with many Services and nodes.
As a starting point: the controller doesn't need many resources — it only processes allocations. The speaker shares the load per node. If metrics show throttling or OOM, raise the resource limits — but measure first, don't guess.
An incident runbook is a document that explains concrete steps when a problem occurs. For MetalLB, the runbook covers:
kubectl get svc -A -o wide
kubectl get events --all-namespaces | grep -i metallbkubectl get events --all-namespaces | grep -i metallb is the opening step almost always written into a runbook — it's fast and often reveals the root cause immediately. Practice this runbook in incident simulations so the team gets familiar with it.
Episode 21 completes the production-ready architecture: pool planning, mode selection, router integration, high availability, upgrade strategy, GitOps pipeline, observability, sizing, and an incident runbook — all assembled into one cohesive architecture.
Key takeaways:
In the next episode — the final one, episode 22 — we'll discuss the alternative ecosystem & final reflection: a comprehensive comparison of MetalLB versus kube-vip, cloud LBs, and NodePort, when to choose each, a recap of the journey from episodes 0 to 21, a production-grade MetalLB checklist, and the future direction of MetalLB in the Kubernetes ecosystem.