Настройка балансировщика нагрузки HAProxy#

Для обеспечения отказоустойчивости и равномерного распределения трафика между компонентами Astra Automation можно использовать балансировщик нагрузки HAProxy. HAProxy работает на уровне TCP с использованием режима SSL passthrough – шифрованный HTTPS-трафик передается напрямую на целевые узлы без расшифровки на уровне балансировщика.

HAProxy анализирует значение поля SNI (Server Name Indication) в запросе TLS и направляет трафик в нужную группу серверов. Такой подход сохраняет целостность TLS-сессии и позволяет использовать один IP-адрес и порт (443) для всех компонентов платформы.

Предварительные требования#

Начальные условия:

  • у вас есть выделенный сервер или ВМ с установленной ОС, например, Astra Linux Special Edition, для установки HAProxy;

  • компоненты Astra Automation (Automation Controller, Automation Hub, контроллер Event-Driven Automation) развернуты и доступны по HTTPS;

  • у каждого компонента есть доменное имя, разрешаемое с сервера HAProxy, например, controller.example.ru, hub.example.ru, eda.example.ru;

  • все целевые сервисы прослушивают порт 443 и имеют корректно установленные сертификаты TLS.

Пример конфигурации стенда#

В этом руководстве рассматривается настройка HAProxy для платформы, развернутой в следующей конфигурации.

Название узла

IP-адрес

Доменное имя

Компонент

ctrl1

192.168.56.11

controller.example.ru

Automation Controller

ctrl2

192.168.56.12

controller.example.ru

Automation Controller

hub1

192.168.56.13

hub.example.ru

Private Automation Hub

hub2

192.168.56.14

hub.example.ru

Private Automation Hub

edac

192.168.56.15

eda.example.ru

Контроллер Event-Driven Automation

Установка HAProxy#

Для установки HAProxy выполните следующие действия на узле балансировщика:

  1. Обновите список доступных пакетов:

    sudo apt update
    
  2. Установите пакет HAProxy:

    sudo apt install haproxy --yes
    
  3. Убедитесь, что служба запущена:

    sudo systemctl status haproxy
    

    В выводе ожидается наличие следующей строки:

    Active: active (running) since Wed 2025-09-03 14:22:58 MSK; 1min 33s ago
    

Настройка HAProxy#

Файл конфигурации HAProxy по умолчанию находится в каталоге /etc/haproxy/.

При настройке HAProxy обратите внимание на следующие особенности:

  • HAProxy должен работать в режиме TCP, то есть для всех frontend и backend компонентов необходимо указать mode tcp, чтобы обеспечить передачу зашифрованного трафика без его расшифровки.

  • Для маршрутизации HTTPS-трафика по доменному имени сервера (SNI) настройте соответствующие правила, которые направляют соединения с конкретным именем (например, controller.example.ru, hub.example.ru, eda.example.ru) в соответствующие группы backend компонентов.

  • Для всех backend компонентов используйте стратегию балансировки balance source, которая обеспечивает постоянное распределение трафика от одного клиента на один и тот же сервер, основываясь на IP-адресе клиента.

  • Для каждого сервера в backend настройте проверку доступности с помощью опции check, чтобы HAProxy мог автоматически исключать недоступные серверы из списка рабочих узлов.

  • Настройте административный интерфейс статистики HAProxy, доступный через порт 9000 по адресу /stats, с включенной базовой аутентификацией для мониторинга состояния компонентов backend и их нагрузки. Интерфейс мониторинга в этом случае доступен по адресу http://<haproxy-ip>:9000/stats. Вход осуществляется по имени пользователя и паролю, заданным в конфигурации, например, admin:password.

Пример работы HAProxy показан на схеме:

../../_images/haproxy-light.svg ../../_images/haproxy-dark.svg

Ниже приведен пример настройки HAProxy для маршрутизации HTTPS-трафика по SNI и балансировки нагрузки между несколькими backend компонентами. Каждая секция файла настройки описана отдельно. Полный файл настройки доступен по ссылке.

Global#

В секции global задаются глобальные параметры HAProxy. Как правило, они задаются один раз и не требуют изменения после настройки. Некоторые из них имеют эквиваленты в командной строке. Полный список параметров доступен в документации HAProxy.

Для настройки HAProxy в Astra Automation используйте следующие параметры:

log#

Сервер системного журнала для отправки записей HAProxy. При задании параметра можно указать уровень важности и категорию для классификации записей журнала. Он используется для настройки централизованного сбора событий и информации о работе HAProxy.

Примеры настройки:

    log /dev/log local0
    log /dev/log local1 notice

Первая строка задает отправку записей журнала в системный сокет /dev/log с категорией local0 без ограничения по уровню важности.

Вторая строка также задает отправку через сокет /dev/log, но с категорией local1 и ограничением на уровень важности сообщений – будет фиксироваться только уровень важности notice и выше.

chroot#

Каталог, который задается как новый корневой каталог файловой системы для процессов HAProxy. Это повышает безопасность, ограничивая доступ HAProxy в файловой системе заданным каталогом.

user#

Пользователь, от имени которого будет работать HAProxy.

group#

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

daemon#

Запуск HAProxy в фоновом режиме.

stats socket#

Unix-сокет для доступа к статистике HAProxy.

tune.ssl.default-dh-param#

Размер параметра Диффи-Хеллмана для соединений SSL.

maxconn#

Максимальное количество одновременных соединений, которые HAProxy может обслуживать.

Пример заполнения секции:

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon
    stats socket /var/lib/haproxy/stats level admin
    tune.ssl.default-dh-param 2048
    maxconn 4096

Defaults#

Секция defaults определяет параметры, которые будут наследоваться всеми другими секциями, если они не переопределены.

Для настройки HAProxy в Astra Automation используйте следующие параметры:

log#

Сервер системного журнала для отправки записей HAProxy. Можно указать log global для использования параметров из секции global.

mode#

Режим работы.

option tcplog#

Включение расширенного ведения журнала соединений TCP.

timeout connect#

Максимальное время ожидания успешной попытки подключения к серверу.

timeout client#

Максимальное время ожидания активности от клиента.

timeout server#

Максимальное время ожидания активности от сервера.

retries#

Количество попыток переподключения к серверу при сбоях.

Пример заполнения секции:

defaults
    log global
    mode tcp
    option tcplog
    timeout connect 5s
    timeout client 50s
    timeout server 50s
    retries 3

Frontend https-in#

Frontend https-in принимает трафик на порту 443 и маршрутизирует его по SNI.

Для разных доменных имен создаются правила, которые перенаправляют запросы соответствующим backend компонентам.

Для настройки HAProxy в Astra Automation используйте следующие параметры:

bind#

IP-адрес и порт для входящих соединений.

mode#

Режим работы frontend.

tcp-request#

Опции обработки запросов на уровне TCP.

Пример настройки:

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

Здесь:

  • inspect-delay – время ожидания анализа первых пакетов;

  • content accept if { req_ssl_hello_type 1 } – условие, при котором соединение принимается, например, при обнаружении TLS ClientHello.

acl#

Правила фильтрации трафика, например, по SNI.

use_backend#

Backend компонент в который необходимо перенаправить трафик при выполнении условия.

Пример заполнения секции:

# --- HTTPS passthrough frontend ---
frontend https-in
    bind *:443
    mode tcp

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }

    acl is_controller req.ssl_sni -i controller.example.ru
    acl is_hub        req.ssl_sni -i hub.example.ru
    acl is_eda        req.ssl_sni -i eda.example.ru

    use_backend controller_backend if is_controller
    use_backend hub_backend        if is_hub
    use_backend eda_backend        if is_eda

Backend controller_backend#

В секции backend controller_backend задаются настройки серверов Automation Controller к которым будет направляться трафик, если клиент обратился к домену controller.example.ru.

Для настройки HAProxy в Astra Automation используйте следующие параметры:

mode#

Режим работы серверов Automation Controller.

balance#

Алгоритм балансировки нагрузки.

server#

Сервер Automation Controller с IP-адресом, портом и проверкой доступности.

Пример заполнения секции:

# --- Controller backend ---
backend controller_backend
    mode tcp
    balance source
    server ctrl1 192.168.56.11:443 check
    server ctrl2 192.168.56.12:443 check

Backend hub_backend#

