Установка и настройка кластера Consul на Ubuntu
Consul (HashiCorp) — система обнаружения сервисов и service mesh: хранит реестр сервисов, отдаёт DNS/HTTP-интерфейс, следит за работоспособностью узлов и обеспечивает шифрование трафика. В этой инструкции соберём кластер из трёх нод на Ubuntu и настроим ACL.
Пример для Ubuntu 20.04/22.04/24.04 и Debian 11+. Актуальная версия Consul — 2.0.4 (сентябрь 2026).
Подготовка сервера
Действия выполняются на каждой ноде.
1. Пакеты
apt update
apt install unzip wget
2. Время
timedatectl set-timezone Europe/Moscow
apt install chrony
systemctl enable chrony
3. Имена серверов
Пусть ноды:
consul01.imaxis.local(192.168.0.15)consul02.imaxis.local(192.168.0.20)consul03.imaxis.local(192.168.0.25)
# сервер 1
hostnamectl set-hostname consul01.imaxis.local
# сервер 2
hostnamectl set-hostname consul02.imaxis.local
# сервер 3
hostnamectl set-hostname consul03.imaxis.local
vi /etc/hosts
192.168.0.15 consul01.imaxis.local consul01
192.168.0.20 consul02.imaxis.local consul02
192.168.0.25 consul03.imaxis.local consul03
ping consul01
ping consul02
ping consul03
4. Брандмауэр
iptables -I INPUT -p tcp --match multiport --dports 8300,8301,8302,8500,8600 -j ACCEPT
iptables -I INPUT -p udp --match multiport --dports 8301,8302,8600 -j ACCEPT
apt install iptables-persistent
netfilter-persistent save
Установка и запуск
Установка
Смотрим версию на странице загрузок (доступ из некоторых стран может быть заблокирован).
CONSUL_VER="2.0.4"
wget https://releases.hashicorp.com/consul/${CONSUL_VER}/consul_${CONSUL_VER}_linux_amd64.zip
unzip consul_*_linux_amd64.zip -d /usr/bin/
consul -v
Consul v2.0.4
Protocol 2 spoken by default, understands 2 to 3 ...
Настройка
useradd -r -c 'Consul DCS service' consul
mkdir -p /var/lib/consul /etc/consul.d
chown consul:consul /var/lib/consul /etc/consul.d
chmod 775 /var/lib/consul /etc/consul.d
Системная учётная запись consul, владелец каталогов.
Ключ шифрования генерируем на любой ноде:
consul keygen
wHFWVHTstpfh08ZflUs4FD2FAMueraoCN2LyqmeLxV0=
Переменные на всех нодах:
CONSUL_TOKEN=wHFWVHTstpfh08ZflUs4FD2FAMueraoCN2LyqmeLxV0=
CONSUL_SERVER1=consul01.imaxis.local
CONSUL_SERVER2=consul02.imaxis.local
CONSUL_SERVER3=consul03.imaxis.local
Создаём конфигурацию:
cat > /etc/consul.d/config.json <<EOF
{
"bind_addr": "0.0.0.0",
"bootstrap_expect": 3,
"client_addr": "0.0.0.0",
"datacenter": "dc1",
"node_name": "$(hostname)",
"data_dir": "/var/lib/consul",
"domain": "consul",
"enable_local_script_checks": true,
"dns_config": {
"enable_truncate": true,
"only_passing": true
},
"enable_syslog": true,
"encrypt": "${CONSUL_TOKEN}",
"leave_on_terminate": true,
"log_level": "INFO",
"rejoin_after_leave": true,
"retry_join": [
"${CONSUL_SERVER1}",
"${CONSUL_SERVER2}",
"${CONSUL_SERVER3}"
],
"server": true,
"start_join": [
"${CONSUL_SERVER1}",
"${CONSUL_SERVER2}",
"${CONSUL_SERVER3}"
],
"ui_config": { "enabled": true }
}
EOF
где:
bind_addr— адрес прослушивания (в примере — все интерфейсы);bootstrap_expect— ожидаемое число серверов для загрузки кластера;client_addr— адрес клиентских интерфейсов;datacenter— логический датацентр (серверы одного ДЦ должны быть в одной сети);node_name— имя ноды;data_dir— каталог данных;domain— домен регистрации сервисов;enable_local_script_checks— разрешить проверки сервисов на агенте;dns_config— параметры DNS;enable_syslog— логирование в syslog;encrypt— ключ шифрования трафика (одинаковый на всех нодах);leave_on_terminate— корректно отключать ноду при остановке;log_level—trace/debug/info/warn/err;rejoin_after_leave— авто-возврат ноды в кластер;retry_join— узлы для присоединения (повтор до успеха);server— режим сервера;start_join— узлы для присоединения при старте;ui_config— веб-интерфейс.
cat /etc/consul.d/config.json
consul validate /etc/consul.d
Configuration is valid!
При ошибке:
Config validation failed: No private IPv4 address found
Добавляем:
"advertise_addr": "1.2.3.4",
advertise_addr — адрес, объявляемый другим узлам; должен быть реальным адресом сервера.
Возможные предупреждения:
Node name ... will not be discoverable via DNS due to invalid characters— имя разрешается черезhosts, а не DNS;bootstrap_expect > 0: expecting 3 servers— не все участники настроены.
Юнит systemd:
vi /etc/systemd/system/consul.service
[Unit]
Description=Consul Service Discovery Agent
Documentation=https://www.consul.io/
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=consul
Group=consul
ExecStart=/usr/bin/consul agent -config-dir=/etc/consul.d
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul
[Install]
WantedBy=multi-user.target
Запуск и проверка
systemctl start consul
systemctl enable consul
systemctl status consul
Active: active (running) since ...
consul members
consul members -detailed
Веб-интерфейс: http://<IP-сервера>:8500.
Аутентификация (ACL)
Без ACL часть операций доступна анонимно, а часть — запрещена. Настроим токены.
Включение ACL
vi /etc/consul.d/config.json
Добавляем:
{
...
"ui_config": { "enabled": true },
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
После "ui_config": { "enabled": true } нужна запятая — синтаксис JSON строгий. default_policy: deny запрещает доступ без токена.
consul validate /etc/consul.d/config.json
systemctl restart consul
В веб-интерфейсе появится ссылка для входа.
Работа с токенами
consul acl bootstrap
При ошибке The ACL system is currently in legacy mode — настройка применена не на всех нодах.
AccessorID: af5eaac1-4f0b-d46a-58ba-64ec857dfc4c
SecretID: 59ac7fa8-dca6-e066-ff33-0bf9bb6f466a
Description: Bootstrap Token (Global Management)
Policies:
00000000-0000-0000-0000-000000000001 - global-management
SecretID — токен для входа в UI и работы из CLI.
export CONSUL_HTTP_TOKEN=59ac7fa8-dca6-e066-ff33-0bf9bb6f466a
consul acl token create -policy-name global-management
consul acl token list
consul acl token delete -id 54b5f2bb-1a57-3884-f0ea-1284f84186f5
Удаление — по AccessorID.
Политика для DNS
После включения ACL DNS-запросы перестают отвечать. Создаём политику:
cd /etc/consul.d/
vi dns-request-policy.txt
node_prefix "" {
policy = "read"
}
service_prefix "" {
policy = "read"
}
consul acl policy create -name "dns-requests" -rules @dns-request-policy.txt
consul acl token create -description "Token for DNS Requests" -policy-name dns-requests
AccessorID: b53741e2-7663-eag6-fd67-a64dbd32feb5
SecretID: 42bd65e5-42a5-356b-a81b-60eff20f657
Description: Token for DNS Requests
Policies:
89e42b6b-bbec-5263-bc7b-60f3a604a0d6 - dns-requests
SecretID — токен для DNS.
На всех нодах авторизуемся и применяем токен агента:
export CONSUL_HTTP_TOKEN=59ac7fa8-dca6-e066-ff33-0bf9bb6f466a
consul acl set-agent-token default 42bd65e5-42a5-356b-a81b-60eff20f657
Тонкости и подводные камни
- Версии Consul — 2.x (сентябрь 2026); API-команды из примеров 1.x совместимы, но сверяйтесь с changelog.
encryptодинаковый на всех нодах — иначе агенты не соединятся.bootstrap_expect— должно совпадать с числом серверов; при меньшем кластер не загрузится.advertise_addr— задавайте при нескольких интерфейсах, иначеNo private IPv4 address found.- JSON строгий — забытая запятая перед
aclломает конфиг. - ACL включается на всех нодах — иначе bootstrap вернёт
legacy mode. - DNS после ACL — обязательно создайте политику
dns-requestsи примените токен агента. enable_local_script_checks— проверки скриптами выполняются на агенте; в продакшене включайте осознанно.- UI без токена — при
default_policy: denyинтерфейс требуетSecretID.
Шпаргалка
CONSUL_VER="2.0.4"
wget https://releases.hashicorp.com/consul/${CONSUL_VER}/consul_${CONSUL_VER}_linux_amd64.zip
unzip consul_*_linux_amd64.zip -d /usr/bin/
useradd -r consul
mkdir -p /var/lib/consul /etc/consul.d && chown consul:consul /var/lib/consul /etc/consul.d
consul keygen # -> encrypt
# /etc/consul.d/config.json: server=true, bootstrap_expect=3, retry_join, ui_config
consul validate /etc/consul.d
systemctl enable consul --now
consul members
consul acl bootstrap
Проверено на: Ubuntu 20.04/22.04/24.04, Debian 11+ + Consul 2.0.4.
Дата: Сентябрь 2026.