Categories: Шпаргалки

Установка и настройка кластера Consul Hashicorp на CentOS или Rocky Linux

Используемые термины: Consul , CentOS .

В данной инструкции мы рассмотрим установку и настройку кластера системы обнаружения сервисов Consul. Данный кластер будет состоять из трех нод, каждая из которых будет под управлением операционной системы Rocky Linux или CentOS версий 7 / 8.

Подготовка сервера

Выполним предварительные операции по настройке наших серверов.

1. Установка дополнительных пакетов

Выполняем команду:

yum install unzip wget

* где:

  • unzip — необходим для распаковки архивов.
  • wget — утилита для загрузки файлов по сети.

2. Настраиваем время

Задаем часовой пояс:

timedatectl set-timezone Europe/Moscow

* в данном примере мы задаем московское время. Полный перечень возможных вариантов можно получить командой: timedatectl list-timezones .

Устанавливаем утилиту для синхронизации времени:

yum install chrony

Запускаем ее в качестве сервиса:

systemctl enable chronyd —now

3. Настройка имени серверов

Для сервера консул важно, чтобы серверы были доступны по именам. Для начала настроим последние:

hostnamectl set-hostname consul01.remontka.local

hostnamectl set-hostname consul02.remontka.local

hostnamectl set-hostname consul03.remontka.local

* предполагается, что нашим трем серверам будут заданы имена consul01 , consul02 и consul03 . Они будут в домене remontka.local .

Чтобы серверы могли обращаться друг к другу по именам, мы должны либо зарегистрировать их в локальной системе DNS, либо добавить на каждом сервере записи в файл hosts:

vi /etc/hosts

192.168.0.15 consul01.remontka.local
192.168.0.20 consul02.remontka.local
192.168.0.25 consul03.remontka.local

4. Настройка безопасности

Открываем порты в брандмауэре:

firewall-cmd —add-port={8300,8301,8302,8500,8600}/tcp —permanent

firewall-cmd —add-port={8301,8302,8600}/udp —permanent

firewall-cmd —reload

* подробное описание портов есть на странице Что такое Consul .

Установка и запуск Consul

Выполним установку компонентов, сборку кластера и его запуск.

Установка

Установка будет выполнена путем копирования бинарного файла. Для начала перейдем на страницу загрузки программного продукта и посмотрим его последнюю версию.

После подставим нужную версию в переменную:

export VER=»1.10.2″

* в моем примере будет устанавливаться версия 1.10.2.

После загружаем архив с бинарником:

wget https://releases.hashicorp.com/consul/${VER}/consul_${VER}_linux_amd64.zip

И распаковываем его:

unzip consul_${VER}_linux_amd64.zip

Копируем полученных бинарник в каталог /usr/bin:

mv consul /usr/bin/

Проверяем, что приложение может запускаться в наших системах:

consul -v

Мы должны увидеть что-то на подобие:

Consul v1.10.2
Revision 3cb6eeedb
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

Можно переходить к настройке.

Настройка

Создаем учетную запись, от которой будет работать консул:

useradd -r -c ‘Consul DCS service’ consul

* в данном примере мы создадим учетную запись 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

zpjf5a4reDbJFpT6FeaF0LGxD0zBRPSRbIoUkLBt0ps=

Полученный ключ сохраняем. Его мы будем использовать при настройке всех узлов кластера.

Создаем конфигурационный файл для консула:

vi /etc/consul.d/config.json

