Балансировщик нагрузок HAProxy + Keepalived методом SSL Passthrough
Автор Maksim Efanov, Last modified by Insaf Fatkhullin на 29 марта 2024 02:43 PM

Оглавление

Для серверов Indeed AM возможно использовать балансировщик нагрузок HAProxy. Для обеспечения отказоустойчивости самого сервера с HAProxy рекомендуется развернуть второй сервер с HAProxy и использовать конфигурацию HAProxy + Keepalived.

Предусловия:

  1. Установленный и настроен центр сертификации WIndows.
  2. Развернутая система Indeed AM. С основным и дополнительным сервером.
  3. Развернутые две машины с ОС Linux, с обновленными компонентами.
  4. Рекомендуется  установить Midnight Commander - для работы с файлами. В качестве текстового редактора рекомендуется использовать mcedit. Для установки выполните: sudo apt-get install mc

Для настройки SSL Passthrough потребуется:

  • Установленный и настроенный центр сертификации.
  • Сертификаты проверки подлинности веб-сервера Haproxy.

      Настройка

      Сертификат для HAProxy

      1. Выполните запрос сертификата проверки подлинности веб-сервера. Выберете параметр "Общее имя" и укажите полное DNS-имя которое будет использоваться для балансировщика нагрузки. В данной инструкции будет использоваться: server.bal.local
      2. Настройте привязку с полученным сертификатом для каждого сервера Indeed AM.

      Настройка прозрачной аутентификации

      Здесь предоставлена инструкция для настройки неограниченного делегирования. Для настройки ограниченного делегирования, воспользуйтесь данной инструкцией.

      1. Создайте пользователей, которые будут использоваться в качестве сервисных учетных записей для серверов AM и MC. Учетные записи будут использованы в качестве удостоверения для пула соответствующего сервера. В качестве примера созданы следующие учетные записи: mc_service и am_service. Для каждого сервера Indeed AM требуется отдельная учетная запись.

      2. Настройте Service Principal Names для созданный учетных записей. Для этого выполните следующие команды (Для выполнения команд консоль должна быть запущена от имени Администратора):

      Команды для учетной записи сервера MC (В данном примере используется учетная запись с именем mc_service):

      • setspn /s HTTP/MC12 BAL\mc_service
      • setspn /s HTTP/MC12.bal.local BAL\mc_service
      • setspn /s HTTP/server.bal.local BAL\mc_service
      • setspn /s HTTP/server BAL\mc_service

      HTTP/MC12 - Указывается метод и имя машины где установлена консоль MC.
      HTTP/MC12.bal.local - Указывается метод и полное имя машины где установлена консоль MC.
      HTTP/server.bal.local - Указывается полное dns имя балансировщика.
      HTTP/server - Указывается dns имя балансировщика.
      BAL\mc_service - Указывается имя учетной записи, созданной для сервера MC, в формате DOMAIN\USERNAME.

      Команды для учетной записи сервера AM(В данном примере используется учетная запись с именем am_service):

      • setspn /s HTTP/AM12 BAL\am_service
      • setspn /s HTTP/am12.bal.local BAL\am_service

      HTTP/AM12 - Указывается метод и имя машины где установлен AM сервер.
      HTTP/AM12.bal.local - Указывается метод и полное имя машины где установлен AM сервер.
      BAL\am_service - Указывается имя учетной записи, созданной для сервера AM, в формате DOMAIN\USERNAME.

      3. Включите делегирование для созданных сервисных учетных записей.

      4. Выполните следующие настройки на серверах AM и MC.

      1. Откройте "Диспетчер служб IIS" и выберете пулы приложений. 
      2. Для пула IndeedAM.MC или IndeedAM.Core в панели "Действия" выберете "Дополнительные параметры".
      3. В окне "Дополнительные параметры" измените параметр "Удостоверение". Для этого нажмите на значок "..." справа.
                                           
      4. В окне "Удостоверение пула приложений" выберете "Особая учетная запись" и нажмите "Установить". Укажите в окне "Задание учетных данных" данные учетной записи для соответствующего сервера (Имя пользователя необходимо указывать в формате DOMAIN\USERNAME). Для сервера MC - mc_service, для сервера AM - am_service.
      5. После изменений параметров для пула приложений IndeedAM.MC или IndeedAM.Core, выполните перезагрузку пула. Для этого выберите пул IndeedAM.MC или IndeedAM.Core и нажмите "Перезапуск..." в окне "Действия".
      6. Выберете приложение mc или core, в пункте "Управление" откройте "Редактор конфигурация".
      7. Откройте конфигурацию system.webServer/security/authentication/windowsAuthentication и измените параметр "useAppPoolCredentials" в "true". Нажмите "Применить".

      8. Проверьте провайдеры для Windows аутентификиации и их порядок. Для этого откройте приложение mc или core, в пункте "IIS" выберете "Проверка подлинности". Выберете "Проверка подлинности Windows" и нажмите "Поставщики".

      9. В окне "Поставщики" провайдеры должны располагаться как на скриншоте. Если один или оба провайдера отсутствуют или располагаются в другом порядке, то необходимо изменить/добавить, выбрав в пункте "Доступные поставщики".

      10. После выполнения всех действий сделайте перезагрузку IIS и выполните команду: klist purge. Команда выполняет сброс билетов Kerberos на компьютере.

      Установка HAProxy + Keepalived

      Установка HAProxy

      Данную установку необходимо произвести на каждом сервере с ОС Linux.

      1. Запустите терминал. Введите команду для установки HAProxy: sudo apt-get install haproxy
      2. Запустите Midnight Commander с root правами: sudo mc
      3. Откройте файл /etc/default/haproxy и добавьте строку ENABLED=1 (Эта настройка позволяет автоматически запускать HAProxy при загрузке системы)
      4. Отредактируйте  файл конфигурации HAProxy: /etc/haproxy/haproxy.cfg используя примеры. Описание настраиваемых параметров:
        • log - вести лог в /dev/log сохраняя в "объект" local0.
        • chroot - настройки безопасности, "запирающие" HAProxy в указанной директории.
        • stats socket - настройки сокета, по которому будет передаваться статистика.
        • maxconn - максимальное количество конкурирующих соединений на один процесс.
        • user - пользователь, от имени которого будет запущена программа.
        • group - группа пользователя, от имени которого будет запущена программа.
        • daemon - запуск процесса как демона.
        • log - указывает, в какой лог вести записи (global в данном случае означает, что используются параметры, заданные в секции global).
        • mode - устанавливает протокол взаимодействия, принимает одно из значений: tcp, http, health.
        • retries - количество попыток соединения с сервером в случае отказа.
        • option httplog - формат лога, в случае использования HAProxy для проксирования HTTP-запросов, рекомендуется включать данную настройку.
        • option redispatch - разрешает программе разорвать и переназначить сессию в случае отказа сервера.
        • contimeout - максимальное время ожидания успешного соединения с сервером.
        • bind :9000 - означает, что HAProxy будет ожидать запросы к порту 9000.
        • stats enable - включить отчеты со статистикой.
        • stats uri - установка адреса страницы с отчетом.
        • stats auth - логин и пароль для авторизации на странице со статистикой (может быть задано несколько).
        • cookie indeedid_proxy insert indirect nocache - строка сообщает HAProxy, что нужно установить cookie с именем indeedid_proxy. Параметр nocache означает, что этот тип трафика должен быть персональным и не кешировал его.

          HAProxy предлагает несколько алгоритмов балансировки, и в зависимости от вашей задачи можно выбрать наиболее подходящий:

          • roundrobin - каждый сервер получает запросы пропорционально своему весу, при этом веса серверов могут меняться на лету
          • static-rr - то же, что и roundrobin, только изменение весов на лету не даст никакого эффекта
          • leastconn - выбирает сервер с наименьшим количеством активных соединений
          • first - выбирает первый сервер с доступными слотами для соединения
          • source - на основе хэша IP-адреса отправителя запроса и весов серверов назначается сервер для соединения
          • uri - сервер выбирается на основе адреса (без параметров) страницы
          • url_param - сервер выбирается на основе GET-параметров запроса
          • hdr - сервер выбирается на основе заголовков запроса
          • rdp-cookie - сервер выбирается на основе cookie (если они не установлены, то применяется обычный round robin)

      Примеры

      1. Пример конфигурационного файла при использовании SSL Passthrough (config-haproxy-Pass.cfg):

      global
              log /dev/log local0 #
              chroot /var/lib/haproxy
              maxconn 4096
              stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
              stats timeout 30s
              user haproxy
              group haproxy
              daemon
      defaults
              log global
              mode tcp
              option tcplog
              retries 3
              option redispatch
      	timeout connect 20000
      	timeout client 5000
      	timeout server 5400
      	timeout check 10
      # Модуль статистики. Доступен по http://<IP адрес сервера>:9000/haproxy_stats Login:admin Pass:admin
      listen stats
      	mode http
              bind *:9000
      	stats enable
              stats refresh 30s
              stats realm Haproxy\ Statistics.
              stats uri /haproxy_stats
              stats auth admin:admin
      frontend am_server
      	mode tcp
      	timeout client  120s
      	bind *:443
              default_backend backend_servers
      backend backend_servers
      	mode tcp
              balance roundrobin
              stick-table type ip size 1m expire 1h
              stick on src
              timeout connect 120s
              timeout server  120s
              option httpchk get /am/core/api/v6/healthCheck/isHealthy
              http-check expect status 200
              default-server inter 5s downinter 2s fall 2 rise 2
              server indeed1 AM-2-12.bal.local:443 check on-marked-down shutdown-sessions
              server indeed2 AM12.bal.local:443 check on-marked-down shutdown-sessions

      2. Проверьте конфигурационный файл командой: haproxy -c -f /etc/haproxy/haproxy.cfg. Запустите HAProxy: sudo /etc/init.d/haproxy start. Перезапуск сервиса выполняется командами: sudo systemctl restart haproxy или sudo service haproxy restart.

      3. Проверьте работу сервиса перейдя по ссылке: http://<IP адрес сервера Ubuntu c haproxy>:9000/haproxy_stats Login: admin Pass: admin(для конфигурации из примера, указывается в параметре stats auth, блока listen stats ). Пример работы Haproxy: 

      Установка Keepalived

      Данную установку необходимо произвести на каждом сервере с ОС Linux.

      1. Запустите терминал. Введите команду для установки Keepalived: sudo apt-get install keepalived
      2. Запустите Midnight Commander с root правами: sudo mc
      3. Откройте файл /etc/sysctl.conf и добавьте строки:

        net.ipv4.ip_forward=1

        net.ipv4.ip_nonlocal_bind=1

      4. Выполните команду sudo sysctl -p для проверки добавленных изменений
      5. Создайте файл конфигурации /etc/keepalived/keepalived.conf
      6. Настройте файл конфигурации согласно примеру ( config-keepalived-base.cfg ):
        global_defs {
        # Keepalived process identifier
        lvs_id haproxy_DH
        }
        # Script used to check if HAProxy is running
        vrrp_script check_haproxy {
        script "killall -0 haproxy"
        interval 2
        weight 2
        }
        # Virtual interface
        # The priority specifies the order in which the assigned interface to take over in a failover
        vrrp_instance VI_01 {
        state MASTER # MASTER для основного сервера, BACKUP для резевного
        interface ens38 # Имя интерфейса можно узнать с помощью команды ifconfig
        virtual_router_id 51
        priority 101 # Для основного сервера с haproxy 101, для резевного 100
        # The virtual ip address shared between the two loadbalancers
        virtual_ipaddress {
        100.100.1.101 # Виртуальный IP, по которому будет доступен keepalived
        }
        track_script {
        check_haproxy
        }
        }
        1. На дополнительном сервере конфигурационный файл будет отличаться параметрами: "state BACKUP" и "priority 100". ( config-keepalived-backup.cfg )
          # Keepalived process identifier
          lvs_id haproxy_DH
          }
          # Script used to check if HAProxy is running
          vrrp_script check_haproxy {
          script "killall -0 haproxy"
          interval 2
          weight 2
          }
          # Virtual interface
          # The priority specifies the order in which the assigned interface to take over in a failover
          vrrp_instance VI_01 {
          state BACKUP # MASTER для основного сервера, BACKUP для резевного
          interface ens38 # Имя интерфейса можно узнать с помощью команды ifconfig
          virtual_router_id 51
          priority 100 # Для основного сервера с haproxy 101, для резевного 100
          # The virtual ip address shared between the two loadbalancers
          virtual_ipaddress {
          100.100.1.101 # Виртуальный IP, по которому будет доступен keepalived
          }
          track_script {
          check_haproxy
          }
          }
      7. Для виртуального адреса из примера: 100.100.1.101 создайте A-запись в DNS (В данной инструкции используется и настраивается для server.bal.local). DNS Manager>Forward Lookup Zones>New Host (A or AAAA). По этому адресу в дальнейшем будут доступны сервера Ubuntu c балансировщиком нагрузок HAProxy. 
      8. Запустите keepalived командой /etc/init.d/keepalived start. Проверить работоспособность сервиса можно командой: ip addr show ens33 (имя сетевого интерфейса). Для перезагрузки службы используйте команду: sudo service keepalived restart

      Инструкция по настройки HAProxy методом SSL Termination:
      https://support.indeed-company.ru/Knowledgebase/Article/View/balansirovshik-nagruzok-haproxy--keepalived 



      Вложения 
       
       config-haproxy-Pass.cfg (1.06 кБ)
      (1 голос(а))
      Эта статья полезна
      Эта статья бесполезна

      Комментарии (0)
      Добавить новый комментарий
       
       
      Полное имя:
      Email:
      Комментарии: