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

Введение в использование Consul, системы обнаружения служб, в Ubuntu 14.04


Введение

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

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

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

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

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

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

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

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

Обновите кеш пакета локальной системы, а затем установите пакет с помощью apt:

apt-get update
apt-get install unzip screen

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

screen

Нажмите Enter, если вы получили сообщение об авторских правах. Вы вернетесь в окно терминала, но теперь вы находитесь внутри сеанса экрана.

Теперь мы можем заняться получением программы консула. На странице проекта 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 на всех ваших серверах.

Запуск Bootstrap-сервера

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

Первое, что нам нужно сделать, это запустить программу консул на одном из наших серверов в режиме server и bootstrap. Режим сервера означает, что консул запускается как экземпляр сервера, а не как клиент. Опция начальной загрузки используется для первого сервера. Это позволяет ему назначать себя «лидером» кластера без выборов (поскольку это будет единственный доступный сервер).

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

consul agent -server -bootstrap -data-dir /tmp/consul

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

. . .
2014/07/07 14:32:15 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:32:17 [WARN] raft: Heartbeat timeout reached, starting election
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Candidate] entering Candidate state
2014/07/07 14:32:17 [INFO] raft: Election won. Tally: 1
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Leader] entering Leader state
2014/07/07 14:32:17 [INFO] consul: cluster leadership acquired
2014/07/07 14:32:17 [INFO] consul: New leader elected: server1.example.com
2014/07/07 14:32:17 [INFO] consul: member 'server1.example.com' joined, marking health alive

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

Запуск других серверов

На server2 и server3 теперь мы можем запустить службу консула без параметра начальной загрузки, набрав:

consul agent -server -data-dir /tmp/consul

Для этих серверов вы также увидите записи журнала. Ближе к концу вы увидите такие сообщения:

. . .
2014/07/07 14:37:25 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:37:27 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
2014/07/07 14:37:53 [ERR] agent: failed to sync remote state: No cluster leader

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

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

Так как мы запускаем консульский сервер в текущем окне терминала server1, нам нужно будет создать другой терминал с screen, чтобы выполнить дополнительную работу. Создайте новое окно терминала в рамках существующего сеанса экрана server1, набрав:

CTRL-A C

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

CTRL-A N

Вернувшись в свой новый терминал, присоединитесь к двум другим экземплярам, указав их IP-адреса следующим образом:

consul join 192.0.2.2 192.0.2.3

Это должно мгновенно объединить все три сервера в один кластер. Вы можете дважды проверить это, набрав:

consul members
Node                 Address             Status  Type    Build  Protocol
server1.example.com  192.0.2.1:8301  alive   server  0.3.0  2
server2.example.com  192.0.2.2:8301  alive   server  0.3.0  2
server3.example.com  192.0.2.3:8301  alive   server  0.3.0  2

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

Удаление загрузочного сервера и повторное подключение в качестве обычного сервера

Все три наших сервера объединены в кластер, но это еще не все.

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

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

На server1 переключитесь обратно на терминал с запущенным консулом:

CTRL-A N

Остановите службу, набрав:

CTRL-C

Теперь перезапустите службу без опции начальной загрузки:

consul agent -server -data-dir /tmp/consul

Вернитесь к своему открытому терминалу и снова присоединитесь к кластеру, подключившись к одному из двух серверов в кластере:

CTRL-A N
consul join 192.0.2.2

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

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

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

Мы собираемся разместить веб-интерфейс консула на нашей клиентской машине, чтобы мы могли взаимодействовать с кластером и отслеживать его работоспособность. Для этого посетите страницу загрузки веб-интерфейса. Щелкните правой кнопкой мыши кнопку загрузки и выберите «Копировать расположение ссылки» или любой другой аналогичный вариант, который у вас есть.

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

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

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

unzip *.zip
rm *.zip

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

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

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

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

В конце концов, наша команда подключения довольно длинная. Это будет выглядеть так:

consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dir -join 192.0.2.1

Это подключит нашу клиентскую машину к кластеру как обычный несерверный агент. Этот агент будет отвечать на запросы по своему общедоступному IP-адресу вместо обычного интерфейса 127.0.0.1. Из-за этого вам нужно будет добавить дополнительный флаг ко всем командам консула, указывающим rpc-addr.

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

consul members -rpc-addr=192.0.2.50:8400
Node     Address             Status  Type    Build  Protocol
agent1   192.0.2.50:8301    alive   client  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
server3  192.0.2.3:8301  alive   server  0.3.0  2

Это может показаться хлопотным, но это дает нам возможность получить доступ к веб-интерфейсу консула. Вы можете попасть в веб-интерфейс, посетив IP-адрес вашего клиента, а затем :8500/ui в веб-браузере:

http://192.0.2.50:8500/ui

Основной интерфейс будет выглядеть так:

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

Добавление услуг и проверок

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

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

Для наших целей мы установим Nginx на нашем клиенте, чтобы продемонстрировать это. Завершите текущий сеанс клиента, набрав:

CTRL-C

Установите Nginx на клиенте, набрав:

apt-get install nginx

Теперь мы можем создать каталог конфигурации для хранения определений наших сервисов:

mkdir ~/services

Внутри этого каталога мы создадим файл JSON, описывающий наш веб-сервис. Мы назовем это web.json:

nano ~/services/web.json

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

Основная схема выглядит так:

{
    "service": {
        . . .
        "check": {
            . . .
        }
    }
}

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

Для нашего примера это выглядит так:

{
    "service": {
        "name": "web server",
        "port": 80,
        "tags": ["nginx", "demonstration"],
        "check": {
            . . .
        }
    }
}

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

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

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

{
    "service": {
        "name": "web server",
        "port": 80,
        "tags": ["nginx", "demonstration"],
        "check": {
            "script": "curl localhost:80 > /dev/null 2>&1",
            "interval": "10s"
        }
    }
}

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

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

consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dist -join 192.0.2.1 -config-dir /home/your_user/services

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

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

CTRL-A C
service nginx stop

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

Это показывает, что наша проверка работоспособности работает должным образом.

Заключение

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

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