Установка агента Consul и примеры регистрации сервисов

Thank you for reading this post, don't forget to subscribe!

Уста­нов­лен­ный агент Consul поз­во­ля­ет обме­ни­вать­ся инфор­ма­ци­ей с кла­сте­ром, отправ­ляя состо­я­ние рабо­ты сер­ви­сов, кото­рые запу­ще­ны на узле. Мы рас­смот­рим про­цесс уста­нов­ки аген­та на ком­пью­тер под управ­ле­ни­ем Linux на базе Deb (Ubuntu, Debian) или RPM (Rocky Linux, CentOS). Так­же мы при­ве­дем при­ме­ры реги­стра­ции и настрой­ки про­вер­ки сервисов.

Подготовка системы

Пред­ва­ри­тель­но, необ­хо­ди­мо настро­ить бранд­мау­эр. Откры­ва­ем пор­ты 8300,8301,8302,8500. В зави­си­мо­сти от систе­мы управ­ле­ния netfilter, коман­ды будут отличаться.

а) iptables (как пра­ви­ло для систем на базе deb):

iptables -I INPUT -p tcp --match multiport --dports 8300,8301,8302,8500 -j ACCEPT

iptables -I INPUT -p udp --match multiport --dports 8301,8302 -j ACCEPT

Для сохра­не­ния пра­вил исполь­зу­ем один из мето­дов, пред­ло­жен­ных в дан­ной инструк­ции.

б) firewalld (чаще для RPM-based):

firewall-cmd --permanent --add-port={8300,8500}/tcp

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

firewall-cmd --reload

Установка агента

На раз­лич­ные систе­мы агент уста­нав­ли­ва­ет­ся, почти, одинаково.

Для нача­ла, уста­но­вим допол­ни­тель­ные пакеты:

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

Для это­го, как раз, исполь­зу­ют­ся раз­ные коман­ды (в зави­си­мо­сти от опе­ра­ци­он­ной системы).

а) Для Deb:

apt install wget unzip

б) Для RPM:

yum install wget unzip

Теперь мож­но при­сту­пать к уста­нов­ке консула.

На стра­ни­це со спис­ком рели­зов необ­хо­ди­мо посмот­реть на все вер­сии и выбрать необ­хо­ди­мую. Так­же мы можем посмот­реть вер­сию consul на сервере:

consul -v

… и уста­но­вить такую же.

Так или ина­че, созда­ем пере­мен­ную с номе­ром версии:

export VER="1.10.2"

И ска­чи­ва­ем архив с бинар­ным файлом:

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

Рас­па­ко­вы­ва­ем его в ката­лог /usr/bin:

unzip consul_${VER}_linux_amd64.zip -d /usr/bin

Про­ве­ря­ем, что коман­ды кон­сул выполняются:

consul -v

Мы долж­ны уви­деть вер­сию программы:

Consul v1.10.2

Агент уста­нов­лен.

Настройка и запуск агента

Настро­им запуск аген­та в каче­стве сер­ви­са. Для это­го мы созда­дим юнит в systemd.

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

useradd -r -c 'Consul Agent' consul

* в дан­ном при­ме­ре мы созда­дим систем­ную (-r) учет­ную запись consul. Для удоб­ства вос­при­я­тия мы так­же доба­вим ком­мен­та­рий (-c).

Созда­ем ката­ло­ги для при­ло­же­ния консул:

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. Пра­ва будут пол­ные у вла­дель­ца, осталь­ные смо­гут читать данные.

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

vi /etc/consul.d/config.json

