Она реализует сервисы типа LoadBalancer без облачных провайдеров, назначая внешние IP-адреса и управляя трафиком на уровне L2 (ARP/NDP) или L3 (BGP).
⚫️ Зачем это нужно?
— Bare-metal кластеры
Предоставляет функционал LoadBalancer в локальных дата-центрах или на оборудовании без поддержки облачных провайдеров
— Простота использования
Автоматически назначает внешние IP-адреса из указанного пула
— Два режима работы
Поддержка L2 (для простых сетей) и L3 (для интеграции с корпоративной инфраструктурой)
— Прозрачная интеграция
Работает как стандартный Kubernetes-контроллер, не требуя изменений в приложениях
⚫️ Как работает?
Режим L2 (Уровень 2 — канальный):
— Назначает виртуальный IP (VIP) сервису типа LoadBalancer
— Отвечает на ARP-запросы (IPv4) или NDP-запросы (IPv6) для этого IP
— Трафик направляется на одну из нод кластера, которая затем распределяет его между подами
— Автоматический аварийное переключение при выходе ноды из строя
Режим L3 (Уровень 3 — сетевой):
— Устанавливает BGP-сессии с маршрутизаторами сети
— Анонсирует маршруты к виртуальным IP-адресам
— Трафик направляется напрямую на ноды с подами сервиса
— Поддерживает балансировку через ECMP (Equal-Cost Multi-Path)
⚫️ Конфигурация для режима L2:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default-pool
namespace: metallb-system
spec:
addresses:
- 87.30.40.30-87.30.40.130
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default-pool
⚫️ Конфигурация для режима L3 (BGP):
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: production-pool
namespace: metallb-system
spec:
addresses:
- 97.54.23.100/32
- 97.54.23.101/32
---
apiVersion: metallb.io/v1beta1
kind: BGPPeer
metadata:
name: router1
namespace: metallb-system
spec:
myASN: 64500
peerASN: 64501
peerAddress: 97.54.23.1
peerPort: 179
---
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
name: production
namespace: metallb-system
spec:
ipAddressPools:
- production-pool
⚫️ Пример использования
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
После применения MetalLB автоматически назначит IP из пула:
kubectl get svc nginx-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
# 87.30.40.30
🤓 MetalLB закрывает критический пробел в bare-metal Kubernetes, предоставляя полноценную поддержку LoadBalancer-сервисов.
Он превращает локальный кластер в производственную платформу, сопоставимую по возможностям с облачными предложениями, сохраняя при этом контроль над инфраструктурой.
#заметкиИнженера