В секции backend hub_backend задаются настройки серверов Private Automation Hub к которым будет направляться трафик, если клиент обратился к домену hub.example.ru.

Для настройки HAProxy в Astra Automation используйте следующие параметры:

mode#

Режим работы серверов Private Automation Hub.

balance#

Алгоритм балансировки нагрузки.

server#

Сервер Private Automation Hub с IP-адресом, портом и проверкой доступности.

Пример заполнения секции:

# --- PAH backend ---
backend hub_backend
    mode tcp
    balance source
    server hub1 192.168.56.13:443 check
    server hub2 192.168.56.14:443 check

Backend eda_backend#

В секции backend eda_backend задаются настройки сервера контроллера Event-Driven Automation к которому будет направляться трафик, если клиент обратился к домену eda.example.ru.

Для настройки HAProxy в Astra Automation используйте следующие параметры:

mode#

Режим работы сервера контроллера Event-Driven Automation.

server#

Сервера контроллера Event-Driven Automation с IP-адресом, портом и проверкой доступности.

Пример заполнения секции:

# --- EDA backend ---
backend eda_backend
    mode tcp
    balance source
    server edac 192.168.56.15:443 check

Listen stats#

Секция listen stats включает встроенный веб-интерфейс статистики HAProxy, например, доступный по адресу http://<ip>:9000/stats.

Для настройки HAProxy в Astra Automation используйте следующие параметры:

bind#

IP-адрес и порт веб-интерфейса статистики.

mode#

Режим работы веб-интерфейса.

stats#

Настройки веб-интерфейса статистики.

Пример настройки:

    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:password
    stats realm Haproxy\ Statistics

Здесь:

  • enable – включение отображения статистики;

  • uri – URI страницы статистики;

  • refresh – интервал обновления данных;

  • auth – логин и пароль для аутентификации;

  • realm – текстовое сообщение в диалоге аутентификации.

Пример заполнения секции:

listen stats
    bind *:9000
    mode http
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:password
    stats realm Haproxy\ Statistics

Добавление технического заголовка для идентификации узла#

Для упрощения диагностики балансировки через HAProxy можно добавить дополнительный HTTP-заголовок X-Served-By. Для этого выполните следующие действия:

  1. На всех узлах платформы настройте NGINX:

    1. В каталоге /etc/nginx/conf.d/ создайте конфигурационный файл NGINX со следующим содержимым:

      server {
            listen 443 ssl;
            server_name <hostname>;
      
            ssl_certificate     /path/to/cert.pem;
            ssl_certificate_key /path/to/key.key;
      
            location / {
                     add_header X-Served-By "<host>";
            }
      }
      

      Здесь:

      • <hostname> – доменное имя сервера (SNI), например, controller.example.ru;

      • <host> – название узла, например, ctrl1.

    2. Перезапустите сервис nginx:

      sudo systemctl reload nginx
      
  2. Проверьте заголовок ответа:

    curl -I https://controller.example.ru
    

    Ожидаемый результат выполнения команды:

    X-Served-By: ctrl1
    

Обеспечение отказоустойчивости балансировщика#

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

  • Использование VRRP и keepalived.

    На физических серверах (BareMetal) доступен уровень L2 сети, что позволяет использовать классический механизм VRRP для организации виртуального IP-адреса. В этом случае несколько узлов с установленным HAProxy объединяются в кластер, где один из узлов активен, а остальные работают в режиме ожидания. При отказе активного узла виртуальный IP-адрес автоматически переносится на резервный узел. Пример настройки VRRP с использованием Keepalived для BareMetal серверов приведен в документации Yandex Cloud.

  • Использование внешнего балансировщика уровня TCP.

    В инфраструктуре, где нет поддержки VRRP (например, в облачных средах без доступа к протоколам L2), рекомендуется использовать внешний сетевой балансировщик, который обеспечивает распределение соединений TCP между несколькими узлами с HAProxy и поддерживает проверку их доступности. В качестве примера можно использовать Yandex Network Load Balancer, который работает на уровне TCP и автоматически исключает недоступные узлы из схемы балансировки.

В результате отказ одного из узлов балансировщика не приведет к недоступности сервисов Astra Automation, трафик будет автоматически перенаправляться на резервные узлы или через внешний балансировщик.