Compare languages | The MetalLB module: примеры

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

Metallb can be used in Static (Bare Metal) clusters when there is no option to use cloud load balancers. Metallb can work in L2 LoadBalancer or BGP modes LoadBalancer.

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

Example of MetalLB usage in L2 LoadBalancer mode

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

Enable the module:

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

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

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

Prepare the application to publish:

shell kubectl create deploy nginx –image=nginx

shell kubectl create deploy nginx –image=nginx

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

Deploy the MetalLoadBalancerClass resource:

yaml 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

yaml 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: “” # node-balancer selector type: L2

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

Deploy standard resource Service with special annotation and MetalLoadBalancerClass name:

yaml 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

yaml 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 name ports:

  • port: 8000 protocol: TCP targetPort: 80 selector: app: nginx

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

As a result, the created Service with the type LoadBalancer will be assigned the specified number of addresses:

shell $ kubectl 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

shell $ kubectl 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

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

The resulting EXTERNAL-IP are ready to use in application DNS-domain:

shell $ 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

shell $ 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

Example of MetalLB usage in BGP LoadBalancer mode

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

Enable the module and configure all the necessary parameters:

yaml 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

yaml 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-пиринг на сетевом оборудовании.

Configure BGP peering on the network equipment.

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

Additional configuration examples for Service

Для создания Services с общими IP адресами необходимо добавить к ним аннотацию metallb.universe.tf/allow-shared-ip:

To create a Services with shared IP addresses, you need to add the annotation metallb.universe.tf/allow-shared-ip to them:

yaml apiVersion: v1 kind: Service metadata: name: dns-service-tcp namespace: default annotations: metallb.universe.tf/allow-shared-ip: “key-to-share-1.2.3.4” spec: type: LoadBalancer loadBalancerIP: 1.2.3.4 ports:

  • name: dnstcp protocol: TCP port: 53 targetPort: 53 selector: app: dns — apiVersion: v1 kind: Service metadata: name: dns-service-udp namespace: default annotations: metallb.universe.tf/allow-shared-ip: “key-to-share-1.2.3.4” spec: type: LoadBalancer loadBalancerIP: 1.2.3.4 ports:
  • name: dnsudp protocol: UDP port: 53 targetPort: 53 selector: app: dns

yaml apiVersion: v1 kind: Service metadata: name: dns-service-tcp namespace: default annotations: metallb.universe.tf/allow-shared-ip: “key-to-share-1.2.3.4” spec: type: LoadBalancer loadBalancerIP: 1.2.3.4 ports:

  • name: dnstcp protocol: TCP port: 53 targetPort: 53 selector: app: dns — apiVersion: v1 kind: Service metadata: name: dns-service-udp namespace: default annotations: metallb.universe.tf/allow-shared-ip: “key-to-share-1.2.3.4” spec: type: LoadBalancer loadBalancerIP: 1.2.3.4 ports:
  • name: dnsudp protocol: UDP port: 53 targetPort: 53 selector: app: dns

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

To create a Service with a forcibly selected address in L2 LoadBalancer mode, you need to add the annotation network.deckhouse.io/load-balancer-ips:

yaml 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

yaml 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

Для создания Service с принудительно выбранным адресом в режиме BGP LoadBalancer, необходимо добавить аннотацию metallb.universe.tf/loadBalancerIPs:

To create a Service with a forcibly selected address in BGP LoadBalancer mode, you need to add the annotation metallb.universe.tf/loadBalancerIPs:

yaml apiVersion: v1 kind: Service metadata: name: nginx annotations: metallb.universe.tf/loadBalancerIPs: 192.168.1.100 spec: ports:

  • port: 80 targetPort: 80 selector: app: nginx type: LoadBalancer

yaml apiVersion: v1 kind: Service metadata: name: nginx annotations: metallb.universe.tf/loadBalancerIPs: 192.168.1.100 spec: ports:

  • port: 80 targetPort: 80 selector: app: nginx type: LoadBalancer

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

Creating a Service and assigning it IPAddressPools is possible in BGP LoadBalancer mode using the annotation metallb.universe.tf/address-pool. For L2 LoadBalancer mode, you need to use the MetalLoadBalancerClass settings (see above).

yaml 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

yaml 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