Стадия жизненного цикла модуля: General Availability

Metallb можно использовать в статических кластерах (bare metal), когда нет возможности воспользоваться балансировщиком от облачного провайдера. Metallb может работать в режимах L2 LoadBalancer или BGP LoadBalancer.

Пример использования metallb в режиме L2 LoadBalancer

Включите модуль:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: metallb
spec:
  enabled: true
  version: 2

Подготовьте приложение, которое хотите опубликовать:

d8 k create deploy nginx --image=nginx

Создайте ресурс MetalLoadBalancerClass:

apiVersion: network.deckhouse.io/v1alpha1
kind: MetalLoadBalancerClass
metadata:
  name: ingress
spec:
  addressPool:
    - 192.168.2.100-192.168.2.150
  isDefault: false
  nodeSelector:
    node-role.kubernetes.io/loadbalancer: "" # селектор узлов-балансировщиков
  type: L2

Создайте ресурс Service с аннотацией и именем MetalLoadBalancerClass:

apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
  annotations:
    network.deckhouse.io/l2-load-balancer-external-ips-count: "3"
spec:
  type: LoadBalancer
  loadBalancerClass: ingress # имя MetalLoadBalancerClass
  ports:
    - port: 8000
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx

В результате, созданному сервису с типом LoadBalancer будут присвоены адреса в заданном количестве:

d8 k get svc

Пример вывода:

NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                 PORT(S)        AGE
nginx-deployment       LoadBalancer   10.222.130.11   192.168.2.100,192.168.2.101,192.168.2.102   80:30544/TCP   11s

При создании сервиса также можно указать определенные IP-адреса из пула, которые будут ему присвоены.

Полученные EXTERNAL-IP можно прописывать в качестве A-записей для прикладного домена:

$ curl -s -o /dev/null -w "%{http_code}" 192.168.2.100:8000
200
$ curl -s -o /dev/null -w "%{http_code}" 192.168.2.101:8000
200
$ curl -s -o /dev/null -w "%{http_code}" 192.168.2.102:8000
200

Пример использования metallb в режиме BGP LoadBalancer

Включите модуль и настройте все необходимые параметры*:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: metallb
spec:
  enabled: true
  version: 3
---
apiVersion: network.deckhouse.io/v1alpha1
kind: MetalLoadBalancerPool
metadata:
  name: mypool
spec:
  addresses:
    - 192.168.219.100-192.168.219.200
---
apiVersion: network.deckhouse.io/v1alpha1
kind: MetalLoadBalancerBGPPeer
metadata:
  name: myrouter
spec:
  peerAddress: 172.18.18.10
  peerASN: 64601
  myASN: 64600
  holdTime: 3s
---
apiVersion: network.deckhouse.io/v1alpha1
kind: MetalLoadBalancerConfiguration
metadata:
  name: defaults
spec:
  mode: BGP
  nodeSelector:
    node-role.deckhouse.io/metallb: ""
  bgp:
    peerNames:
      - myrouter
  advertisements:
    - poolNames:
        - mypool

Настройте BGP-пиринг на сетевом оборудовании.

Дополнительные примеры настроек для Service

Создание сервиса c присвоением ему определенных IP-адресов из пула

Для указания адресов, которые должны быть присвоены сервису, используйте аннотацию network.deckhouse.io/load-balancer-ips. Если желаемых адресов больше одного, то также должна присутствовать аннотация network.deckhouse.io/l2-load-balancer-external-ips-count, в которой необходимо указать количество выделяемых адресов из пула (оно не должно быть меньше количества адресов, перечисленных в network.deckhouse.io/load-balancer-ips).

apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
  annotations:
    # Количество адресов, которые будут выделены из пула, объявленного в MetalLoadBalancerClass.
    network.deckhouse.io/l2-load-balancer-external-ips-count: "3"
    # Список адресов из пула, объявленного в MetalLoadBalancerClass, которые будут выделены сервису.
    network.deckhouse.io/load-balancer-ips: "192.168.2.102,192.168.2.103,192.168.2.104"
spec:
  type: LoadBalancer
  loadBalancerClass: ingress # имя MetalLoadBalancerClass
  ports:
    - port: 8000
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx

В результате, созданному сервису с типом LoadBalancer будут присвоены указанные адреса:

d8 k get svc

Пример вывода:

NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                 PORT(S)        AGE
nginx-deployment       LoadBalancer   10.222.130.11   192.168.2.102,192.168.2.103,192.168.2.104   80:30544/TCP   11s

Создание сервиса с одним принудительно выбранным адресом

Для создания Service с принудительно выбранным адресом необходимо добавить аннотацию network.deckhouse.io/load-balancer-ips:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    network.deckhouse.io/load-balancer-ips: 192.168.217.217
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

Создание сервисов с общими IP адресами

Для создания Services с общими IP адресами необходимо добавить к ним аннотацию network.deckhouse.io/load-balancer-shared-ip-key. Общий ключ является значением аннотации. Services могут совместно использовать IP-адрес при следующих условиях:

  • Они имеют одинаковый ключ совместного использования.
  • Они запрашивают использование разных портов (например, tcp/80 для одного и tcp/443 для другого).
  • Они используют Cluster external traffic policy или указывают на один и тот же набор pods (т.е. селекторы pods идентичны).

Если эти условия выполняются, MetalLB может разместить два сервиса на одном IP-адресе, но не обязан этого делать! Если вы хотите гарантировать, что они будут совместно использовать определенный адрес, используйте аннотацию network.deckhouse.io/load-balancer-ips, описанную выше.

Ниже приведен пример конфигурации двух сервисов, которые совместно используют один IP-адрес:

apiVersion: v1
kind: Service
metadata:
  name: dns-service-tcp
  namespace: default
  annotations:
    network.deckhouse.io/load-balancer-shared-ip-key: "key-to-share-1.2.3.4"
spec:
  type: LoadBalancer
  ports:
    - name: dnstcp
      protocol: TCP
      port: 53
      targetPort: 53
  selector:
    app: dns
---
apiVersion: v1
kind: Service
metadata:
  name: dns-service-udp
  namespace: default
  annotations:
    network.deckhouse.io/load-balancer-shared-ip-key: "key-to-share-1.2.3.4"
spec:
  type: LoadBalancer
  ports:
    - name: dnsudp
      protocol: UDP
      port: 53
      targetPort: 53
  selector:
    app: dns

Создание сервиса и назначение ему IPAddressPools при использовании metallb в режиме BGP LoadBalancer

Создание сервиса и назначение ему IPAddressPools возможно в режиме BGP LoadBalancer через аннотацию network.deckhouse.io/load-balancer-pool. Для режима L2 LoadBalancer необходимо использовать настройки MetalLoadBalancerClass (см. выше).

apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    network.deckhouse.io/load-balancer-pool: production-public-ips
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer