Пример для 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).
-
Включите модуль
metallb
:1apiVersion: deckhouse.io/v1alpha1 2kind: ModuleConfig 3metadata: 4 name: metallb 5spec: 6 enabled: true 7 version: 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
-
Создайте ресурс 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"
-
Платформа создаст сервис с типом
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