* где:

  • server — ука­зы­ва­ет на исполь­зо­ва­ние сер­вер­но­го режи­ма. При зна­че­нии false исполь­зу­ет­ся режим клиента.
  • datacenter — дата­центр, к кото­ро­му будет при­со­еди­нять­ся участ­ник кла­сте­ра. dc1 — дата­центр по умолчанию.
  • node_name — имя, кото­рым будет пред­став­лен узел в кластере.
  • data_dir — ката­лог на ком­пью­те­ре, кото­рый будет исполь­зо­вать­ся кон­су­лом для хра­не­ния сво­ей информации.
  • bind_addr — IP-адрес, на кото­ром будет слу­шать сервис.
  • client_addr — адрес, к кото­ро­му будут при­вя­за­ны кли­ент­ские интер­фей­сы. На прак­ти­ке, были про­бле­мы при ука­за­нии несколь­ких адре­сов. Про­бле­ма не наблю­да­ет­ся при исполь­зо­ва­нии 127.0.0.1 для client_addr и внеш­не­го сете­во­го адре­са для bind_addr.
  • retry_join — спи­сок сер­ве­ров кон­су­ла, к кото­рым дол­жен при­со­еди­нить­ся агент.
  • encrypt — ключ, кото­рый был сфор­ми­ро­ван для сер­ве­ров кон­сул и исполь­зу­ет­ся в каче­стве зна­че­ния пара­мет­ра encrypt (его мож­но посмот­реть в кон­фи­гу­ра­ци­он­ном фай­ле на сер­ве­ре consul).
  • log_level — уро­вень логи­ро­ва­ния. Воз­мож­ны вари­ан­ты trace, debug, info, warn, err. По умол­ча­нию исполь­зу­ет­ся info.
  • enable_syslog — вести ли систем­ный лог.
  • disable_compat_1.9 — запре­ща­ет все мет­ри­ки, кото­рые объ­яв­ле­ны уста­рев­ши­ми, начи­ная с вер­сии 1.9.

Про­ве­ря­ем кор­рект­ность настройки:

consul validate /etc/consul.d/

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

Configuration is valid!

Про­дол­жа­ем. Созда­ем юнит в systemd:

vi /etc/systemd/system/consul.service

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

systemctl daemon-reload

Раз­ре­ша­ем авто­за­пуск сер­ви­са, стар­ту­ем его и про­ве­ря­ем статус:

systemctl enable consul

systemctl start consul

systemctl status consul

На любом из узлов кла­сте­ра выполним:

consul members

Сре­ди чле­нов кла­сте­ра мы долж­ны уви­деть свой ком­пью­тер, например:


agent01                 192.168.0.100:8301  alive   client  1.10.2  2         dc1  <default>

С аген­том завершили.

Использование ACL

Выше мы рас­смот­ре­ли базо­вый спо­соб при­со­еди­не­ния аген­та к кла­сте­ру. Одна­ко, если мы вклю­чи­ли про­вер­ку под­лин­но­сти на сто­роне сер­ве­ра, необ­хо­ди­мо создать поли­ти­ку для аген­тов и сде­лать соот­вет­ству­ю­щие настрой­ки на кли­ент­ских нодах.

На сер­ве­ре пере­хо­дим в ката­лог с кон­фи­гу­ра­ци­я­ми кон­су­ла и созда­ем файл с политикой:

cd /etc/consul.d

vi agent-policy.txt

* это при­мер поли­ти­ки, кото­рой слиш­ком мно­го поз­во­ле­но. Для уве­ли­че­ния без­опас­но­сти, мы можем огра­ни­чить­ся пере­чис­ле­ни­ем кон­крет­ных зна­че­ний. Напри­мер, service "web" для воз­мож­но­сти реги­стри­ро­вать сер­ви­сы, назва­ния кото­рых начи­на­ют­ся на web.

Созда­ем поли­ти­ку agent на осно­ве фай­ла agent-policy.txt:

consul acl policy create -name "agent" -rules @agent-policy.txt

И после, созда­ем токен на осно­ве поли­ти­ки agent:

consul acl token create -description "Token for Agent" -policy-name agent

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

Нам нуж­но зна­че­ние поля SecretID — это токен, кото­рый мы будем исполь­зо­вать на агенте.

Пере­хо­дим на кли­ент­скую ноду и откры­ва­ем наш кон­фи­гу­ра­ци­он­ный файл:

vi /etc/consul.d/config.json

Допи­шем:

<token> — это сфор­ми­ро­ван­ный на сер­ве­ре токен.

Пере­за­гру­жа­ем кон­сул на агенте:

systemctl restart consul

Регистрация сервисов

Рас­смот­рим общий прин­цип реги­стра­ции сер­ви­са в консуле.

Для каж­до­го сер­ви­са мож­но созда­вать свой кон­фи­гу­ра­ци­он­ный файл (или писать все в одном). Поша­го­во, необходимо:

  1. Доба­вить настрой­ку в консул.
  2. Про­ве­рить кон­фи­гу­ра­цию и пере­за­пу­стить сер­вис consul.
  3. Про­ве­рить регистрацию.
  4. Настро­ить про­вер­ку состояния.

