Для запуска на MacOS требуется установить следующее ПО
brew cask install virtualbox
brew cask install vagrant
brew install ansible
git clone https://github.com/andrewnazarov/nomad-playground.git
Виртуальное окружение, созданное для тестирования управления контейнерами с ипользованием инструментов Hashicorp: Vagrant - для поднятия песочницы на локальной машине, Consul - для регистрации сервисов , Nomad - для управления Docker-контейнерами. Осуществлять provisioning будем с помощью Ansible.
В Vagrantfile сконфигурировано поднятие на локальной машине трех вирутальных машин.
- Одна из них является Nomad-сервером/Consul-сервером. Рекомендуется их объединять в кластер из минимум 3-х машин. В продакшен среде желательно разделить роли Nomad и Consul сервера. Серверов можно делать любое количество, но для них будут отличаться настройки Nomad и Consul - провизионинг дополнительных серверов пока не реализован для упрощения картины, но это совсем не трудно.
- Две другие вирутальные машины - наши рабочие ноды с Docker на борту (на все серверы ставится Docker и Docker-compose, последнее не обязательно). Нод можно делать любое количество, сколько позволяют ресурсы локальной машины.
На все сервера также устанавливается Dnsmasq, который дает возможность использовать данные машины как dns-резолверы, позволяющие юзать доменные имена Consul'а для доступа к сервисам или для общения между сервисами. Сервис, поднятый с помощью Nomad, регистрируется в Consul под доменным именем <имя_сервиса>.service.consul. Ноды регистрируются в Consul под именами <имя_сервера>.node.consul.
Также Consul осуществляет мониторинг доступности сервисов и дает возможность запускать кастомные проверки.
Среди сервисов у нас есть
- tomcat для выполнения Java-приложения. В нашем случае я просто кладу в каталог tomcat готовый артефакт - простейшую страничку, собранную в war-файл. По идее, данный артифакт, а ещё лучше готовый контейнер должны быть результатом успешной CI/CD цепочки. Из контейнера наружу смотрит порт 8080.
- mongodb. Из контейнера наружу смотрит порт 27017
- cadvisor, системный сервис(при запуске задачи которого Nomad гарантированно развертывет его на каждой ноде), может использоваться дополнительно для мониторинга нод, наружу смотрит порт 8080.
- microbot, простой и легкий сервис, взятый тут(https://github.com/dontrebootme/docker-microbot), с помощью которого я могу показать работу с Nomad - т.к. ресрсы моей системы очень ограничены, то мастабировать mongodb или tomcat мне проблематично.
- fabio, системный сервис, представляющий собой классный прокси-сервер и load balancer, отлично работающий из коробки с Consul.
Все сервисы(кроме Fabio, который использует драйвер raw-exec) будут контейнеризированы, Nomad будет использовать драйвер docker.
Если какая-то нода пропадает, то автоматически Nomad будет перераспределять количество сервисов на оставшиеся ноды.
Nomad позволяет деплоить новые версии сервисов или масштабировать без простоя в обслуживании и осуществлять rolling updates или blue/gren deployment.
Под виртуальные машины выделено по умолчанию довольно мало оперативной памяти. Желательно выделить больше, все зависит от возможностей локальной машины. Для этого в Vagrantfile достаточно отредактировать параметр v.memory.
vagrant up
Некоторое время необходимо для поднятия вирутальных машин и устанавки на них необходимого программного обеспечения. Для настройки портов на нодах можно легко воспользоваться моей ролью ролью ansible-common или geerlingguy.firewall. Для этого необходимо всего лишь git clone <репозиторий с ролью> (или установить стороннюю роль через ansible-galaxy) и подключить её в файле site.yml(сейчас там закомметировано)
Итак, спустя некоторое время после vagrant up мы будем иметь 3 работающих вируальных машины, что можно проверить с помощью
vagrant status
Заходим по ssh на Nomad-сервер, всю работу будем выполнять с него.
vagrant ssh nomad-server1
Можно проверить, что на всех нодах работает Consul
consul members
а также то, что настроен Nomad, отображаются сведения о сервере и нодах
nomad server-members
nomad nodes-status
Переходим в папку, которая пробрасывается с локальной машины в вируталку
cd /vagrant
В этой папке лежат преднастроенные jobs для Nomad. Это файлики с расширением .nomad. Среди них есть системные jobs (fabio, cadvisor), при запуске такого job Nomad будет устанавливать их на каждую ноду, где есть Nomad агент.
Желательно, прежде чем деплоить новые сервисы, запустить на нодах задачу деплоя прокси-сервера Fabio
nomad run fabio.nomad
Статус развертывания можно смотреть с помощью
nomad status fabio
nomad alloc-status <alloc_ID>
Последняя команда также выводит информацию о потреблиемых ресурсах.
Если возникнут проблемы при инсталляции, то Nomad автоматически будет пытаться заново установить требуемое. Для Fabio мы резервируем два статических порта 9998 - для просмотра и изменения таблицы редиректора, 9999 - для проксирования.
То, что сервис зарегистрирован в Consul, а также состояние сервисов и нод, можно проверить через web-интерфейс. С локальной машины заходим в браузере:
http://10.100.200.11:8500 (можно использовать ip-адрес любого из виртуальных серверов)
Можно не ждать конца установки Fabio(но для обращения к сервисам он нам будет нужен).
Запускаем задачу по развертыванию сервиса
nomad run microbot.nomad
Параметром count = 2
задается количество инстансов сервиса, которые будут развернуты. Все они регистрируются в Consul.
Контейнер вовне открывает порт обозначенный тут
port_map { http = 80 }
В Consul сервисы регистрируются с динамическими портами.
Для увеличения количества сервисов мы можем отредактировать параметр count = 7
и Nomad в дальнейшем сам
распределит дополнительные 5 инстансов по серверам без перерыва в обслуживании.
nomad plan microbot.nomad
покажет изменения и отобразит номер с которым надо делать nomad run
nomad run -check-index <index> microbot.nomad
В нашей песочнице для обращения к сервису с локальной машины, нужно в качестве dns-сервера локальной машины прописать ip-адрес любой виртуальной машины. После чего через браузер
http://microbot.service.consul:9999
При обновлении страницы можно обратить внимание, что изменяется буквенно-цифровой код - это ID котейнера.
Для запуска приложения на tomcat можно выполнить.
nomad run tomcat.nomad
После поднятия сервиса обратиться к нему можно из браузера
http://tomcat.service.consul:9999
Если сделать nomad init, то Nomad создаст job файлик с сервисом redis по умолчанию. Можно вносить изменения в конфигурацию и запускать его описанным выше способом.