• Русский
  • MetalLB Operator

    Понимание MetalLB Operator

    MetalLB Operator предоставляет реализацию балансировщика нагрузки, нативного для Kubernetes, для локальных или bare-metal сред, которые не имеют доступа к облачным сервисам балансировки нагрузки.
    Он позволяет ресурсам Service типа LoadBalancer функционировать, назначая внешние IP-адреса сервисам и рекламируя эти адреса через уровень 2 (ARP/NDP) или уровень 3 (BGP).

    Operator автоматизирует управление жизненным циклом компонентов MetalLB, включая установку, обновления и синхронизацию конфигурации.

    Терминология

    ТерминОписание
    VIPВиртуальный IP-адрес (VIP) — это IP-адрес, назначаемый MetalLB для внутренней маршрутизации типа LoadBalancer, обеспечивающий единый точку доступа для внешнего трафика к сервисам внутри кластера.
    ARPПротокол разрешения адресов (ARP) используется для сопоставления IP-адресов сетевого уровня с MAC-адресами канального уровня.
    GARPGratuitous ARP (GARP) — специальный ARP-запрос, используемый для информирования других узлов в сети о привязке IP-адреса к MAC-адресу. В отличие от обычных ARP-запросов, GARP не ожидает ответов, а активно рассылает информацию по сети.
    ARP ResponderКомпонент MetalLB, отвечающий на ARP-запросы, сопоставляя VIP с MAC-адресом узла. Когда узлу необходимо связаться с VIP, он отправляет ARP-запросы для получения MAC-адреса, соответствующего VIP. Каждый доступный узел имеет ARP Responder, который отвечает на эти запросы, сопоставляя VIP с MAC-адресом узла.
    ControllerКомпонент MetalLB, который динамически выделяет VIP из пула внешних адресов для внутренней маршрутизации типа LoadBalancer. Controller отслеживает события создания и удаления внутренних маршрутов в кластере, чтобы выделять или освобождать VIP по мере необходимости.
    SpeakerКомпонент MetalLB, который на основе политик или алгоритмов определяет, должны ли узлы хостить VIP и отправлять GARP. Он обеспечивает определённый уровень баланса между узлами, и при недоступности одного узла другие узлы могут взять на себя VIP и отправить GARP, обеспечивая тем самым высокую доступность.

    Принципы высокой доступности в MetalLB

    По умолчанию платформа использует ARP-режим MetalLB, а конкретный процесс реализации и принципы следующие:

    • Компонент Controller MetalLB выбирает IP-адрес из пула внешних адресов и выделяет его для внутренней маршрутизации типа LoadBalancer в качестве VIP.

    • MetalLB выбирает доступный узел в качестве лидера для хостинга VIP на основе алгоритма, который затем перенаправляет трафик.

    • Компонент Speaker на этом узле активно отправляет GARP, устанавливая связь между VIP и MAC-адресом на всех узлах.

      • Узлы в одной подсети, узнав сопоставление между VIP и MAC-адресом доступного узла, будут напрямую взаимодействовать с этим узлом при обращении к VIP.

      • Узлы в разных подсетях сначала направляют трафик на шлюз своей подсети, который затем перенаправляет трафик на узел, хостящий VIP.

    • При сбое этого узла MetalLB выбирает другого лидера для хостинга VIP и отправляет GARP для обновления MAC-адреса IP сервиса, обеспечивая тем самым высокую доступность.

    • При достижении узла Kube-Proxy перенаправляет трафик соответствующему Pod.

    Алгоритм выбора узлов-хостов VIP

    Выбор «лидера» (узла, который будет рекламировать IP) для данного IP балансировщика нагрузки является статeless и работает следующим образом:

    • каждый speaker собирает список потенциальных анонсеров данного IP, учитывая активных спикеров, политику внешнего трафика, активные endpoints, node selectors и другие параметры.
    • каждый speaker выполняет одинаковый расчёт: получает отсортированный список хэшей элементов «node+VIP» и анонсирует сервис, если он является первым элементом списка.

    Это устраняет необходимость хранить память о том, какой speaker отвечает за анонсирование данного IP.

    Формула расчёта

    Формула: Количество пулов внешних адресов = ceil(n-vip / n-node), где ceil — округление вверх.

    Примечание: При использовании виртуальных машин количество виртуальных машин = Количество пулов внешних адресов * n. Здесь n должно быть больше 2, при этом допускается отказ одного узла.

    • n-vip: количество VIP.

    • n-node: количество VIP, которое может обслуживать один узел.

    Пример применения

    Если в компании 10 VIP, и каждый доступный узел может обслуживать 5 VIP, при допущении отказа одного узла, как компании спланировать количество пулов внешних адресов и доступных узлов?

    Анализ:

    Требуется всего два пула внешних адресов и четыре доступных узла.

    • Каждый доступный узел может обслуживать максимум 5 VIP, значит один пул внешних адресов может содержать 5 VIP, поэтому для 10 VIP нужны два пула внешних адресов.

    • При допущении отказа одного узла каждый пул адресов должен включать один узел, хостящий VIP, и один резервный узел, что даёт по два доступных узла для каждого из двух пулов внешних адресов.

    Custom Resource Definitions

    MetalLB Operator устанавливает и управляет несколькими CRD в группе API metallb.io.
    Эти CRD определяют, как MetalLB назначает и рекламирует IP-адреса.

    CRDKindНазначение
    IPAddressPoolIPAddressPoolОпределяет пул IP-адресов, доступных для сервисов типа load balancer.
    L2AdvertisementL2AdvertisementНастраивает, как IP из пулов рекламируются с помощью ARP/NDP (уровень 2).
    BGPPeerBGPPeerОпределяет BGP-пира для MetalLB для установления маршрутизирующих сессий (уровень 3).
    BGPAdvertisementBGPAdvertisementУказывает, какие IPAddressPool рекламируются через BGP и с какими политиками.
    BFDProfileBFDProfileОпционально; определяет параметры Bidirectional Forwarding Detection для более быстрого обнаружения сбоев BGP.

    IPAddressPool

    Определяет диапазон(ы) IP, которые MetalLB может назначать для Service.type=LoadBalancer.

    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: production-pool
      namespace: metallb-system
    spec:
      addresses:
        - 192.168.10.100-192.168.10.150
      autoAssign: true
    1. Один или несколько CIDR или диапазонов.
    2. По умолчанию MetalLB выделяет IP из любого настроенного пула адресов с доступными адресами. Это может привести к использованию «дорогих» адресов для сервисов, которым это не требуется. Чтобы предотвратить такое поведение, можно отключить автоматическое выделение для пула, установив флаг autoAssign в false.

    L2Advertisement

    Используется в режиме уровня 2, когда MetalLB объявляет IP через ARP/NDP.

    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: l2-adv
      namespace: metallb-system
    spec:
      ipAddressPools:
        - production-pool
    1. Список пулов, IP-адреса которых будут рекламироваться.

    BGPPeer

    apiVersion: metallb.io/v1beta1
    kind: BGPPeer
    metadata:
      name: peer1
      namespace: metallb-system
    spec:
      peerAddress: 10.0.0.1
      peerASN: 64512
      myASN: 64513
      holdTime: 90s
      keepaliveTime: 30s
      nodeSelectors:
        - matchLabels:
            alertmanager: 'true'
    1. IP-адрес пир-роутера.
    2. ASN пира.
    3. ASN, используемый MetalLB.
    4. holdTime / keepaliveTime: Опциональные таймеры для BGP-сессий.
    5. Можно ограничить пиры определёнными узлами, используя атрибут node-selectors в конфигурации пиров.

    BGPAdvertisement

    Управляет тем, как IP из пулов рекламируются через BGP.

    apiVersion: metallb.io/v1beta1
    kind: BGPAdvertisement
    metadata:
      name: bgp-adv
      namespace: metallb-system
    spec:
      ipAddressPools:
        - production-pool
      aggregationLength: 32
      communities:
        - no-export
    1. Какие пулы рекламировать.
    2. Длина префикса агрегации маршрутов.
    3. Атрибуты BGP community.

    BFDProfile (опционально)

    Используется для определения параметров BFD (Bidirectional Forwarding Detection) для BGP-пиров.

    apiVersion: metallb.io/v1beta1
    kind: BFDProfile
    metadata:
      name: fast-failover
    spec:
      receiveInterval: 300
      transmitInterval: 300
      detectMultiplier: 3

    Ограничения и условия

    Ресурсы IP для внешнего адреса должны соответствовать следующим условиям:

    • Пул внешних адресов должен быть связан на уровне 2 (L2) с доступными узлами.

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

    • Не должно быть пересечений с сетями, используемыми кластером, включая Cluster CIDR, Service CIDR, подсети и т. д.

    • В среде с двойным стеком необходимо, чтобы одновременно в одном пуле внешних адресов присутствовали как IPv4, так и IPv6 адреса, и их количество было больше 0. В противном случае внутренние маршруты типа LoadBalancer с двойным стеком не смогут получить внешние адреса доступа.

    • В среде IPv6 DNS узлов должен поддерживать IPv6, иначе плагин MetalLB не сможет успешно развернуться.

    Установка и удаление MetalLB Operator

    Operator можно установить через Cluster Plugin в веб-консоли Alauda Container Platform.

    1. Перейдите в Administrator -> Marketplace -> Cluster Plugin
    2. Введите ключевое слово MetalLB.
    3. Нажмите , затем Install.
    4. После установки нажмите , затем Uninstall для удаления.

    Обновление MetalLB Operator

    Обновление MetalLB Operator осуществляется через загрузку пакета в веб-консоли Alauda Container Platform.

    1. Перейдите в Administrator -> Marketplace -> Upload Package

    Подробнее о Upload Package.