Ответ
MetalLB — это CNI-совместимый, программный сетевой балансировщик нагрузки (load balancer) для bare-metal Kubernetes-кластеров. Его основная задача — реализовать функциональность сервиса типа LoadBalancer в средах, где нет облачного провайдера (AWS ELB, GCP Load Balancer), который бы автоматически выделял и настраивал внешний IP-адрес.
Как он работает (два основных режима):
-
Режим Layer 2 (по умолчанию, самый простой):
- MetalLB назначает внешний IP из заданного пула сервису типа
LoadBalancer. - Один из нодов кластера (лидер) "берет на себя" этот IP, отвечая на ARP-запросы (IPv4) или NDP-запросы (IPv6) в локальной сети, как если бы этот IP был его собственным.
- Плюсы: Простота, не требует поддержки со стороны сетевого оборудования.
- Минусы: Весь входящий трафик идет через один нод (лидер). Если этот нод падает, другой нод забирает IP, но возникает кратковременный простой (~10 сек для failover). Нет балансировки на уровне входящего трафика между нодами.
- MetalLB назначает внешний IP из заданного пула сервису типа
-
Режим BGP (для продвинутых сетей):
- Каждый нод Kubernetes устанавливает BGP-сессии с физическими маршрутизаторами (ToR) в стойке.
- Ноды анонсируют маршруты к внешнему IP сервиса через BGP.
- Внешние маршрутизаторы балансируют трафик между всеми нодами, которые анонсировали маршрут (например, используя ECMP).
- Плюсы: Нативная отказоустойчивость и балансировка на сетевом уровне, высокая производительность.
- Минусы: Требует настройки и поддержки BGP на маршрутизаторах.
Практический пример развертывания и конфигурации:
-
Установка (например, через Helm):
helm repo add metallb https://metallb.github.io/metallb helm install metallb metallb/metallb -n metallb-system --create-namespace -
Конфигурация для режима Layer 2 (через ConfigMap):
apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: production-pool namespace: metallb-system spec: addresses: - 192.168.1.100-192.168.1.110 # Диапазон IP, выделенных для сервисов LoadBalancer --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2-advert namespace: metallb-system spec: ipAddressPools: - production-pool -
Создание сервиса типа LoadBalancer:
apiVersion: v1 kind: Service metadata: name: my-webapp spec: selector: app: my-webapp ports: - port: 80 targetPort: 8080 type: LoadBalancer # MetalLB автоматически назначит IP из пулаПосле применения MetalLB назначит IP из пула (например,
192.168.1.100), и сервис будет доступен по этому адресу извне кластера.
Типичные сценарии использования в bare-metal:
- Предоставление доступа к веб-приложениям: Вместо ручного создания записей в Ingress-контроллере и настройки портов на нодах (NodePort).
- API-шлюзы и микросервисы: Прямой внешний доступ к критичным внутренним API.
- Сервисы баз данных с внешними клиентами: Например, для доступа к Redis или PostgreSQL извне кластера (с осторожностью!).
- Разработка и тестирование: Эмуляция облачного окружения на локальных кластерах (minikube, k3s, kind).
Интеграция с другими компонентами: MetalLB отлично работает вместе с Ingress-контроллерами (Nginx, Traefik). Частая схема: MetalLB выдает внешний IP для Ingress-контроллера, а тот, в свою очередь, маршрутизирует трафик на внутренние сервисы по Host/Path.