Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Metallb

Модуль MetalLB управляется оператором с помощью набора пользовательских ресурсов (Custom Resources). Основной ресурс MetalLB отвечает за развертывание и конфигурацию компонентов балансировщика нагрузки в кластере. Диапазоны IP‑адресов задаются ресурсами IPAddressPool, которые определяют наборы адресов, используемых для сервисов типа LoadBalancer. Объявление этих адресов в сеть (через L2 или BGP) настраивается отдельными ресурсами: L2Advertisement для работы в L2‑режиме и связкой BGPPeer и BGPAdvertisement для работы в BGP‑режиме.

1. Установка

1.1. Предварительные условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes.

  • Вы установили утилиту kubectl для работы с Kubernetes.

1.2. Установка с помощью kubectl

  1. Установите оператор metallb-operator. Для этого сохраните представленный ниже манифест в файл, например MetalLBOperator.yaml.

    Пример манифеста для установки metallb-operator
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: metallb-operator
      namespace: metallb-system
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: metallb-operator
      source: nova-catalog
      sourceNamespace: nova-operatorhub
      startingCSV: metallb-operator.v0.14.0
  2. Установите манифест в кластер Kubernetes, выполнив команду:

     kubectl apply -f MetalLBOperator.yaml
  3. Проверьте состояние оператора после установки.

    kubectl get pods -n nova-operators
    Пример вывода:
    NAME                                             READY   STATUS    RESTARTS      AGE
    metallb-operator-6f4fd9d5d4-69nvf                 1/1     Running   1 (44h ago)   5d

    Убедитесь, что оператор находится в статусе Running. В столбце READY должно быть 1/1.

1.2.1. L2-режим

В L2‑режиме, когда сервису назначается внешний IP‑адрес, экземпляры компонента speaker на подходящих узлах выбирают узел‑лидер для этого адреса. Узел‑лидер начинает отвечать на ARP‑запросы для данного виртуального IP, после чего весь входящий трафик поступает на этот узел и далее перенаправляется к нужному поду стандартными средствами kube‑proxy.

Перед началом работы с MetalLB необходимо создать ресурсы MetalLB и IPAddressPool. Ресурсы IPAddressPool описывают диапазоны IP‑адресов, которые будут выделяться сервисам типа LoadBalancer. Таких диапазонов может быть несколько, при этом ресурсы типа Advertisement в дальнейшем можно привязывать к конкретным диапазонам.

Сохраните предоставленный ниже манифесть в файл, например, Metallb-IPAddressPool.yaml.

Пример манифеста
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
  name: metallb
  namespace: metallb-system
spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ''
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-addresspool-l2
  namespace: metallb-system
spec:
  addresses:
    - 192.168.10.0/24
  autoAssign: true
  avoidBuggyIPs: true

Установите манифест в кластер Kubernetes, выполнив команду:

kubectl apply -f Metallb-IPAddressPool.yaml

Для L2-режима необходимо создать ресурс L2Advertisement. Сохраните предоставленный манифест в файл, например, L2Advertisement.yaml.

Пример манифеста
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2-adv-sample1
  namespace: metallb-system
spec:
  ipAddressPools:
    - ip-addresspool-l2

Установите манифест в кластер Kubernetes, выполнив команду:

kubectl apply -f L2Advertisement.yaml

1.2.2. BGP-режим

В BGP-режиме при назначении сервису внешнего IP все подходящие узлы устанавливают BGP-сессию с вышестоящим маршрутизатором и объявляют IP-адрес сервиса. Маршрутизатор получает маршруты от всех узлов и распределяет трафик между ними. В отличие от L2-режима, BGP-режим обеспечивает горизонтальное масштабирование и не создает единой точки отказа.

Для начала работы с MetalLB необходимо создать ресурсы MetalLB и IPAddressPool.

Сохраните предоставленный ниже манифесть в файл, например, Metallb-IPAddressPool.yaml.

Пример манифеста
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
  name: metallb
  namespace: metallb-system
spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ''
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-addresspool-bgp
  namespace: metallb-system
spec:
  addresses:
    - 192.168.10.0/24
  autoAssign: true
  avoidBuggyIPs: true

Установите манифест в кластер Kubernetes, выполнив команду:

kubectl apply -f Metallb-IPAddressPool.yaml

Для BGP-режима необходимо создать ресурсы BGPPeer и BGPAdvertisement:

Пример манифеста
---
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: bgp-peer-sample1
  namespace: metallb-system
spec:
  peerPort: 179
  myASN: 64512
  peerASN: 64513
  peerAddress: 172.30.0.3
---
kind: BGPAdvertisement
apiVersion: metallb.io/v1beta1
metadata:
  name: bgp-adv-sample1
  namespace: metallb-system
spec:
  ipAddressPools:
    - ip-addresspool-bgp
  peers:
    - bgp-peer-sample1

1.2.3. Выделение внешнего IP-адреса из диапазона

