Балансировщик нагрузок HAProxy + Keepalived
Автор Vladislav Fomichev, Last modified by Vladislav Fomichev на 13 сентября 2019 03:49 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 для балансировщиков нагрузки: 

  • SSL Passthrough.Данный метод не был полностью протестирован. В данный момент проводится полноценное тестирование работоспособности. Для настройки потребуется:
    • Установленный и настроенный центр сертификации.
    • Сертификаты проверки подлинности веб-сервера Haproxy.
  • SSl Termination.Для настройки потребуется:
    • Установленный и настроенный центр сертификации.
    • Сертификаты проверки подлинности для серверов Indeed AM.
    • Сертификаты проверки подлинности веб-сервера Haproxy.
    • Корневой сертификат домена.
    • Настройка прозрачной аутентификации.
      • Потребуются создание учетных записей в домене и добавление spn записей. Количество учетных записей зависит от количества серверов Indeed AM.

При использовании метода SSl Termination рассматриваются 2 метода получения ssl сертификатов для Haproxy: 

  1. Запрос сертификата для DNS имени сервера Haproxy через центр сертификации. 
  2. Генерация сертификатов с помощью Open SSL на сервере Haproxy. 

Подготовка

Настройка методом SSL Passthrough

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

Настройка методом SSl Termination

Запрос и установка сертификатов для серверов Indeed AM

Необходимо установить сертификаты проверки подлинности веб-сервера для каждого сервера Indeed AM.

При запросе сертификата, в качестве общего имени, можно использовать полное имя конкретной машины с сервером Indeed, например: indeedAM01.demo.local (При таком сценарии необходимо запросить сертификаты для каждого сервера Indeed), или использовать символ звездочки (*) перед доменным именем (Данный символ означает, что перед доменным именем может быть подставлена любая последовательность символов), например: *.demo.local (При таком сценарии будет достаточно запросить 1 сертификат и установить его на для каждого сервера Indeed).

В данном примере запрашивается один сертификат для всех серверов Indeed AM.

  1. Выполните запрос сертификата и установку для каждого сервера Indeed AM.
  2. Настройте привязку с полученным сертификатом на каждом сервере Indeed AM.

Запрос и установка сертификатов для серверов с haproxy

При использовании https требуется установить сертификаты проверки подлинности веб-сервера для каждого сервера с Haproxy. Можно использовать сертификаты полученные от доменного CA (Рекомендуемый вариант), либо сгенерировать сертификаты с помощью openSSL (Потребуется добавление всех полученных сертификатов в доверенные). 

При запросе сертификата указывается общее(Виртуальное) имя используемое балансировщиками. Данное имя является DNS записью типа “A”  для виртуального ip адреса указанного в Keepalived. 

В данном примере используется имя server.bal.local.

Запрос и установка доменных сертификатов (Рекомендуемый вариант)

  1. Выполните запрос сертификата проверки подлинности веб-сервера. Выберете параметр "Общее имя" и укажите полное DNS-имя которое будет использоваться для балансировщика нагрузки. В данной инструкции будет использоваться: server.bal.local
  2. Выполните экспорт полученного сертификата вместе с закрытым ключом.
  3. В окне "Формат экспортируемого файла" оставьте настройки по умолчанию и нажмите "Далее".
  4. Установите пароль и сохраните сертификат.
  5. Скопируйте полученный сертификат на все машины с Haproxy.
  6. Для использования сертификата на haproxy необходимо выполнить следующие действия:
    • Извлечь из сертификата зашифрованный приватный ключ. Для этого выполните команду (Потребуется указать пароль, заданный при экспорте сертификата): 
      openssl pkcs12 -in <Путь до вашего сертификата в формате pfx> -nocerts -out <Путь куда будет извлечен ключ>.
      Пример команды: openssl pkcs12 -in /home/indeed/Desktop/server.bal.local.pfx -nocerts -out /home/indeed/Desktop/server.bal.localKEY.key
    • Извлечь сертификат в формате crt. Для этого выполните команду: 
      openssl pkcs12 -in <Путь до вашего сертификата в формате pfx> -clcerts -nokeys -out <Путь куда будет извлечен сертификат в формате crt>. 
      Пример команды: openssl pkcs12 -in /home/indeed/Desktop/server.bal.local.pfx -clcerts -nokeys -out /home/indeed/Desktop/server.bal.local.crt
    • Расшифровать приватный ключ. Для этого выполните команду (Потребуется указать пароль, заданный при экспорте сертификата): 
      openssl rsa -in <Путь до извлеченного ключа> -out <Путь куда будет извлечен расшифрованный ключ>. 
      Пример команды: openssl rsa -in /home/indeed/Desktop/server.bal.localKEY.key -out /home/indeed/Desktop/server.bal.localKEY-descr.key
    • Объеденить расшифрованный ключ и сертификат в формате crt и скопировать в папку /etc/ssl/private/ . Для этого выполните команду: 
      sudo bash -c 'cat <Путь до извлеченного расшифрованного ключа> <Путь до сертификата в формате crt> >> /etc/ssl/private/<Имя сертификата с форматом pem>' .
      Пример команды: sudo bash -c 'cat /home/indeed/Desktop/server.bal.localKEY-descr.key /home/indeed/Desktop/server.bal.local.crt >> /etc/ssl/private/server.bal.local.pem' 

