Стадия жизненного цикла модуля: 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
settings:
addressPools:
- addresses:
- 192.168.219.100-192.168.219.200
name: mypool
protocol: bgp
bgpPeers:
- hold-time: 3s
my-asn: 64600
peer-address: 172.18.18.10
peer-asn: 64601
speaker:
nodeSelector:
node-role.deckhouse.io/metallb: ""
version: 2
* — в будущих версиях настройки режима BGP будут задаваться через ресурс MetalLoadBalancerClass.
Настройте 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 при использовании mettalb в режиме BGP LoadBalancer
Создание Service и назначение ему IPAddressPools возможно в режиме BGP LoadBalancer через аннотацию metallb.universe.tf. Для режима L2 LoadBalancer необходимо использовать настройки MetalLoadBalancerClass (см. выше).
apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
metallb.universe.tf/address-pool: production-public-ips
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer