В моем предыдущем сообщении в блоге я описал, как легко запустить балансировщик нагрузки с помощью tutum/haproxy
изображения. Однако в реальном случае использования требуется больше элементов управления поведением балансировщика нагрузки. Я собираюсь поговорить о некоторых продвинутых темах в этой статье, но перед тем как начать, я хотел бы представить концепцию «службы», которая служит базовым блоком сборки нашего балансировщика нагрузки tutum/haproxy
.
Сервис против Контейнера
Что такое сервис?
Служба — это группа контейнеров, которые работают с одинаковыми параметрами на одном и том же образе. Например, если вы запускаете docker run -d tutum/hello-world
3 раза, вы можете сказать, что 3 созданных контейнера принадлежат одной и той же службе.
Почему Сервис?
Концепция сервиса идеально соответствует функции балансировщика нагрузки — балансировщик нагрузки отправляет запросы тому же серверу приложений, который является контейнером приложений в мире докеров. Например, если мы свяжем сервис A (содержащий 3 контейнера) и сервис B (содержащий 2 контейнера) с балансировщиком нагрузки, балансировщик нагрузки будет балансировать трафик на 3 контейнерах при доступе к сервису A и на 2 контейнерах при доступе к сервису B соответственно ,
Как настроить сервисы?
- Как и в случае с
tutum/haproxy
, основным строительным блоком Tutum являются сервисы. Это означает, что если вы запускаете свое приложение с помощью Tutum, служба вашего приложения была изначально настроена Tutum. - Если вы работаете
tutum/haproxy
вне tutum, скажем, используя только docker, псевдоним ссылки вашего контейнера приложения имеет значение. Любой псевдоним ссылки имеет тот же префикс, за которым следует «-», и целое число считается из той же службы. Например,web-1
иweb-2
из службыweb
, ноweb1
иweb2
из двух разных службweb1
иweb2
.
Виртуальный хост и виртуальный путь
Виртуальный хост
Когда вы связываете несколько служб веб-приложений tutum/haproxy
, вы можете указать переменную среды VIRTUAL_HOST
в службах веб-приложений, чтобы при доступе к балансировщику нагрузки с другим именем хоста вы все равно могли получить доступ к различным службам. Вот пример:
docker run -d --name web1-1 -e VIRTUAL_HOST="www.example.com" <your_app_1>
docker run -d --name web1-2 -e VIRTUAL_HOST="www.example.com" <your_app_1>
docker run -d --name web2 -e VIRTUAL_HOST="app.example.com" <your_app_2>
docker run -d --link web1-1:web1-1 --link web1-2:web1-2 --link web2:web2 -p 80:80 tutum/haproxy
Когда вы получаете доступ http://www.example.com
, tutum/haproxy
вы переводите ваше первое приложение на балансировку в двух экземплярах, а когда вы получаете доступ app.example.com
, вы переходите во второе веб-приложение.
Виртуальный путь
Помимо доменного имени, вы также можете указать haproxy, чтобы он выбирал службы на основе пути к URL, к которому вы обращаетесь. Например, если для вашего приложения установлено значение -e 'VIRTUAL_HOST=*/static/, */static/*
, все URL-адреса, с которых начинается путь static
, перейдут в этот сервис. Точно так же, если вы укажете -e 'VIRTUAL_HOST=*/*.php
, все запросы на URL-адрес, который заканчивается, .php
будут направлены в вашу службу приложений php.
Для получения дополнительной информации об использовании VIRTUAL_HOST
, пожалуйста, смотрите Github: tutum / haproxy .
Сродство и сессионная липкость
Есть три переменных окружения , которые можно использовать , чтобы установить сродство и сеанс липкость в ваших прикладных услугах: BALANCE
, APPSESSION
а COOKIE
:
- Set
BALANCE=source
. Когда он установлен, HAProxy будет хэшировать IP-адрес посетителя. Это гарантирует, что посетитель с тем же IP-адресом всегда может быть отправлен в один и тот же контейнер приложения. Работает как дляtcp
режима, так и дляhttp
режима. - Set
APPSESSION=<appsession>
. HAProxy использует сеанс приложения, чтобы определить, к какому контейнеру приложения должен быть направлен посетитель. Работает только дляhttp
режима. Возможное значение<appsession>
может бытьJSESSIONID len 52 timeout 3h
. - Set
COOKIE=<cookie>
. Подобно appsession, он использует куки-файлы, чтобы определить, к какому контейнеру приложения должен подключиться посетитель. Возможное значение<cookie>
может бытьSRV insert indirect nocache
.
Проверьте HAProxy: appsession и HAProxy: cookie для получения дополнительной информации.
Прекращение нескольких сертификатов SSL
Как уже упоминалось в предыдущей статье, вы можете активировать завершение SSL, просто добавив SSL_CERT
в tutum/haproxy
. Но во многих случаях у вас может быть несколько сертификатов SSL, связанных с разными доменами. Например, у вас есть сертификат A с общим именем prod.example.com
и сертификат B с staging.example.com
. Вы ожидаете, что когда пользователь получает доступ prod.example.com
, HAProxy завершает SSL с сертификатом A, а SSL staging.example.com
завершается с сертификатом B. Чтобы достичь этого, вам нужно только установить две переменные среды SSL_CERT
и VIRTUAL_HOST
параметры в службах приложений:
docker run -d --name prod -e SSL_CERT="<cert_A>" -e VIRTUAL_HOST="https://prod.example.com" <prod_app>
docker run -d --name staging -e SSL_CERT="<cert_B>" -e VIRTUAL_HOST="https://staging.example.com" <staging_app>
docker run -d --link prod:prod --link staging:staging -p 443:443 tutum/haproxy
Балансировка загрузки TCP
tutum/haproxy
http
по умолчанию работает в режиме, но также имеет возможность балансировки нагрузки TCP-соединений с помощью переменных среды, TCP_PORTS
установленных в службе приложения. Ниже приведен пример:
docker run -d --name web -e VIRTUAL_HOST=www.example.com --expose 80 <web_app>
docker run -d --name git -e VIRTUAL_HOST="https://git.example.com" -e SSL_CERT="<cert>" -e TCP_PORTS=22 --expose 443 --expose 22 <git_app>
docker run -d --link web:web --link git:git -p 443:443 -p 22:22 -p 80:80 tutum/haproxy
В приведенном выше примере, когда вы заходите http://www.example.com
, вы посещаете свой <web_app>
; при доступе https://git.example.com
вы перейдете <git_app>
с SSL-терминацией. Кроме того, порт 22 доступен по TCP-соединению.
tutum/haproxy
также поддерживает SSL-терминацию по TCP. Чтобы включить его, вместо настройки TCP_PORTS=22
просто установите TCP_PORTS=22/ssl
вместе с SSL_CERT
.
Резюме
В приведенных выше разделах мы представили несколько основных примеров расширенных функций tutum/haproxy
. Использование этих функций в сочетании друг с другом может быть очень мощным.