Настройка Consul в среде производства на сервере Ubuntu 14.04

Consul – это распределенная, высокодоступная система обнаружения и конфигурирования сервисов. Consul может представить сервисы и ноды в гибком и мощном интерфейсе, который позволяет клиентам всегда иметь актуальный вид инфраструктуры, в которую они входят.

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

В предыдущей части этой серии вы ознакомились с основами работы с Consul. Этот мануал поможет создать конфигурацию Consul для среды производства, которую можно использовать для внедрения обнаружения сервисов в вашей инфраструктуре.

Требования и цели

В данном мануале мы создадим систему серверов, которые смогут взаимодействовать друг с другом и поддерживать информацию сервисов, пулы хранения ключей/значений и другие данные клиентских машин. Первые шаги по подготовке системы к производству – установка программ и автоматизация настройки..

Для работы вам понадобится 3-5 серверов в одном ЦОД. Серверы используются для обработки запросов и постоянного согласования системы. Нечетное количество серверов необходимо для того, чтобы избежать проблем во время выборов.

Клиент также является членом системы и может подключаться к серверам для получения информации об инфраструктуре. Клиенты могут также содержать сервисы, которыми будет управлять Consul.

Чтобы в дальнейшем у вас была возможность реализовать некоторые механизмы безопасности, вам нужно назвать все машины в рамках одного домена. Это значит, что в будущем вы сможете использовать wildcard SSL-сертификат.

Данные о машинах:

Имя хоста IP-адрес Роль
server1.example.com 192.0.2.1 Загрузочный сервер consul
server2.example.com 192.0.2.2 Сервер consul
server3.example.com 192.0.2.3 Сервер consul
agent1.example.com 192.0.2.50 Клиент consul

Для работы мы используем 64-битные серверы Ubuntu 14.04, но любой современный дистрибутив Linux будет работать аналогичным образом.

Все действия нужно выполнять как root.

Загрузка и установка Consul

Если вы не установили Consul в предыдущем мануале, вам нужно сделать это сейчас. Установите программу на общесистемном уровне, чтобы у каждой из четырех машин был к ней доступ.

Установите утилиту unzip для извлечения исполняемого файла Consul.

Обновите индекс локальных пакетов и установите требуемое ПО:

apt-get update
apt-get install unzip

Теперь можно загрузить Consul. Страница проекта предоставляет ссылки для загрузки бинарных пакетов для Windows, OS X и Linux.

Перейдите на эту страницу и щелкните правой кнопкой мыши на операционной системе и архитектуре, которая используется на ваших серверах. В этом руководстве мы будем использовать ссылку «amd64» в разделе «linux». Скопируйте ссылку на пакет.

В терминале перейдите в каталог /usr/local/bin, где будет храниться исполняемый файл. Введите wget и пробел, а затем вставьте URL-адрес, который вы скопировали с сайта:

cd /usr/local/bin
wget https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip

После этого можно распаковать и удалить архив:

unzip *.zip
rm *.zip

Теперь у вас есть доступ к команде consul на всех серверах.

Создание каталогов и структуры системы

Используя команду consul, вы можете работать и без структуры. Это позволит вам проверить некоторые функции (так было в предыдущем руководстве).

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

Сначала нужно создать отдельного пользователя для выполнения задач. Это стандартный способ разделения прав.

Создайте пользователя:

adduser consul

Вы можете пропустить все запросы (нужно только установить пароль, иначе программа будет жаловаться).

Затем создайте иерархию конфигурации, где будут размещаться различные конфигурации, которые вы сможете использовать в зависимости от сервиса. Чтобы упростить задачу, создайте родительский каталог consul.d в структуре /etc и поместите в нем подкаталоги под названием bootstrap, server и client (на каждой машине):

mkdir -p /etc/consul.d/{bootstrap,server,client}

Конфигурации можно добавить позже. Каждый сервер, вероятно, будет использовать, в лучшем случае, два из этих каталогов, но структура должна быть одинакова для согласованности на каждом хосте.

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

mkdir /var/consul
chown consul:consul /var/consul

Создание конфигурации начальной настройки

Первая конфигурация, которую нужно создать, — это загрузка кластера. Это не очень распространенное событие, поскольку оно необходимо только в самом начале для создания кластера. Файл конфигурации поможет вам быстро начать работу в том случае, если кластер полностью отключится.

Вы можете поместить этот файл только на один из ваших серверов или на все, чтобы предоставить больше вариантов для начальной загрузки. Мы разместим его только на server1.