Для выделения сервису внешнего IP-адреса из конкретного диапазона необходимо добавить аннотацию в манифест сервиса, например metallb.universe.tf/address-pool: <имя_IPAddressPool>.

Пример манифеста
apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    metallb.universe.tf/address-pool: ip-addresspool-bgp
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

Если аннотация не указана, внешний IP-адрес назначается автоматически из любого диапазона, для которого в спецификации указан параметр autoAssign: true.

1.3. Установка с помощью Nova Console

Установите модуль Metallb через Nova Console OperatorHUB. Для этого выполните следующие шаги.

  1. Установите оператор Metallb Operator. В Nova Console в главном меню выберите OperatorsOperatorHUB. Выберите Metallb Operator. Нажмите кнопку Установить. Параметры оставьте по умолчанию. Подтвердите установку, нажав Установить.

  2. Перейдите в раздел OperatorsУстановленные операторы. Выберите MetalLB Operator или сразу после установки нажмите Открыть оператор.

  3. Перед началом работы с MetalLB необходимо создать ресурсы MetalLB и IPAddressPool. Перейдите ко вкладке MetalLB. Нажмите Создать MetalLB. Создать ресурс можно двумя способами:

    • С помощью формы

      metallb 2
    • С помощью манифеста

      Пример манифеста
      apiVersion: metallb.io/v1beta1
      kind: MetalLB
      metadata:
        name: metallb
        namespace: metallb-system
      spec:
        nodeSelector:
          node-role.kubernetes.io/worker: ''
  4. Перейдите ко вкладке IPAddressPool. Нажмите Создать IPAddressPool. Создать ресурс можно двумя способами:

    • С помощью формы

      metallb 3
    • С помощью манифеста

      Пример манифеста
      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        name: ip-addresspool-l2
        namespace: metallb-system
      spec:
        addresses:
          - 192.168.10.0/24
        autoAssign: true
        avoidBuggyIPs: true

1.3.1. L2-режим

Для L2-режима необходимо создать ресурс L2Advertisement. Перейдите ко вкладке L2Advertisement. Нажмите Создать L2Advertisement. Создать ресурс можно двумя способами:

  • С помощью формы

    metallb 4
  • С помощью манифеста

    Пример манифеста
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: l2-adv-sample1
      namespace: metallb-system
    spec:
      ipAddressPools:
        - ip-addresspool-l2

1.3.2. BGP-режим

Для BGP-режима необходимо создать ресурсы BGPPeer и BGPAdvertisement.

  1. Перейдите ко вкладке BGPPeer. Нажмите Создать BGPPeer. Создать ресурс можно двумя способами:

    • С помощью формы

      metallb 5
    • С помощью манифеста

      Пример манифеста
      apiVersion: metallb.io/v1beta2
      kind: BGPPeer
      metadata:
        name: bgp-peer-sample1
        namespace: metallb-system
      spec:
        peerPort: 179
        myASN: 64512
        peerASN: 64513
        peerAddress: 172.30.0.3
  2. Перейдите ко вкладке BGPAdvertisement. Нажмите Создать BGPAdvertisement. Создать ресурс можно двумя способами:

    • С помощью формы

      metallb 6
    • С помощью манифеста:

      Пример манифеста
      kind: BGPAdvertisement
      apiVersion: metallb.io/v1beta1
      metadata:
        name: bgp-adv-sample1
        namespace: metallb-system
      spec:
        ipAddressPools:
          - ip-addresspool-bgp
        peers:
          - bgp-peer-sample1

1.3.3. Выделение внешнего IP-адреса из диапазона

  1. Для выделения сервису внешнего IP-адреса перейдите в раздел СетьServices. Выберите сервис и перейдите к его настройкам.

    metallb 7
  2. Перейдите на вкладку YAML и добавьте аннотацию, например metallb.universe.tf/address-pool: <имя_IPAddressPool>, как указано в примере ниже.

    Пример манифеста
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
      annotations:
        metallb.universe.tf/address-pool: ip-addresspool-bgp
    spec:
      type: LoadBalancer
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 8080
  3. После редактирования манифеста нажмите Сохранить и после Обновить.

Если аннотация не указана, внешний IP-адрес назначается автоматически из любого диапазона, для которого в спецификации указан параметр autoAssign: true.

2. Удаление MetalLb

2.1. Удаление с помощью kubectl

Для удаления MetalLb выполните следующую команду:

kubectl delete <kind> <name_custom_resource> (1)
1 Укажите тип и имя CR, который необходимо удалить

2.2. Удаление с помощью Nova Console

Для удаления ресурса из кластера Nova выполните следующие шаги.

  1. Перейдите в раздел OperatorsУстановленные операторы. Выберите MetalLb Operator.

  2. Перейдите на вкладку MetalLB.

  3. Выберите ресурс и нажмите Удалить по кнопке действия.

    metallb 8