Син­так­сис для кон­фи­гу­ра­ции при реги­стра­ции сер­ви­са следующий:

Что­бы настрой­ка при­ме­ни­лась, пере­за­гру­жа­ем консул.

Про­ве­рить, что сер­вис заре­ги­стри­ро­вал­ся мож­но в веб-пане­ли. Так­же мы можем опро­сить сер­вис в DNS:

nslookup -port=8600 <тег>.<имя сервиса>.service.<датацентр>.<домен> <IP-адрес сер­ве­ра консул>

или:

dig @<IP-адрес сер­ве­ра кон­сул> -p 8600 <тег>.<имя сервиса>.service.<датацентр>.<домен>

* в бое­вой сре­де сто­ит настро­ить пере­на­прав­ле­ние запро­сов для доме­на кон­су­ла (по умол­ча­нию, consul) на сер­ве­ры кон­су­ла. Так­же для кор­рект­ной рабо­ты мно­гих при­ло­же­ний необ­хо­ди­мо сде­лать так, что­бы кон­сул отве­чал на DNS-запро­сы по пор­ту 53 — для это­го мож­но исполь­зо­вать dnsmasq.

Более кон­крет­но, мы рас­смот­рим настрой­ки в примерах.

Для про­вер­ки состо­я­ния наше­го сер­ви­са исполь­зу­ет­ся кон­фи­гу­ра­ция сле­ду­ю­ще­го вида:

* это все­го лишь при­мер. Кон­фи­гу­ра­ция для выпол­не­ния про­ве­рок может исполь­зо­вать раз­ные под­хо­ды. Подроб­нее, мож­но почи­тать в инструк­ции Consul. Health-check на сай­те influunt.ru или Checks на офи­ци­аль­ном сай­те консула.

Что­бы настро­ить про­вер­ку сер­ви­са, мы добав­ля­ем опцию check и пере­да­ем в каче­стве аргу­мен­тов опции проверки.

Но что­бы это рабо­та­ло, в кон­фи­гу­ра­ци­он­ном фай­ле кон­су­ла нуж­но доба­вить две строки:

Перей­дем к конкретике.

Примеры регистрации сервисов

По мере необ­хо­ди­мо­сти, я буду добав­лять новые примеры.

0,Включение возможности делать проверку

Пред­ва­ри­тель­но, раз­ре­ша­ем выпол­не­ние про­ве­рок. Для это­го откры­ва­ем наш кон­фи­гу­ра­ци­он­ный файл консула:

vi /etc/consul.d/config.json

Доба­вим в него:

Обра­ти­те вни­ма­ние, что каж­дая стро­ка долж­на закан­чи­вать­ся запя­той. Но послед­няя стро­ка логи­че­ской настрой­ки не долж­на закан­чи­вать­ся запя­той, в про­тив­ном слу­чае, будет ошиб­ка. Таким обра­зом, когда мы допи­сы­ва­ем кон­фи­гу­ра­цию, вни­ма­тель­но обра­ща­ем вни­ма­ние на запятые.

Про­ве­ря­ем кон­фи­гу­ра­ци­он­ный файл и пере­за­пус­ка­ем консул:

consul validate /etc/consul.d/

systemctl restart consul

1. HTTP (веб)

Созда­ем конфигурацию:

vi /etc/consul.d/web.json

Про­ве­ря­ем кон­фи­гу­ра­ци­он­ный файл:

consul validate /etc/consul.d/

Если мы увидим:

Configuration is valid!

… то с кон­фи­гу­ра­ци­он­ным фай­лом все хоро­шо — мож­но продолжать.

При­ме­ня­ем настройки:

systemctl restart consul

В пане­ли управ­ле­ния дол­жен появить­ся наш сервис:

Так­же dns-запрос:

nslookup -port=8600 web.service.dc1.consul 192.168.0.15

или:

nslookup -port=8600 front.web.service.dc1.consul 192.168.0.15

… дол­жен вер­нуть IP-адрес наше­го сер­ве­ра с аген­том, например:

Non-authoritative answer:
Name:    web.service.dc1.consul
Address: 192.168.0.100

