Как настроить DNS балансировку с Consul

c1dc4c1355382c87e52a75a5b7f15868.png

Привет, Хабр!

Сегодня поговорим о балансировке нагрузки по 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 разбирают в рамках профессиональных онлайн-курсов. Подробнее в каталоге.

© Habrahabr.ru