---
title: 'Настроить балансировщик нагрузки в кластере Managed Kubernetes для Ingress'
sidebar_label: 'Настроить балансировщик нагрузки'
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 для Ingress

:::warning

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

:::

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

Если вы используете Ingress Controller Traefik, балансировщик нагрузки будет автоматически создан при установке Ingress Controller Traefik. Чтобы настроить балансировщик при установке, используйте инструкцию [Установить Ingress Controller Traefik](/managed-kubernetes/networks/loadbalancing-with-ingress/set-up-ingress/?install-ingress-controller=with-configuring-loadbalancer). Все аннотации для настройки балансировщика нагрузки, которые описаны в этой инструкции, применяются к Ingress Controller Traefik только через файл `values.yaml`.

Если вы используете другой Ingress Controller без автоматического создания балансировщика или дополнительный балансировщик нагрузки нужен для других приложений, [создайте балансировщик нагрузки](#create-load-balancer).

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

1. [Подключитесь к кластеру](/managed-kubernetes/clusters/connect-to-cluster.mdx).

2. Создайте YAML-файл с манифестом для объекта Service типа LoadBalancer.

   Пример манифеста Service типа LoadBalancer:

   ```yaml
   apiVersion: v1
   kind: Service
   metadata:
     name: loadbalancer-name
     labels:
       app: my-app
     annotations:
       loadbalancer.openstack.org/keep-floatingip: "true"
   spec:
     type: LoadBalancer
     selector:
       app: my-app
     ports:
     - port: 80
       protocol: TCP
   ```

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

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

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

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

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

## Указать флейвор и тип балансировщика \{#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.

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

## Создать балансировщик без публичного 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. Добавьте в манифест аннотацию с указанием подсети:

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

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

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

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

3. Укажите IP-адрес балансировщика:

   ```yaml
   spec:
       type: LoadBalancer
       selector:
         app: my-app
       ports:
       - port: 80
         protocol: TCP
         name: http
       loadBalancerIP: "<ip_address>"
   ```

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

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

## Добавить настройки соединений \{#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}

Чтобы указать максимум соединений, используйте аннотацию:

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

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

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

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

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

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

```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}

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

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

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

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

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

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

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

Чтобы указать таймаут неактивности, используйте аннотацию:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

По умолчанию в Managed Kubernetes используется `externalTrafficPolicy: Cluster`. Это означает, что IP-адрес клиента заменяется на IP-адрес ноды кластера. Чтобы получать 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`. Для этого в манифест добавьте аннотацию:

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

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

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

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

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

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

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

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

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

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

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

    Пример использования можно посмотреть в инструкции [Использовать PROXY-протокол в кластере Managed Kubernetes для Ingress Controller Traefik](/managed-kubernetes/networks/loadbalancing-with-ingress/use-proxy.mdx).
  </TabItem>
</Tabs>

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

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

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

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

```yaml
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
  - port: 80
    protocol: TCP
    name: http
  loadBalancerIP: "<ip_address>"
```

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

<Formbricks />
