Пример для AWS (Network Load Balancer)

При создании балансировщика используются все доступные зоны в кластере.

В каждой зоне балансировщик получает публичный IP. Если в зоне есть instance с Ingress-контроллером, A-запись с IP-адресом балансировщика из этой зоны автоматически добавляется к доменному имени балансировщика.

Если в зоне не остается instance с Ingress-контроллером, тогда IP автоматически удаляется из DNS.

В том случае, если в зоне всего один инстанс с Ingress-контроллером, при перезапуске пода IP-адрес балансировщика этой зоны будет временно исключен из DNS.

1apiVersion: deckhouse.io/v1
2kind: IngressNginxController
3metadata:
4 name: main
5spec:
6  ingressClass: nginx
7  inlet: LoadBalancer
8  loadBalancer:
9    annotations:
10      service.beta.kubernetes.io/aws-load-balancer-type: "nlb"

Пример для GCP / Yandex Cloud / Azure

1apiVersion: deckhouse.io/v1
2kind: IngressNginxController
3metadata:
4 name: main
5spec:
6  ingressClass: nginx
7  inlet: LoadBalancer

В GCP на узлах должна присутствовать аннотация, разрешающая принимать подключения на внешние адреса для сервисов с типом NodePort.

Пример для OpenStack

1apiVersion: deckhouse.io/v1
2kind: IngressNginxController
3metadata:
4  name: main-lbwpp
5spec:
6  inlet: LoadBalancerWithProxyProtocol
7  ingressClass: nginx
8  loadBalancerWithProxyProtocol:
9    annotations:
10      loadbalancer.openstack.org/proxy-protocol: "true"
11      loadbalancer.openstack.org/timeout-member-connect: "2000"

Пример для bare metal

1apiVersion: deckhouse.io/v1
2kind: IngressNginxController
3metadata:
4  name: main
5spec:
6  ingressClass: nginx
7  inlet: HostWithFailover
8  nodeSelector:
9    node-role.deckhouse.io/frontend: ""
10  tolerations:
11  - effect: NoExecute
12    key: dedicated.deckhouse.io
13    value: frontend

Пример для bare metal (при использовании внешнего балансировщика, например Cloudflare, Qrator, Nginx+, Citrix ADC, Kemp и др.)

1apiVersion: deckhouse.io/v1
2kind: IngressNginxController
3metadata:
4  name: main
5spec:
6  ingressClass: nginx
7  inlet: HostPort
8  hostPort:
9    httpPort: 80
10    httpsPort: 443
11    behindL7Proxy: true

Пример для bare metal (балансировщик MetalLB в режиме BGP LoadBalancer)

Доступно в следующих редакциях: EE, CSE Pro (1.67).

1apiVersion: deckhouse.io/v1
2kind: IngressNginxController
3metadata:
4  name: main
5spec:
6  ingressClass: nginx
7  inlet: LoadBalancer
8  nodeSelector:
9    node-role.deckhouse.io/frontend: ""
10  tolerations:
11  - effect: NoExecute
12    key: dedicated.deckhouse.io
13    value: frontend

В случае использования MetalLB его speaker-поды должны быть запущены на тех же узлах, что и поды Ingress–контроллера.

Контроллер должен получать реальные IP-адреса клиентов — поэтому его Service создается с параметром externalTrafficPolicy: Local (запрещая межузловой SNAT), и для принятия данного параметра MetalLB speaker анонсирует этот Service только с тех узлов, в которых запущены целевые поды.

Для этого примера конфигурация модуля metallb должна быть следующей:

1metallb:
2 speaker:
3   nodeSelector:
4     node-role.deckhouse.io/frontend: ""
5   tolerations:
6    - effect: NoExecute
7      key: dedicated.deckhouse.io
8      value: frontend

Пример для bare metal (балансировщик MetalLB в режиме L2 LoadBalancer)

Доступно в следующих редакциях: SE, SE+, EE, CSE Lite (1.67), CSE Pro (1.67).

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

    1apiVersion: deckhouse.io/v1alpha1
    2kind: ModuleConfig
    3metadata:
    4  name: metallb
    5spec:
    6  enabled: true
    7  version: 2
    
  2. Создайте ресурс 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
    
  3. Создайте ресурс IngressNginxController:

    1apiVersion: deckhouse.io/v1
    2kind: IngressNginxController
    3metadata:
    4  name: main
    5spec:
    6  ingressClass: nginx
    7  inlet: LoadBalancer
    8  loadBalancer:
    9    loadBalancerClass: ingress
    10    annotations:
    11      # Количество адресов, которые будут выделены из пула, описанного в _MetalLoadBalancerClass_.
    12      network.deckhouse.io/l2-load-balancer-external-ips-count: "3"
    
  4. Платформа создаст сервис с типом LoadBalancer, которому будет присвоено заданное количество адресов:

    1$ kubectl -n d8-ingress-nginx get svc
    2NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                 PORT(S)                      AGE
    3main-load-balancer     LoadBalancer   10.222.130.11   192.168.2.100,192.168.2.101,192.168.2.102   80:30689/TCP,443:30668/TCP   11s