Что такое MetalLB в Kubernetes и для чего он нужен?

«Что такое MetalLB в Kubernetes и для чего он нужен?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MetalLB — это CNI-совместимый, программный сетевой балансировщик нагрузки (load balancer) для bare-metal Kubernetes-кластеров. Его основная задача — реализовать функциональность сервиса типа LoadBalancer в средах, где нет облачного провайдера (AWS ELB, GCP Load Balancer), который бы автоматически выделял и настраивал внешний IP-адрес.

Как он работает (два основных режима):

  1. Режим Layer 2 (по умолчанию, самый простой):

    • MetalLB назначает внешний IP из заданного пула сервису типа LoadBalancer.
    • Один из нодов кластера (лидер) "берет на себя" этот IP, отвечая на ARP-запросы (IPv4) или NDP-запросы (IPv6) в локальной сети, как если бы этот IP был его собственным.
    • Плюсы: Простота, не требует поддержки со стороны сетевого оборудования.
    • Минусы: Весь входящий трафик идет через один нод (лидер). Если этот нод падает, другой нод забирает IP, но возникает кратковременный простой (~10 сек для failover). Нет балансировки на уровне входящего трафика между нодами.
  2. Режим BGP (для продвинутых сетей):

    • Каждый нод Kubernetes устанавливает BGP-сессии с физическими маршрутизаторами (ToR) в стойке.
    • Ноды анонсируют маршруты к внешнему IP сервиса через BGP.
    • Внешние маршрутизаторы балансируют трафик между всеми нодами, которые анонсировали маршрут (например, используя ECMP).
    • Плюсы: Нативная отказоустойчивость и балансировка на сетевом уровне, высокая производительность.
    • Минусы: Требует настройки и поддержки BGP на маршрутизаторах.

Практический пример развертывания и конфигурации:

  1. Установка (например, через Helm):

    helm repo add metallb https://metallb.github.io/metallb
    helm install metallb metallb/metallb -n metallb-system --create-namespace
  2. Конфигурация для режима 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
  3. Создание сервиса типа 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.