---
title: 'Настроить балансировщик нагрузки в кластере Managed Kubernetes для Envoy Gateway'
sidebar_label: 'Настроить балансировщик нагрузки для Envoy Gateway'
sidebar_position: 2
description: 'Как настроить балансировщик нагрузки для распределения входящего трафика между подами'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'

# Создать и настроить балансировщик нагрузки в кластере Managed Kubernetes для Envoy Gateway

:::warning

После создания кластера Managed Kubernetes мы рекомендуем выполнять все действия с балансировщиками только через [kubectl](https://kubernetes.io/docs/reference/kubectl/). Изменения, внесенные другим способом, не сохраняются в манифестах Kubernetes. При пересоздании кластера, балансировщика или синхронизации манифестов такие изменения будут отменены.

:::

Балансировщик нагрузки в Managed Kubernetes используется для распределения входящего трафика между подами.

## Создать балансировщик нагрузки \{#create-load-balancer}

Если вам нужно опубликовать сервис в интернет, используйте инструкцию [Опубликовать сервис в интернет](/managed-kubernetes/networks/loadbalancing-with-envoy-gateway/expose-service-to-internet.mdx).

1. [Проверьте квоты](#check-quotas).
2. [Подключитесь к кластеру](#connect-to-cluster).
3. [Создайте объект EnvoyProxy](#create-envoyproxy).
4. [Создайте объект GatewayClass](#create-gatewayclass).
5. [Создайте объект Gateway](#create-gateway).

### 1. Проверить квоты \{#check-quotas}

Убедитесь, что в пуле выделена [квота](/access-control/projects/quotas.mdx) минимум на один публичный плавающий IP-адрес. Для этого [посмотрите потребление квот облачной платформы](/access-control/projects/quotas.mdx#view-consumption).

### 2. Подключиться к кластеру \{#connect-to-cluster}

Чтобы подключиться к кластеру, используйте инструкцию [Подключиться к кластеру Managed Kubernetes](/managed-kubernetes/clusters/connect-to-cluster.mdx).

### 3. Создать объект EnvoyProxy \{#create-envoyproxy}

1. Создайте YAML-файл с манифестом для объекта EnvoyProxy.

   Пример манифеста EnvoyProxy:

   ```yaml
   ---
   apiVersion: gateway.envoyproxy.io/v1alpha1
   kind: EnvoyProxy
   metadata:
       name: custom-proxy-config
       namespace: default
   spec:
       provider:
           type: Kubernetes
           kubernetes:
               envoyService:
                   externalTrafficPolicy: Cluster
                   type: LoadBalancer
   ```

2. Примените манифест:

   ```bash
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для создания объекта EnvoyProxy. Например, `envoyproxy.yaml`.

### 4. Создать объект GatewayClass \{#create-gatewayclass}

1. Создайте YAML-файл с манифестом для объекта GatewayClass.

   Пример манифеста GatewayClass:

   ```yaml
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: GatewayClass
   metadata:
       name: eg
   spec:
       controllerName: gateway.envoyproxy.io/gatewayclass-controller
       parametersRef:
           group: gateway.envoyproxy.io
           kind: EnvoyProxy
           name: custom-proxy-config
           namespace: default
   ```

2. Примените манифест:

   ```bash
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для создания объекта GatewayClass. Например, `gatewayclass.yaml`.

### 5. Создать объект Gateway \{#create-gateway}

1. Создайте YAML-файл с манифестом для объекта Gateway.

   Пример манифеста Gateway:

   ```yaml
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
       name: eg
   spec:
       gatewayClassName: eg
       infrastructure:
           annotations:
               loadbalancer.openstack.org/keep-floatingip: "true"
       listeners:
           - name: http
           protocol: HTTP
           port: 80
   ```

   В блок `annotations` файла `values.yaml` добавьте необходимые параметры для балансировщика — подробнее о параметрах балансировщика нагрузки в подразделе [Настроить балансировщик нагрузки](#configure-loadbalancer).

2. Примените манифест:

   ```bash
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для создания объекта Gateway. Например, `gateway.yaml`.

Созданный балансировщик нагрузки появится в [панели управления](https://my.selectel.ru/vpc/default/lbaas/load-balancers/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Балансировщики** → вкладка **Балансировщики**.

## Настроить балансировщик нагрузки \{#configure-loadbalancer}

### Указать флейвор и тип балансировщика \{#specify-flavor-and-balancer-type}

По умолчанию без указания аннотации создается балансировщик нагрузки [типа](/cloud-servers/load-balancers/about-load-balancers.mdx#balancer-types) Базовый с резервированием.

Для создания балансировщика с другим типом используйте аннотацию:

```yaml
loadbalancer.openstack.org/flavor-id: "<flavor_id>"
```

Укажите `<flavor_id>` — ID флейвора. Флейворы соответствуют [типам балансировщика нагрузки](/cloud-servers/load-balancers/about-load-balancers.mdx#balancer-types) и определяют количество vCPU, RAM и количество инстансов балансировщика. Например, `ac18763b-1fc5-457d-9fa7-b0d339ffb336` — ID для создания балансировщика с типом Продвинутый с резервированием в пуле ru-9. Вы можете посмотреть [список флейворов балансировщика нагрузки во всех пулах](/cloud-servers/load-balancers/about-load-balancers.mdx#balancer-flavors-full-list) в таблице или [посмотреть список флейворов балансировщика нагрузки в определенном пуле](/cloud-servers/load-balancers/about-load-balancers.mdx#view-balancer-flavors-pool-list) через [OpenStack CLI](/cloud-servers/tools/openstack-cli/).

Для созданного балансировщика нельзя изменить тип — нужно [создать новый балансировщик](#create-load-balancer) с нужной аннотацией.

### Создать балансировщик без публичного IP-адреса \{#create-balancer-without-public-ip}

По умолчанию без указания аннотации создается балансировщик с публичным IP-адресом.

Чтобы создать балансировщик без публичного IP-адреса, используйте аннотацию:

```yaml
service.beta.kubernetes.io/openstack-internal-load-balancer: "true"
```

Для созданного балансировщика параметр заменить нельзя — нужно создать новый манифест с нужной аннотацией.

### Создать балансировщик с IP-адресом из других подсетей \{#create-balancer-with-ip-from-other-subnets}

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

Вы можете создать балансировщик в любой другой подсети — публичной, приватной или кросспроектной.

1. Укажите подсеть. Для этого в манифест объекта Gateway добавьте аннотацию:

   ```yaml
   loadbalancer.openstack.org/subnet-id: "<subnet_uuid>"
   ```

   Укажите `<subnet_uuid>` — ID подсети, можно посмотреть с помощью `openstack subnet list`.

2. Отключите автоматическое создание публичного IP-адреса. Для этого в манифест объекта Gateway добавьте аннотацию:

   ```yaml
   service.beta.kubernetes.io/openstack-internal-load-balancer: "true"
   ```

3. Укажите IP-адрес балансировщика. Для этого измените манифест объекта EnvoyProxy:

   ```yaml
   ---
   apiVersion: gateway.envoyproxy.io/v1alpha1
   kind: EnvoyProxy
   metadata:
       name: custom-proxy-config
       namespace: default
   spec:
       provider:
           type: Kubernetes
           kubernetes:
               envoyService:
                   externalTrafficPolicy: Cluster
                   type: LoadBalancer
                   loadBalancerIP: "<ip_address>"
   ```

   Укажите `<ip_address>` — IP-адрес балансировщика из подсети, которую вы выбрали на шаге 1.

   Для созданного балансировщика нельзя изменить тип — нужно [создать новый балансировщик](#create-load-balancer) с нужной аннотацией.

### Добавить настройки соединений \{#add-connection-settings}

Для управления настройками соединений между входящими запросами и балансировщиком или между балансировщиком и серверами используются аннотации:

* [максимум соединений](#max-connections);
* [таймаут соединения для входящих запросов](#connection-timeout-for-incoming-requests);
* [таймаут соединения для запросов балансировщика к серверам](#connection-timeout-for-balancer-requests-to-servers);
* [таймаут неактивности](#inactivity-timeout);
* [таймаут ожидания TCP](#tcp-timeout).

Настройки соединений задаются для [правила](/cloud-servers/load-balancers/about-load-balancers.mdx#rules) балансировщика. Установленные в аннотациях настройки соединений можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/lbaas/load-balancers/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Балансировщики** → вкладка **Балансировщики** → страница балансировщика → откройте карточку правила → откройте блок **Расширенные настройки правила**.

#### Максимум соединений \{#max-connections}

Чтобы указать максимум соединений, в манифест объекта Gateway добавьте аннотацию:

```yaml
loadbalancer.openstack.org/connection-limit: "<value>"
```

Укажите `<value>` — максимальное количество соединений в секунду. По умолчанию — `-1` (не ограничено).

Можно обновить параметр в уже созданном балансировщике.

Параметр можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/lbaas/load-balancers/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Балансировщики** → вкладка **Балансировщики** → страница балансировщика → откройте карточку правила → откройте блок **Расширенные настройки правила** → блок **Входящие на балансировщик запросы** → поле **Максимум соединений**.

#### Таймаут соединения для входящих запросов \{#connection-timeout-for-incoming-requests}

Чтобы указать таймаут соединения для входящих запросов на балансировщик, в манифест объекта Gateway добавьте аннотацию:

```yaml
loadbalancer.openstack.org/timeout-client-data: "<value>"
```

Укажите `<value>` — значение таймаута в миллисекундах. По умолчанию — `50000`.

Можно обновить параметр в уже созданном балансировщике.

Параметр можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/lbaas/load-balancers/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Балансировщики** → вкладка **Балансировщики** → страница балансировщика → откройте карточку правила → откройте блок **Расширенные настройки правила** → блок **Входящие на балансировщик запросы** → поле **Таймаут соединения, мс**.

#### Таймаут соединения для запросов балансировщика к серверам \{#connection-timeout-for-balancer-requests-to-servers}

Чтобы указать таймаут соединения для запросов балансировщика к серверам, в манифест объекта Gateway добавьте аннотацию:

```yaml
loadbalancer.openstack.org/timeout-member-connect: "<value>"
```

Укажите `<value>` — значение таймаута в миллисекундах. По умолчанию — `5000`.

Можно обновить параметр в уже созданном балансировщике.

Параметр можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/lbaas/load-balancers/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Балансировщики** → вкладка **Балансировщики** → страница балансировщика → откройте карточку правила → откройте блок **Расширенные настройки правила** → блок **Запросы от балансировщика к серверам** → поле **Таймаут соединения, мс**.

#### Таймаут неактивности \{#inactivity-timeout}

Таймаут неактивности для запросов балансировщика к серверам — это время, в течение которого текущее подключение считается «живым», даже если данные не передаются.

Чтобы указать таймаут неактивности, в манифест объекта Gateway добавьте аннотацию:

```yaml
loadbalancer.openstack.org/timeout-member-data: "<value>"
```

Укажите `<value>` — значение таймаута в миллисекундах. По умолчанию — `50000`.

Можно обновить параметр в уже созданном балансировщике.

Параметр можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/lbaas/load-balancers/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Балансировщики** → вкладка **Балансировщики** → страница балансировщика → откройте карточку правила → откройте блок **Расширенные настройки правила** → блок **Запросы от балансировщика к серверам** → поле **Таймаут неактивности, мс**.

#### Таймаут ожидания TCP \{#tcp-timeout}

При установке новой TCP-сессии данные иногда передаются не сразу. Параметр определяет время, в течение которого балансировщик ждет передачи данных для инспекции по уже установленному соединению.

Чтобы указать таймаут ожидания TCP для запросов балансировщика к серверам, в манифест объекта Gateway добавьте аннотацию:

```yaml
loadbalancer.openstack.org/timeout-tcp-inspect: "<value>"
```

Укажите `<value>` — значение таймаута в миллисекундах. По умолчанию — `0`.

Можно обновить параметр в уже созданном балансировщике.

Параметр можно посмотреть в [панели управления](https://my.selectel.ru/vpc/default/lbaas/load-balancers/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Балансировщики** → вкладка **Балансировщики** → страница балансировщика → откройте карточку правила → откройте блок **Расширенные настройки правила** → блок **Запросы от балансировщика к серверам** → поле **Таймаут ожидания TCP, мс**.

### Включить проверку правил \{#enable-rule-check}

Чтобы включить или отключить проверку для правил, в манифест объекта Gateway добавьте аннотацию:

```yaml
loadbalancer.openstack.org/enable-health-monitor: "<value>"
```

Укажите `<value>` — статус праверки правил: `true` — для включения проверки или `false` — для отключения проверки. Значение по умолчанию — `true`.

Можно обновить параметр в уже созданном балансировщике.

### Сохранить IP-адрес клиента \{#keep-client-ip-address}

Чтобы получать IP-адрес клиента, добавьте заголовок X-Forwarded-For или правило TCP → PROXY.

<Tabs queryString="keep-client-ip-address">
  <TabItem value="add-x-forwarded-for-header" default>
    <TabItemLabel>
      Добавить заголовок X-Forwarded-For
    </TabItemLabel>

    Без указания аннотации балансировщик передает серверу только исходное тело HTTP-запроса, заменяя IP-адрес клиента на свой.

    Чтобы серверы получали эту информацию для корректной работы или анализа, включите в запрос к серверу заголовок `X-Forwarded-For`. Для этого в манифест объекта Gateway добавьте аннотацию:

    ```yaml
    loadbalancer.openstack.org/x-forwarded-for: "true"
    ```

    Правило будет использовать схему HTTP → HTTP вместо TCP → TCP. Если вместо HTTP-протокола необходимо использовать HTTPS, [терминируйте TLS-соединение](/managed-kubernetes/networks/loadbalancing-with-envoy-gateway/terminate-tls-connection-for-envoy-gateway.mdx).

    Для созданного балансировщика нельзя изменить тип — нужно [создать новый балансировщик](#create-load-balancer) с нужной аннотацией.

    Не используйте вместе с PROXY-протоколом. При добавлении правила TCP → Proxy заголовок `X-Forwarded-For` автоматически попадает на сервис за балансировщиком.
  </TabItem>

  <TabItem value="add-tcp-proxy-rule">
    <TabItemLabel>
      Добавить правило TCP → Proxy
    </TabItemLabel>

    PROXY-протокол используется для передачи информации о соединении от источника, запрашивающего соединение, до пункта назначения, для которого было запрошено соединение.

    В логах пода, к которому происходит подключение через балансировщик с правилами TCP → PROXY, будет указан реальный IP-адрес подключающегося, а не адрес балансировщика.

    Чтобы создать балансировщик с правилом TCP → PROXY, в манифест объекта Gateway добавьте аннотацию:

    ```yaml
    loadbalancer.openstack.org/proxy-protocol: "true"
    ```

    Заголовок `X-Forwarded-For` автоматически попадет на сервис за балансировщиком. Дополнительных аннотаций для его работы добавлять не нужно.

    Для созданного балансировщика нельзя изменить тип — нужно [создать новый балансировщик](#create-load-balancer) с нужной аннотацией.
  </TabItem>
</Tabs>

### Сохранить публичный IP-адрес \{#save-public-ip}

Чтобы при пересоздании балансировщика сохранить публичный IP-адрес, в манифест объекта Gateway добавьте аннотацию:

```yaml
loadbalancer.openstack.org/keep-floatingip: "true"
```

В манифесте объекта EnvoyProxy в поле `loadBalancerIP` укажите этот или другой публичный IP-адрес:

```yaml
---
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: custom-proxy-config
  namespace: default
spec:
  provider:
    type: Kubernetes
    kubernetes:
      envoyService:
        externalTrafficPolicy: Cluster
        type: LoadBalancer
        loadBalancerIP: "<ip_address>"
```

Укажите `<ip_address>` — публичный IP-адрес, который вы хотите сохранять при пересоздании балансировщика.

Можно использовать аннотацию для уже созданного балансировщика.

<Formbricks />
