Балансування навантаження за допомогою DNS з використанням інструменту Consul
Сьогодні поговоримо про балансування навантаження за допомогою 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
Реєстрація сервісів у Consul здійснюється шляхом додавання конфігураційних файлів для кожного сервісу. Файли містять інформацію про сервіс, включаючи його ім’я, порт і перевірки стану.
Приклад конфігурації для веб-сервісу
{
"service": {
"name": "web",
"tags": ["http"],
"port": 80,
"check": {
"http": "http://localhost:80/health",
"interval": "10s"
}
}
}
Такий конфіг реєструє сервіс з ім’ям web, який працює на порту 80, і задає перевірку стану, яка буде виконуватися кожні 10 секунд. Перевірка стану потрібна, щоб тільки здорові інстанси сервісу були доступні для DNS-запитів.
Consul автоматично створює DNS записи для кожного зареєстрованого сервісу.
Приклад DNS-запиту для сервісу “web”
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-адреси, але й порти, на яких працюють сервіси.
Інтеграція з зовнішніми балансувальниками навантаження
Інтеграція з NGINX
Одним з найбільш розповсюджених інструментів для балансування HTTP(S) трафіку є NGINX. У поєднанні з Consul, NGINX може динамічно налаштовувати свої конфігурації на основі даних про стан сервісів, наданих Consul.
Для інтеграції NGINX з Consul налаштовуємо NGINX на використання DNS-запитів до Consul для визначення доступних інстансів сервісів. Це можна досягти за допомогою спеціальних директив конфігурації NGINX. Наприклад, можна налаштувати upstream блок у конфігурації NGINX для використання DNS-імені, наданого Consul.
Приклад конфігурації NGINX
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
HAProxy також може бути інтегрований з Consul для динамічного управління пулом серверів. HAProxy підтримує інтеграцію з Consul через DNS-запити і може автоматично оновлювати свої конфігурації на основі змін у сервісах, зареєстрованих у Consul.
Приклад конфігурації HAProxy
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.
Висновок
Consul є потужним інструментом для балансування навантаження за допомогою DNS. Він дозволяє автоматично реєструвати сервіси, створювати DNS записи та інтегруватися з зовнішніми балансувальниками навантаження, такими як NGINX та HAProxy. Завдяки цьому ви можете забезпечити високу доступність та ефективне розподілення трафіку у вашій інфраструктурі.
Часті питання
1. Що таке Consul? Consul — це open-source інструмент від HashiCorp, який забезпечує сервіс-дискавері, перевірку стану сервісів, балансування навантаження та глобально розподілене сховище ключ-значення.
2. Як встановити Consul? Спочатку потрібно завантажити бінарний файл з сайту HashiCorp, розпакувати його та перемістити у системний каталог для виконання команд.
3. Як зареєструвати сервіс у Consul? Реєстрація сервісів у Consul здійснюється шляхом додавання конфігураційних файлів для кожного сервісу, які містять інформацію про сервіс, включаючи його ім’я, порт і перевірки стану.
4. Як інтегрувати Consul з NGINX? Для інтеграції NGINX з Consul потрібно налаштувати NGINX на використання DNS-запитів до Consul для визначення доступних інстансів сервісів.
5. Чи підтримує Consul інтеграцію з HAProxy? Так, HAProxy може бути інтегрований з Consul для динамічного управління пулом серверів через DNS-запити.