Генерация сертификатов с помощью openSSL

  1. Создайте контейнер для хранения ключей и сертификатов. Для этого выполните команду: sudo mkdir /etc/ssl/indeed-id.local
  2. Создайте секретный ключ и сохраните в файл (Рекомендуется использовать секретный ключ длиной 2048 бит). Для этого выполните команду: sudo openssl genrsa -out /etc/ssl/indeed-id.local/indeed-id.local.key 2048 .
  3. Создайте запрос на получение сертификата. Для этого выполните команду (В параметре key указывается файл с секретным ключом.): sudo openssl req -new -key /etc/ssl/indeed-id.local/indeed-id.local.key -out /etc/ssl/indeed-id.local/indeed-id.local.csr
    • Country Name -  Двух буквенный ISO-код страны (RU).
    • State or Province Name - Область или край, где официально зарегистрирована организация (Novgorod).
    • Locality Name - Город, где официально зарегистрирована организация (Novgorod).
    • Organization Name - Точное наименование организации (Indeed-Id).
    • Organizational Unit Name - Название отдела или подразделения (Support).
    • Common Name - Полное доменное имя для веб-сервера в формате FQDN (Fully Qualifed Domain Name) по которому будет доступен Haproxy (server.bal.local). 
    • Email Address - Заполнять не требуется.
    • A challenge password - Заполнять не требуется.
    • An optional company name - Заполнять не требуется.
  4. Подпишите созданный запрос на сертификат. Для этого выполните команду: sudo openssl x509 -req -days 365 -in /etc/ssl/indeed-id.local/indeed-id.local.csr -signkey /etc/ssl/indeed-id.local/indeed-id.local.key -out /etc/ssl/indeed-id.local/indeed-id.local.crt
    • Параметр req - Подписать запрос на сертификацию.
    • Параметр days 365 - Создаваемый сертификат будет действителен в течение 365 дней.
    • В Параметре in указывается файл с запросом.
    • signkey - указывается сгенерируемый ранее ключ.
    • В параметре out - Путь по которому будет сохранен файл с сертификатом.
  5. Объедините подписанный запрос и ключ  в один файл и сохраните в формате .pem. Для этого выполните команду (Команда cat выводит содержимое 2х файлов на экран, команда tee записывает выведенную информацию в файл): sudo cat /etc/ssl/indeed-id.local/indeed-id.local.crt /etc/ssl/indeed-id.local/indeed-id.local.key | sudo tee /etc/ssl/indeed-id.local/indeed-id.local.pem

Конвертация сертификата в формат pfx и экспорт сертификатов на клиентские машины

  1. Необходимо выполнить экспорт сертификата, созданного для Haproxy, в доверенные корневые центры сертификации на клиентские машины. Для этого выполните команду: openssl pkcs12 -export -out /etc/ssl/indeed-id.local/indeed-id.local.pfx -inkey /etc/ssl/indeed-id.local/indeed-id.local.key -in /etc/ssl/indeed-id.local/indeed-id.local.crt Укажите пароль для шифрования закрытого ключа.
  2. Добавьте полученный сертификат формата .pfx в доверенные корневые центры на клиентские машины. Для массового распространения сертификата рекомендуется использовать групповые политики.

Экспорт корневого сертификата УЦ

Требуется для того, чтобы сервер с Haproxy доверял серверам Indeed AM.

  1. Выполните экспорт корневого сертификата домена в формате .cer в кодировке Base-64.
  2. Скопируйте полученный сертификат на все машины с Haproxy в папу "/etc/ssl/CA". Если данной папке нет, требуется создать её.

Распространение сертификата через GPO.

Если сертификат будет добавлен вручную, то пропустите этот пункт.

  1. Создайте групповую политику, откройте "Доверенные корневые центры сертификации" Конфигурация компьютера -> Политики -> Конфигурация Windows -> Параметры безопасности -> Политики открытого ключа. Нажмите правую кнопку мыши и выберете "Импорт".
  2. Выберете загруженный файл сертификата в формате .pfx. Укажите пароль, который был задан при экспорте. Остальные настройки оставьте по умолчанию. 
  3. Выполните gpupdate /force на клиентский машинах, для обновления групповой политики.

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

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

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

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

  • setspn /s HTTP/EMC12 BAL\emc_service
  • setspn /s HTTP/EMC12.bal.local BAL\emc_service
  • setspn /s HTTP/server.bal.local BAL\emc_service
  • setspn /s HTTP/server BAL\emc_service

HTTP/EMC12 - Указывается метод и имя машины где установлена консоль EMC.

HTTP/EMC12.bal.local - Указывается метод и полное имя машины где установлена консоль EMC.

HTTP/server.bal.local - Указывается полное dns имя балансировщика.

HTTP/server - Указывается dns имя балансировщика.

BAL\emc_service - Указывается имя учетной записи, созданной для сервера EMC, в формате 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 и EMC.

  1. Откройте "Диспетчер служб IIS" и выберете пулы приложений. 
  2. Для пула IndeedEMC или IndeedEA в панели "Действия" выберете "Дополнительные параметры".
  3. В окне "Дополнительные параметры" измените параметр "Удостоверение". Для этого нажмите на значок "..." с право.                                           
  4. В окне "Удостоверение пула приложений" выберете "Особая учетная запись" и нажмите "Установить". Укажите в окне "Задание учетных данных" данные учетной записи для соответствующего сервера (Имя пользователя необходимо указывать в формате DOMAIN\USERNAME). Для сервера EMCemc_service, для сервера AMam_service.                                                                                                                                                       
  5. После изменений параметров для пула приложений IndeedEMC или IndeedEA, выполните перезагрузку пула. Для этого выберите пул IndeedEMC или IndeedEA и нажмите "Перезапуск..." в окне "Действия".
  6. Выберете приложение iidemc или easerver, в пункте "Управление" откройте "Редактор конфигурация".
  7. Откройте конфигурацию system.webServer/security/authentication/windowsAuthentication и измените параметр "useAppPoolCredentials" в "true". Нажмите "Применить".
  8. Проверьте провайдеры для Windows аутентификиации и их порядок. Для этого откройте приложение iidemc или easerver, в пункте "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)

Пример конфигурационного файла при использовании http ( config-haproxy-http.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 http
        option httplog
        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 http
		bind *:80
        default_backend backend_servers
backend backend_servers
		mode http
        balance roundrobin
		cookie indeedid_proxy insert indirect nocache
        server indeed1 AM-2-12.bal.local check inter 5000ms cookie indeed1
        server indeed2 AM12.bal.local check inter 5000ms cookie indeed2

Пример конфигурационного файла при использовании 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 tcp
        bind *:9000
		stats enable
        stats refresh 30s
        stats realm Haproxy\ Statistics.
        stats uri /haproxy_stats
        stats auth admin:admin
frontend am_server
		mode tcp
		bind *:443
        default_backend backend_servers
backend backend_servers
		mode tcp
        balance roundrobin
		server indeed1 AM-2-12.bal.local:443 check inter 5000ms
        server indeed2 AM12.bal.local:443 check inter 5000ms

Пример конфигурационного файла при использовании SSl Termination( config-haproxy-Term.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
	ca-base /etc/ssl/CA
defaults
        log global
        mode http
        option httplog
        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 http
	bind *:443 ssl crt /etc/ssl/private/server.bal.local.pem
	redirect scheme https code 301 if !{ ssl_fc } # redirect to https
        default_backend backend_servers
backend backend_servers
	mode http
        balance roundrobin
	cookie indeedid_proxy insert indirect nocache
        server indeed1 AM-2-12.bal.local:443 check inter 5000ms cookie indeed1 ssl verify required ca-file CA.cer
        server indeed2 AM12.bal.local:443 check inter 5000ms cookie indeed2 ssl verify required ca-file CA.cer
​

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

6. Проверьте работу сервиса перейдя по ссылке: 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 ):
    # 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 restar



Вложения 
 
 config-keepalived-backup.cfg (0.93 кБ)
 config-keepalived-base.cfg (0.93 кБ)
 config-haproxy-http.cfg (1.14 кБ)
 config-haproxy-Pass.cfg (1.06 кБ)
 config-haproxy-Term.cfg (1.35 кБ)
(1 голос(а))
Эта статья полезна
Эта статья бесполезна

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