Конфигурации хранятся в простом JSON и ими легко управлять. Создайте первый файл в каталоге bootstrap:

nano /etc/consul.d/bootstrap/config.json

Для начала укажите здесь, что при использовании этого файла сервер consul должен запускаться в режиме bootstrap:

{
"bootstrap": true,
"server": true
}

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

Также можно передать каталог данных, который вы создали в /var/consul. Consul будет использовать его для хранения информации о состоянии кластера:

{
"bootstrap": true,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul"
}

Затем нужно внедрить шифрование в протокол whisper, который использует consul. Эта функция встроена в систему секретов. Секретный ключ должен быть 16-битным. Чтобы получить такое значение, нужно временно выйти из файла.

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

consul keygen
X4SYOinf2pTAcAHRhpj7dA==

Скопируйте полученное значение и вернитесь в файл:

nano /etc/consul.d/bootstrap/config.json

Скопированную строку вставьте как значение параметра encrypt:

{
"bootstrap": true,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA=="
}

Теперь укажите дополнительную информацию: определите уровень логирования и включите syslog.

{
"bootstrap": true,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true
}

Сохраните и закройте файл.

Конфигурация обычного сервера

Теперь нужно настроить обычные серверы. Эта конфигурация используется только во время запуска кластера.

Скопируйте файл bootstrap с сервера server1 в каталог server для редактирования:

cp /etc/consul.d/bootstrap/config.json /etc/consul.d/server

Откройте его:

nano /etc/consul.d/server/config.json

Уберите флаг bootstrap, поскольку эта конфигурация не используется для начальной загрузки.

Здесь нужно только изменить IP-адрес. Укажите IP-адреса серверов, к которым эта нода должна попытаться подключиться при запуске. Подключение кластера выполнится автоматически, так что вам не нужно будет делать это вручную:

{
"bootstrap": false,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["192.0.2.2", "192.0.2.3"]
}

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

Сохраните файл.

Вы должны скопировать содержимое этого файла на другие компьютеры, которые будут выступать в качестве серверов. Поместите их в файл /etc/consul.d/server/config.json, так же, как и на первом хосте.

Единственное значение, которое нужно изменить – это IP-адреса, к которым должен подключиться сервер. Удалите IP текущего сервера из списка и вместо него укажите IP сервера, которого пока в списке нет.

{
"bootstrap": false,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["192.0.2.1", "192.0.2.3"]
}

Сохраните и закройте файл.

Создание конфигурации клиента

Настройка серверов завершена. Теперь пора настроить клиент.

Откройте конфигурационный файл на клиенте:

nano /etc/consul.d/client/config.json

Снова используйте предыдущую конфигурацию в качестве основы для новой конфигурации. Скопируйте содержимое одного из файлов сервера в этот файл.

Сначала удалите все упоминания параметра bootstrap, поскольку он применим только к конфигурациям сервера; в параметре server  укажите значение false.

Затем добавьте параметр, определяющий расположение каталога веб-интерфейса. Позже нужно будет добавить необходимые для этого файлы. Они будут храниться в /home/consul/dist.

В start_join нужно указать адреса всех серверов кластера:

{
"server": false,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"ui_dir": "/home/consul/dist",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
}

Сохраните и закройте файл.

Загрузка файлов веб-интерфейса

Теперь, когда клиент готов к обслуживанию веб-интерфейса, необходимо получить сами файлы, которые позволят ему это сделать.

Для этого перейдите на страницу загрузки веб-интерфейса. Кликните правой кнопкой мыши на кнопке загрузки и скопируйте ссылку.

На клиентской машине используйте su , чтобы перейти в сеанс пользователя consul, и перейдите в домашний каталог.

su consul
cd ~

Введите wget и пробел, а затем вставьте URL-адрес, который вы скопировали со страницы:

wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip

Когда загрузка будет завершена, распакуйте и удалите архив:

unzip *.zip
rm *.zip

Здесь будет каталог dist, который содержит все файлы, необходимые для отображения веб-интерфейса. Нужно просто указать этот каталог в конфигурации.

Закройте сеанс пользователя consul:

exit

Создание сценария Upstart

Теперь у нас есть все конфигурации, и мы можем сосредоточиться на создании сценария Upstart, который будет запускать экземпляры consul автоматически при загрузке и перезагрузке в случае возникновения каких-либо проблем.

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

Сценарий upstart будет похож на сценарии серверов и на клиента. На одном из серверов consul создайте файл в каталоге /etc/init, чтобы сохранить конфигурацию:

