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
-
Установите оператор 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 -
Установите манифест в кластер Kubernetes, выполнив команду:
kubectl apply -f MetalLBOperator.yaml -
Проверьте состояние оператора после установки.
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. Для этого выполните следующие шаги.
-
Установите оператор Metallb Operator. В Nova Console в главном меню выберите Operators → OperatorHUB. Выберите Metallb Operator. Нажмите кнопку Установить. Параметры оставьте по умолчанию. Подтвердите установку, нажав Установить.
-
Перейдите в раздел Operators → Установленные операторы. Выберите MetalLB Operator или сразу после установки нажмите Открыть оператор.
-
Перед началом работы с MetalLB необходимо создать ресурсы MetalLB и IPAddressPool. Перейдите ко вкладке MetalLB. Нажмите Создать MetalLB. Создать ресурс можно двумя способами:
-
С помощью формы
-
С помощью манифеста
Пример манифеста
apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb-system spec: nodeSelector: node-role.kubernetes.io/worker: ''
-
-
Перейдите ко вкладке IPAddressPool. Нажмите Создать IPAddressPool. Создать ресурс можно двумя способами:
-
С помощью формы
-
С помощью манифеста
Пример манифеста
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. Создать ресурс можно двумя способами:
-
С помощью формы
-
С помощью манифеста
Пример манифеста
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.
-
Перейдите ко вкладке BGPPeer. Нажмите Создать BGPPeer. Создать ресурс можно двумя способами:
-
С помощью формы
-
С помощью манифеста
Пример манифеста
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
-
-
Перейдите ко вкладке BGPAdvertisement. Нажмите Создать BGPAdvertisement. Создать ресурс можно двумя способами:
-
С помощью формы
-
С помощью манифеста:
Пример манифеста
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-адреса из диапазона
-
Для выделения сервису внешнего IP-адреса перейдите в раздел Сеть→Services. Выберите сервис и перейдите к его настройкам.
-
Перейдите на вкладку 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 -
После редактирования манифеста нажмите Сохранить и после Обновить.
Если аннотация не указана, внешний IP-адрес назначается автоматически из любого диапазона, для которого в спецификации указан параметр autoAssign: true.