2. Java (http)

Дан­ный при­мер не силь­но отли­ча­ет­ся от преды­ду­ще­го — про­слу­ши­вать будем дру­гой порт. Но мы в каче­стве про­вер­ки сер­ви­са будем исполь­зо­вать метод http.

Созда­ем конфигурацию:

vi /etc/consul.d/java.json

Про­ве­ря­ем кон­фи­гу­ра­ци­он­ный файл:

consul validate /etc/consul.d/

При­ме­ня­ем настройки:

systemctl restart consul

3. KeyDB (Redis)

KeyDB и Redis явля­ют­ся доволь­но попу­ляр­ны­ми база­ми рези­дент­ско­го типа. Рас­смот­рим на при­ме­ре пер­вой про­цесс реги­стра­ции сер­ви­са в Consul и про­вер­ки состо­я­ния, кото­рое мы будем про­ве­рять с помо­щью скрипта.

Созда­ем конфигурацию:

vi /etc/consul.d/keydb.json

Про­ве­ря­ем кон­фи­гу­ра­ци­он­ный файл:

consul validate /etc/consul.d/

Созда­ем скрипт для про­вер­ки состо­я­ния базы:

mkdir /scripts

vi /scripts/keydb_check.sh

Раз­ре­шим его запуск на исполнение:

chmod +x /scripts/keydb_check.sh

При­ме­ня­ем настройки:

systemctl restart consul

Вывод из эксплуатации членов кластера

Рас­смот­рим про­цесс уда­ле­ние сер­ви­сов и нод кластера.

Снятие с регистрации сервисов

Спи­сок заре­ги­стри­ро­ван­ных сер­ви­сов мож­но полу­чить командой:

consul catalog services

Уда­ля­ем сервис:

consul services deregister -id='web'

* где web — имя наше­го сер­ви­са, кото­рый необ­хо­ди­мо снять с регистрации.

Удаление нод

На аген­те вводим:

consul leave

Если нам нуж­но фор­си­ро­ван­но уда­лить ноду, то с любо­го участ­ни­ка, где мож­но управ­лять кла­сте­ром, вводим:

consul force-leave agent01

Возможные ошибки

При настрой­ке аген­та мы можем столк­нуть­ся с раз­лич­ны­ми про­бле­ма­ми. Для их реше­ния нам может помочь команда:

consul monitor

Так­же рас­смот­рим те, с кото­ры­ми столк­нул­ся я.

No installed keys could decryp

Ошиб­ка воз­ни­ка­ем при попыт­ке под­клю­чить узел к кла­сте­ру. В ито­ге мы не обна­ру­жи­ва­ем его сре­ди участ­ни­ков (когда смот­рим коман­дой consul members). При этом мы видим в логах ошибку

… No installed keys could decryp

При­чи­на: мы ука­за­ли невер­ное зна­че­ние для пара­мет­ра encrypt.

Реше­ние: состо­ит из двух шагов — про­вер­ки зна­че­ния encrypt и уда­ле­ние вре­мен­но­го фай­ла, где хра­нит­ся его значение.

Для нача­ла смот­рим на сер­ве­ре кон­фи­гу­ра­ци­он­ный файл и нахо­дим в нем зна­че­ние для опции encrypt. Точ­но такое же зна­че­ние долж­но быть и на клиенте.

Одна­ко, это­го недо­ста­точ­но, так как после пер­во­го запус­ка был создан файл local.keyring, в кото­ром хра­нит­ся непра­виль­ное зна­че­ние. Про­сто уда­ля­ем его:

rm -f /var/lib/consul/serf/local.keyring

* где /var/lib/consul — путь, кото­рый мы ука­за­ли в кон­фи­гу­ра­ци­он­но фай­ле агента.

Пере­за­гру­жа­ем кон­сул на агенте:

systemctl restart consul

Coordinate update blocked by ACLs

Ошиб­ка появ­ля­ет­ся при под­клю­че­нии аген­та к кластеру.

При­чи­на: на сер­ве­ре вклю­чен ACL и тре­бу­ет­ся допол­ни­тель­ная аутентификация.

Реше­ние: на кли­ен­те вклю­ча­ем ACL, а на сер­ве­ре созда­ем токен. Подроб­нее про­це­ду­ра опи­са­на выше.