{
«bind_addr»: «0.0.0.0»,
«bootstrap_expect»: 3,
«client_addr»: «0.0.0.0»,
«datacenter»: «dc1»,
«data_dir»: «/var/lib/consul»,
«domain»: «consul»,
«enable_script_checks»: true,
«dns_config»: {
«enable_truncate»: true,
«only_passing»: true
},
«enable_syslog»: true,
«encrypt»: «zpjf5a4reDbJFpT6FeaF0LGxD0zBRPSRbIoUkLBt0ps=»,
«leave_on_terminate»: true,
«log_level»: «INFO»,
«rejoin_after_leave»: true,
«retry_join»: [
«consul01.remontka.local»,
«consul02.remontka.local»,
«consul03.remontka.local»
],
«server»: true,
«start_join»: [
«consul01.remontka.local»,
«consul02.remontka.local»,
«consul03.remontka.local»
],
«ui_config»: { «enabled»: true }
}

* где:

  • bind_addr — адрес, на котором будет слушать наш сервер консул. Это может быть IP любого из наших сетевых интерфейсов или, как в данном примере, все.
  • bootstrap_expect — ожидаемое количество серверов в кластере.
  • client_addr — адрес, к которому будут привязаны клиентские интерфейсы.
  • datacenter — привязка сервера к конкретному датацентру. Нужен для логического разделения. Серверы с одинаковым датацентром должны находиться в одной локальной сети.
  • data_dir — каталог для хранения данных.
  • domain — домен, в котором будет зарегистрирован сервис.
  • enable_script_checks — разрешает на агенте проверку работоспособности.
  • dns_config — параметры для настройки DNS.
  • enable_syslog — разрешение на ведение лога.
  • encrypt — ключ для шифрования сетевого трафика. В качестве значения используем сгенерированный ранее.
  • leave_on_terminate — при получении сигнала на остановку процесса консула, корректно отключать ноду от кластера.
  • log_level — минимальный уровень события для отображения в логе. Возможны варианты «trace», «debug», «info», «warn», and «err».
  • rejoin_after_leave — по умолчанию, нода покидающая кластер не присоединяется к нему автоматически. Данная опция позволяет управлять данным поведением.
  • retry_join — перечисляем узлы, к которым можно присоединять кластер. Процесс будет повторяться, пока не завершиться успешно.
  • server — режим работы сервера.
  • start_join — список узлов кластера, к которым пробуем присоединиться при загрузке сервера.
  • ui_config — конфигурация для графического веб-интерфейса.

Проверяем корректность конфигурационного файла:

consul validate /etc/consul.d/config.json

Мы должны увидеть:


Configuration is valid!

В завершение настройки создадим юнит в 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
-node=consul01.remontka.local
-config-dir=/etc/consul.d
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul

[Install]
WantedBy=multi-user.target

Обратите внимание, что в данном примере указан сервер consul01.remontka.local . Мы должны заменить это значение для каждого из настраиваемых серверов. Таким образом, у нас будет три файла с разными значениями для опции node .

Перечитываем конфигурацию systemd:

systemctl daemon-reload

Система установлена, настроена и готова к запуску.

Запуск и проверка

Стартуем наш сервис:

systemctl start consul

Также разрешаем автоматический старт при запуске сервера:

systemctl enable consul

Смотрим текущее состояние работы сервиса:

systemctl status consul

Мы должны увидеть состояние:


Active: active (running) since …

Состояние нод кластера мы можем посмотреть командой:

consul members

А данной командой можно увидеть дополнительную информацию:

consul members -detailed

Также у нас должен быть доступен веб-интерфейс по адресу:
http://<IP-адрес любого сервера консул>:8500 . Перейдя по нему, мы должны увидеть страницу со статусом нашего кластера.

Аутентификация

При входе на веб-интерфейс или работе из командной строки, мы заметим, что система позволяет выполнять операции без запроса идентификационных данных. Если нам нужно обезопасить систему, настроим 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. Наша добавленная настройка acl запрещает по умолчанию доступ и требует ввода токена безопасности.

Проверяем корректность внесенных настроек:

consul validate /etc/consul.d/config.json

Если ошибок нет, то перезапускаем сервис:

systemctl restart consul

Заходим на веб-интерфейс — мы обнаружим, что в правом верхнем углу появилась ссылка для входа в систему:

Мы идем в правильном направлении.

Получение мастер-токена (Bootstrap Token)

Первый токен, который мы создаем, является Bootstrap Token (Global Management). Его рекомендуется использовать только для генерирования других токенов и получения максимальных привилегий, когда это необходимо.

Для создания первого токена вводим команду:

consul acl bootstrap

* если она вернула ошибку Failed ACL bootstrapping: Unexpected response code: 500 (The ACL system is currently in legacy mode.) , то значит, что мы не на всех нодах применили новую настройку (включили ACL). Проверяем, на всех ли серверах кластера внесены соответствующие изменения по добавлению ACL.

Мы получим ответ на подобие:

AccessorID: af5eaac1-4f0b-d46a-58ba-64ec857dfc4c
SecretID: 59ac7fa8-dca6-e066-ff33-0bf9bb6f466a
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2021-09-01 16:28:58.710545082 +0300 MSK
Policies:
00000000-0000-0000-0000-000000000001 — global-management

В данном примере 59ac7fa8-dca6-e066-ff33-0bf9bb6f466a — нужный нам для аутентификации SecretID. Возвращаемся в веб-интерфейсу и пробуем войти в систему с использованием данного кода.

Если нам нужно удалить данный токен, вводим команду:

Для работы из командной строки также необходимо авторизоваться. Для этого создаем переменную в системном окружении:

export CONSUL_HTTP_TOKEN=59ac7fa8-dca6-e066-ff33-0bf9bb6f466a

* где 59ac7fa8-dca6-e066-ff33-0bf9bb6f466a , полученный нами SecretID .

Создать новый токен можно командой:

consul acl token create -policy-name global-management

Чтобы увидеть список токенов, вводим:

consul acl token list

Если нам понадобиться удалить токен, мы должны использовать его AccessorID :

consul acl token delete -id 54b5f2bb-1a57-3884-f0ea-1284f84186f5

* где будет удален токен с AccessorID 54b5f2bb-1a57-3884-f0ea-1284f84186f5.

Настройка политики для 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
Local: false
Create Time: 2021-09-02 12:37:42.342511655 +0300 MSK
Policies:
89e42b6b-bbec-5263-bc7b-60f3a604a0d6 — dns-requests

* где SecretID — это нужный нам токен.

На всех компьютерах с consul авторизовываемся:

export CONSUL_HTTP_TOKEN=59ac7fa8-dca6-e066-ff33-0bf9bb6f466a

* где 59ac7fa8-dca6-e066-ff33-0bf9bb6f466a — ранее созданный токен для получения доступа к управлению консулом.

И вводим:

consul acl set-agent-token default 42bd65e5-42a5-356b-a81b-60eff20f657

* где 42bd65e5-42a5-356b-a81b-60eff20f657 — тот SecretID, который мы получили на основе политики, разрешающей запросы DNS.

Дополнительные команды

Рассмотрим несколько полезных команд для работы с консулом. Обратите внимание, что некоторые команды требуют повышенных привилегий. Нам необходимо будет получить авторизацию в командной строке. Об этом написано в разделе выше . В противном случае, мы можем получить ошибку:

Unexpected response code: 403 (rpc error making call: Permission denied)

Лидер

Простой http-запрос, который поможет увидеть лидера:

curl http://localhost:8500/v1/status/leader

Raft и лидер

Получить информацию о работе raft и текущем лидере можно командой:

consul operator raft list-peers

Начиная с consul версии 1.15 мы можем перенести роль лидера на другую ноду. Для этого выполняем команду:

consul operator raft transfer-leader -id=»server id»

admin

Recent Posts

Что такое Zulip

Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…

2 месяца ago

Что такое Zookeeper

Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…

2 месяца ago

Что такое Zimbra

Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…

2 месяца ago

Что такое Zabbix

Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…

2 месяца ago

Что такое YouTube

YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…

2 месяца ago

Что такое yota

Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…

2 месяца ago