Привет, Хабр!
Сегодня поговорим о балансировке нагрузки по DNS с использованием инструмента — Consul. Сейчас в основном все приложения разбиваются на множество мелких сервисов, и поэтому часто нужно сделать так, чтобы трафик равномернно распределился и имел высокую доступность.
Consul — это open-source инструмент от HashiCorp, который обеспечивает сервис-дискавери, проверку состояния сервисов, балансировку нагрузки и глобально распределенное хранилище ключ-значение.
Установка и настройка
Сначала нужно скачать бинарный файл с сайта HashiCorp и распаковать его. После этого перемещаем бинарный файл в системный каталог, чтобы он был доступен для выполнения команд. Например, для Linux:
wget https://releases.hashicorp.com/consul/1.10.0/consul_1.10.0_linux_amd64.zip
unzip consul_1.10.0_linux_amd64.zip
sudo mv consul /usr/local/bin/
После установки настраиваем Consul агент. Конфигурация агента может быть выполнена через файл конфига в формате JSON или HCL.
Пример простой конфигурации агента:
{
"datacenter": "dc1",
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "consul-server",
"server": true,
"bootstrap_expect": 1,
"ui": true,
"bind_addr": "0.0.0.0",
"client_addr": "0.0.0.0"
}
Файл конфигурации определяет основные параметры работы Consul, такие как имя узла, режим работы (сервер или клиент), адрес для прослушивания и папка для хранения данных. После создания файла конфигурации можно запустить Consul командой consul agent -config-file=consul-config.json
.
Регистрация сервисов в Consul осуществляется путем добавления конфигурационных файлов для каждого сервиса. Файлы содержат информацию о сервисе, включая его имя, порт и проверки состояния.
Например, для регистрации веб-сервиса конфиг будет выглядеть так:
{
"service": {
"name": "web",
"tags": ["http"],
"port": 80,
"check": {
"http": "http://localhost:80/health",
"interval": "10s"
}
}
}
Такой конфиг регистрирует сервис с именем web, который работает на порту 80, и задает проверку состояния, которая будет выполняться каждые 10 секунд. Проверка состояния нужна чтобы только здоровые инстансы сервиса были доступны для DNS-запросов.
Consul автоматически создает DNS записи для каждого зарегистрированного сервиса.
Например, если есть сервис с именем "web", можно выполнить DNS-запрос следующей командой:
dig @127.0.0.1 -p 8600 web.service.consul
Запрос вернет все IP-адреса здоровых инстансов сервиса web. Consul поддерживает как A, так и SRV записи. A-записи возвращают IP-адреса инстансов, а SRV-записи включают информацию о портах. Пример SRV-запроса:
dig @127.0.0.1 -p 8600 web.service.consul SRV
С SRV записями можно получить не только IP-адреса, но и порты, на которых работают сервисы.
Интеграция с внешними балансировщиками нагрузки
Одним из наиболее распространенных инструментов для балансировки HTTP(S) трафика является NGINX. В сочетании с Consul, NGINX может динамически настраивать свои конфигурации на основе данных о состоянии сервисов, предоставляемых Consul
Для интеграции NGINX с Consul настраиваем NGINX на использование DNS-запросов к Consul для определения доступных инстансов сервисов. Этого можно достичь с помощью спец. директив конфигурации NGINX. Например, можно настроить upstream блок в конфигурации NGINX для использования DNS-имени, предоставляемого Consul. Пример конфигурации:
resolver 127.0.0.1 valid=5s;
upstream web {
zone web 64k;
server web.service.consul resolve;
}
server {
listen 80;
location / {
proxy_pass http://web;
health_check;
}
}
Директива resolver
указывает на DNS-ресолвер Consul, который работает на localhost. Директива upstream
определяет пул серверов с именем web
, который разрешается через DNS-запрос к Consul. Директива proxy_pass
указывает NGINX перенаправлять запросы к этому пулу серверов. Таким образом, каждый раз, когда NGINX обрабатывает запрос, он динамически разрешает DNS-имя web.service.consul
, получая список доступных инстансов сервиса.
HAProxy также может быть интегрирован с Consul для динамического управления пулом серверов. HAProxy поддерживает интеграцию с Consul через DNS-запросы и может автоматом обновлять свои конфигурации на основе изменений в сервисах, зарегистрированных в Consul.
Пример конфигурации HAProxy с Consul c директивами server-template
и resolvers
:
resolvers consul
nameserver dns1 127.0.0.1:8600
resolve_retries 3
timeout retry 1s
hold valid 10s
backend web-backend
balance roundrobin
server-template srv 1-3 _web._tcp.service.consul resolvers consul resolve-prefer ipv4
Блок resolvers
определяет настройки DNS-ресолвера Consul. Директива server-template
позволяет динамически создавать серверы в пуле web-backend
на основе данных, получаемых от Consul. Конфигурация позволяет HAProxy автоматом адаптироваться к изменениям в инфраструктуре, добавляя или удаляя серверы в зависимости от их состояния.
Кроме NGINX и HAProxy, Consul может быть интегрирован с F5 и Envoy.
Больше практических инструментов коллеги из OTUS разбирают в рамках профессиональных онлайн-курсов. Подробнее в каталоге.