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