nano /etc/init/consul.conf

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

description "Consul server process"

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

Также нужно указать, когда процесс должен прекратиться. Используя стандартные уровни выполнения Linux, вы можете указать, что процесс не должен останавливаться в одном из обычных режимов работы.

description "Consul server process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

Система инициализации может перезапустить процесс, если он неожиданно остановится. Также можно указать пользователя и группу, с помощью которых должен работать процесс. Для изоляции процесса вы уже создали пользователя и группу consul:

description "Consul server process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]
respawn
setuid consul
setgid consul

Наконец, нужно предоставить саму команду, которую файл должен запустить. Это будет простая команда consul, запущенная в режиме агента. Передайте каталог, содержащий параметры конфигурации сервера, в качестве аргумента команды:

description "Consul server process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]
respawn
setuid consul
setgid consul
exec consul agent -config-dir /etc/consul.d/server

Сохраните и закройте файл.

Скопируйте содержимое файла в /etc/init/consul.conf на каждой машине (и на клиент тоже).

На клиентской машине нужно немного откорректировать файл. Измените описание, указав, что это клиент. Измените каталог конфигураций в команде consul.

description "Consul client process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]
respawn
setuid consul
setgid consul
exec consul agent -config-dir /etc/consul.d/client

Сохраните и закройте файл.

Запуск кластера

Теперь все готово к запуску кластера. Этот процесс довольно прост.

На сервере, который содержит конфигурационный файл начальной загрузки (в этом случае server1), используйте su, чтобы переключиться на пользователя consul. Затем можно вызвать consul и передать каталог bootstrap в качестве аргумента:

su consul
consul agent -config-dir /etc/consul.d/bootstrap

Сервис должен запуститься и занять окно терминала. В режиме начальной загрузки этот сервер сам выберет себя в качестве лидера, создавая основу для формирования кластера.

На других серверах (как root) запустите сервис consul, который вы создали с помощью скрипта upstart, набрав:

start consul

Эти серверы подключатся к запущенному серверу и объединятся в кластер. Теперь у вас есть кластер из 3 серверов. Два из них работают в обычном режиме, а один – как лидер. Это дает ему право принимать решения без остальных серверов.

Чтобы все серверы были на равных, можно закрыть загрузочный экземпляр consul, а затем повторно добавить его в кластер в качестве обычного сервера.

Для этого нажмите CTRL-C в терминале загрузочного сервера:

CTRL-C

Вернитесь в сессию root и запустите consul:

exit
start consul

Теперь сервер вернется в кластер с обычными привилегиями, не как лидер.

Кластер полностью готов к работе. Повторите процедуру на клиенте.

start consul

Клиент подключится к кластеру. Вы можете убедиться, что все члены кластера добавились успешно:

consul members
Node     Address             Status  Type    Build  Protocol
server3  192.0.2.3:8301  alive   server  0.3.0  2
server2  192.0.2.2:8301  alive   server  0.3.0  2
server1  192.0.2.1:8301  alive   server  0.3.0  2
agent1   192.0.2.50:8301    alive   client  0.3.0  2

Подключение к веб-интерфейсу

Веб-интерфейс обслуживается клиентом. Но пока что он использует локальный интерфейс, то есть к нему нельзя получить доступ по публичному интерфейсу.

Чтобы это изменить, создайте SSH-туннель. Consul обслуживает запросы HTTP по порту 8500. Свяжите локальный порт 8500 с портом клиента.

На локальной машине запустите:

ssh -N -f -L 8500:localhost:8500 root@192.0.2.50

Это создаст подключение к удаленному компьютеру и туннель между локальным и удаленным портом, а затем переведет соединение в фоновый режим.

В своем локальном браузере вы можете получить доступ к веб-интерфейсу по ссылке:

http://localhost:8500

Здесь вы можете проверить состояние серверов кластера и посмотреть на сервисы инфраструктуры.

Завершив работу с веб-интерфейсом, вы можете закрыть туннель SSH. Найдите pid процесса с и порт:

ps aux | grep 8500
1001      5275  0.0  0.0  43900  1108 ?        Ss   12:03   0:00 ssh -N -f -L 8500:localhost:8500 root@192.241.170.60
1001      5309  0.0  0.0  13644   948 pts/7    S+   12:12   0:00 grep --colour=auto 8500

Выделенное красным значение – это pid. Передайте его команде kill, чтобы остановить процесс.

kill 5275

Tags: ,