2026-09-18

Установка и настройка кластера 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. Имена серверов

Пусть ноды:

  1. consul01.imaxis.local (192.168.0.15)
  2. consul02.imaxis.local (192.168.0.20)
  3. 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_leveltrace/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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *