Модуль реализует улучшенный (относительно стандартного режима L2 в MetalLB) механизм балансировки для сервисов в кластерах bare metal, где нет возможности воспользоваться облачным балансировщиком или MetalLB в режиме BGP с настроенным Equal-cost multi-path (ECMP).

Принцип работы в сравнении с режимом L2 модуля MetalLB

MetalLB в режиме L2 позволяет заказать Service с типом LoadBalancer, работа которого основана на том, что в пиринговой сети узлы-балансировщики имитируют ARP-ответы от “публичного” IP. Данный режим имеет существенное ограничение — единовременно лишь один балансировочный узел обрабатывает весь входящий трафик данного сервиса. Соответственно:

  • Узел, выбранный в качестве лидера для “публичного” IP становится “узким местом” без возможности горизонтального масштабирования.
  • В случае выхода узла-балансировщика из строя, все текущие соединения будут оборваны для переключения на новый узел, который будет назначен лидером.

Данный модуль помогает обойти эти ограничения. Он предоставляет новый интерфейс L2LoadBalancer, который:

  • Позволяет с помощью nodeSelector связать группу узлов и пул IP-адресов.

После чего мы можем создать стандартный ресурс Service с типом LoadBalancer и в нем с помощью аннотаций указать:

  • Какой L2LoadBalancer использовать. Задав этим набор узлов и адресов.
  • Указать необходимое количество IP-адресов для L2-анонсирования.

Таким образом:

  • Приложение получит не один, а несколько “публичных” IP. Данные IP потребуется прописать в качестве A-записей для публичного домена приложения. Для последующего горизонтального масштабирования потребуется добавить дополнительные узлы-балансировщики, соответствующие Service будут созданы автоматически, потребуется лишь добавить их в список A-записей прикладного домена.
  • При выходе из строя одного из узлов-балансировщиков, лишь часть трафика будет подвержена обрыву для переключения на здоровый узел.