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

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

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

1apiVersion: deckhouse.io/v1alpha1
2kind: ModuleConfig
3metadata:
4  name: metallb
5spec:
6  enabled: true
7  version: 2

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

1kubectl create deploy nginx --image=nginx

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

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

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

1apiVersion: v1
2kind: Service
3metadata:
4  name: nginx-deployment
5  annotations:
6    network.deckhouse.io/l2-load-balancer-external-ips-count: "3"
7spec:
8  type: LoadBalancer
9  loadBalancerClass: ingress # имя MetalLoadBalancerClass
10  ports:
11  - port: 8000
12    protocol: TCP
13    targetPort: 80
14  selector:
15    app: nginx

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

1$ kubectl get svc
2NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                 PORT(S)        AGE
3nginx-deployment       LoadBalancer   10.222.130.11   192.168.2.100,192.168.2.101,192.168.2.102   80:30544/TCP   11s

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

1$ curl -s -o /dev/null -w "%{http_code}" 192.168.2.100:8000
2200
3$ curl -s -o /dev/null -w "%{http_code}" 192.168.2.101:8000
4200
5$ curl -s -o /dev/null -w "%{http_code}" 192.168.2.102:8000
6200

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

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

1apiVersion: deckhouse.io/v1alpha1
2kind: ModuleConfig
3metadata:
4  name: metallb
5spec:
6  enabled: true
7  settings:
8    addressPools:
9    - addresses:
10      - 192.168.219.100-192.168.219.200
11      name: mypool
12      protocol: bgp
13    bgpPeers:
14    - hold-time: 3s
15      my-asn: 64600
16      peer-address: 172.18.18.10
17      peer-asn: 64601
18    speaker:
19      nodeSelector:
20        node-role.deckhouse.io/metallb: ""
21  version: 2

* — в будущих версиях настройки режима BGP будут задаваться через ресурс MetalLoadBalancerClass.

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

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

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

1apiVersion: v1
2kind: Service
3metadata:
4  name: dns-service-tcp
5  namespace: default
6  annotations:
7    network.deckhouse.io/load-balancer-shared-ip-key: "key-to-share-1.2.3.4"
8spec:
9  type: LoadBalancer
10  ports:
11    - name: dnstcp
12      protocol: TCP
13      port: 53
14      targetPort: 53
15  selector:
16    app: dns
17---
18apiVersion: v1
19kind: Service
20metadata:
21  name: dns-service-udp
22  namespace: default
23  annotations:
24    network.deckhouse.io/load-balancer-shared-ip-key: "key-to-share-1.2.3.4"
25spec:
26  type: LoadBalancer
27  ports:
28    - name: dnsudp
29      protocol: UDP
30      port: 53
31      targetPort: 53
32  selector:
33    app: dns

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

1apiVersion: v1
2kind: Service
3metadata:
4  name: nginx
5  annotations:
6    network.deckhouse.io/load-balancer-ips: 192.168.217.217
7spec:
8  ports:
9  - port: 80
10    targetPort: 80
11  selector:
12    app: nginx
13  type: LoadBalancer

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

1apiVersion: v1
2kind: Service
3metadata:
4  name: nginx
5  annotations:
6    metallb.universe.tf/address-pool: production-public-ips
7spec:
8  ports:
9  - port: 80
10    targetPort: 80
11  selector:
12    app: nginx
13  type: LoadBalancer