Поиск по сайту:

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


Введение

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

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

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

Предпосылки и цели

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

В документации консула рекомендуется иметь 3 или 5 серверов консула в каждом центре обработки данных, чтобы избежать потери данных в случае сбоя сервера. Серверы Consul — это компонент, который выполняет тяжелую работу. Они хранят информацию о службах и информацию о ключе/значении. Нечетное количество серверов необходимо, чтобы избежать тупиковых ситуаций во время выборов.

Помимо серверов консула, другие машины могут запускать агенты консула. Агенты-консулы очень легкие и просто пересылают запросы на серверы. Они обеспечивают метод изоляции ваших серверов и перекладывают ответственность за знание адресов серверов на самих агентов.

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

Детали наших машин здесь:

Hostname IP Address Role
server1.example.com 192.0.2.1 bootstrap consul server
server2.example.com 192.0.2.2 consul server
server3.example.com 192.0.2.3 consul server
agent1.example.com 192.0.2.50 consul client

Для этой демонстрации мы будем использовать 64-битные серверы Ubuntu 14.04, но любой современный сервер Linux должен работать одинаково хорошо. Когда конфигурация будет завершена, у вас должна быть готовая система, которая позволит вам легко добавлять сервисы, проверки и узлы.

Войдите на свои компьютеры как пользователь root, чтобы выполнить шаги, описанные в этом руководстве.

Скачиваем и устанавливаем Консул

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

Прежде чем мы рассмотрим приложение консула, нам нужно получить unzip для извлечения исполняемого файла. Обновите кеш пакета локальной системы, а затем установите пакет с помощью apt:

apt-get update
apt-get install unzip

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

Перейдите на страницу выше и щелкните правой кнопкой мыши операционную систему и архитектуру, которые представляют ваши серверы. В этом руководстве, поскольку мы используем 64-битные серверы, мы будем использовать ссылку «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, которую мы установили ранее. Затем мы можем удалить заархивированный файл:

unzip *.zip
rm *.zip

Теперь у вас должна быть доступна команда consul на всех ваших серверах.

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

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

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

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

Создайте пользователя сейчас, набрав:

adduser consul

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

consul keygen
X4SYOinf2pTAcAHRhpj7dA==

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

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

Используйте скопированную строку в качестве значения параметра encrypt:

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

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

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

Сохраните и закройте файл, когда закончите.

Создание обычной конфигурации сервера

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

Начните с копирования файла начальной загрузки с server1 в подкаталог сервера на этом компьютере для редактирования:

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

Откройте файл, чтобы внести необходимые изменения:

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

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

Единственное, что нам нужно изменить для конфигурации сервера, — это указать 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"]
}

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

Сохраните файл, когда закончите.

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

Единственное значение, которое вам нужно изменить на других хостах, — это 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. Мы собираемся настроить веб-каталог в домашнем каталоге пользователя consul.

su consul
cd ~

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

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

Разархивируйте загруженный файл и удалите zip-файл:

unzip *.zip
rm *.zip

Это создаст каталог с именем dist в вашем домашнем каталоге. Это каталог, на который мы указали параметр веб-интерфейса в файле конфигурации.

Прежде чем мы продолжим, вы должны выйти из сеанса пользователя consul, чтобы вернуться в корневой сеанс:

exit

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

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

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

Наш скрипт выскочки будет похож на наших серверах и на клиенте. На одном из серверов консула создайте файл в каталоге /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 и передать каталог начальной загрузки в качестве аргумента:

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

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

На других ваших серверах консула от имени пользователя root запустите службу консула, которую мы только что создали с помощью скрипта upstart, набрав:

start consul

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

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

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

CTRL-C

Теперь вернитесь в свой корневой сеанс и запустите службу консула, как вы это делали с остальными серверами:

exit
start consul

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

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

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 на порт 8500 клиентской машины. На локальном компьютере введите:

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

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

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

http://localhost:8500

Это даст вам страницу веб-интерфейса по умолчанию:

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

Когда вы закончите использовать веб-интерфейс, вы можете закрыть туннель SSH. Найдите номер pid процесса, используя команду ps и grep для поиска номера порта, который мы переадресовали:

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

Заключение

Теперь у вас должен быть стабильный способ управления вашими членами-консулами. Кластер консул можно быстро и легко настроить и запустить. Дополнительные узлы можно быстро настроить, скопировав файлы конфигурации (consul config и скрипт upstart) существующих серверов.

Хотя теперь у нас есть среда консула, настроенная таким образом, чтобы мы могли легко управлять нашими услугами, мы еще не полностью обезопасили наши коммуникации. В следующем руководстве мы сосредоточимся на том, как настроить проверку SSL-сертификата для шифрования и проверки RPC-соединений наших участников.