Инфраструктура-домохозяйство (7 серии деталей)
Nomad — это распределенный планировщик работы, оркестратор и монитор. Узнайте, как установить и использовать его для обеспечения контейнеров Docker.
В этой статье я представлю hashicorp Кочевник , система планирования заданий, которую можно использовать для запуска любого приложения, либо в качестве системных бинарных или контейнеров Docker.
Nomad станет центральным инструментом в моей инфраструктуре для выполнения следующих требований моего проекта Infrastructure@Home:
- AM1: Приложения могут быть развернуты в виде двоичных или контейнеров Docker
- AM2: Приложения могут быть развернуты на определенных узлах
- AM3: Приложения могут быть развернуты где -то внутри кластера
- AM4: интерфейс, в котором я вижу состояние каждого приложения (здоровье, потребление ресурсов, конечные точки)
Эта статья первоначально появилась в мой блог .
Что такое кочевник?
По сути, Nomad является распределенным планировщиком работы и монитором работы. Nomad — это бинар One Go, который работает на большинстве архитектур, включая Linux, ARM и Windows. На каждом узле вашего кластера вы запускаете серверы кочевников или клиентов кочевников. Сервер — это «мозг» планирования заданий. У него есть полные данные обо всех работах, их распределении, их состоянии здоровья. В кластере вы предоставляете три или пять серверов, чтобы они повторяли данные о состоянии друг другу и предоставляли автоматическое отказоустойчивость, когда один сервер снижается. Помимо сохранения состояния, основная роль сервера состоит в том, чтобы обработать входящие определения заданий, проверить, как выделить их в кластере, а затем отправить эту рабочую нагрузку клиенту. Клиенты NOMAD обрабатывают распределение заданий: они запускают сервис, отслеживают этап запуска, и, если все пойдет хорошо, будут запускать услугу. Все данные передаются обратно на серверы. Кроме того, клиенты собирают метрики о узлах и рабочих местах.
Доступ к кочевнику можно получить через CLI, REST-API или веб-интерфейс. Он предоставляет гораздо больше функций, таких как файлы заданий, перемещение заданий между узлами, стратегии обновления и многое другое. В этой статье. Я буду охватывать только функции, которые актуальны для наших вариантов использования.
Установка кочевника
Установка кочевника следует те же шаги, что и в консуле:
- Определите правильное распределение и оборудование Linux
- Создать группу кочевников, пользователей и каталогов
- Скачать и ссылаться на кочевник бинарный
- Скопируйте файлы конфигурации
- Включить кочевник с SystemD
Как и прежде, я полностью автоматизировал установку с помощью Ansible. Установка прошла гладко. Но мне нужно было два вечера, чтобы запустить кочевник из -за тонкой. По сути, я предположил, что конфигурация для Nomad будет такой же, как и для консула: Укажите его на каталог, и он будет использовать все включенные файлы конфигурации. Ну да, нет! Вам нужно явно передать файлы конфигурации:
>> /usr/local/bin/nomad agent -server -config /etc/nomad/nomad.conf.json
Когда он правильно установлен на всех узлах, вы можете увидеть статус на консоли.
>> nomad node status ID DC Name Class Drain Eligibility Status 7be9e3ea infrastructure_at_home raspi-0false eligible ready 537de130 infrastructure_at_home raspi-4-1 false eligible ready 899eab5d infrastructure_at_home raspi-3-2 false eligible ready c2a79d23 infrastructure_at_home raspi-3-1 false eligible ready
Или вы можете получить доступ к веб -интерфейсу на Localhost: 4646
Анкет
Все узлы связаны. Теперь мы можем начать писать работу.
Котовой рабочие места: выполнить бинарный
Первое задание выполнит двоичный файл, который запускает локальный веб -сервер. Работа будет создана как файл работы, который определяет, что запускать, сколько экземпляров, какие порты открывают, проверка здоровья приложения и многое другое. Работа может быть определена в JSON или в Язык конфигурации Hashicorp , или короткий HCl, который похож на JSON. Я также буду использовать HCL, потому что большая часть документации по кочевникам использует этот язык.
Вот файл работы:
job "example" { datacenters = ["infrastructure_at_home"], group "exec" { task "http_serve" { driver = "exec" artifact { source = "https://github.com/m3ng9i/ran/releases/download/v0.1.4/ran_linux_arm64.zip" } config { command = "ran_linux_arm64" args = [ "-l", "--debug", "-p", "${NOMAD_PORT_http}" ] } resources { cpu = 200 memory = 200 network { port "http" {} } } } } }
Давайте объясним наиболее важные части описания работы:
Он структурирован в
работа
,Группа
иЗадача
разделы- Работа-это имя верхнего уровня для запуска приложений, подумайте о имени файла
- Группа определяет набор связанных задач, которые будут размещены на том же узле
- Задача определяет, какое приложение: какой тип, его конфигурация, его сетевые порты и более
- С
DataCenter
идентифицирует, на каком Nomad Cluster для запуска программы Внутри
Задача
Мы определяем специфику для приложения-
водитель
может быть - >
exec
Запустить команду в оболочке - >
Java
Выполнить файл JAR - >
Docker
Выполнить контейнер Docker
-
- С
Артефакт
Мы выражаем для загрузки и разкапливания файла в задание приложения конфигурация
обеспечиваетКоманда
и дополнительныеargs
Это будет использоваться для выполнения приложения. Обратите особое внимание на $ {Nomad_port_http} — это динамический порт HTTP, который Nomad назначит процессу работы.- Наконец с
Ресурсы
Вы определяете минимальные необходимые ресурсы, которые необходимо для выполнения этой задачи узлу, а также как назначать порты, что в данном случае динамика
Это много, чтобы покрыть! Но все записи определяют важные аспекты рабочих мест. Мне нравится сравнивать читабельность этих определений с Ansible: его декларативный синтаксис помогает вам понять, что будет делать.
Теперь давайте продолжим и запустим эту работу. Вы всегда должны запускать одну команду в первую очередь: План работы кочевника
Анкет Это дает вам легкий обзор того, что будет делать.
>> nomad job plan example.nomad Job: "example" Task Group: "exec" (1 ignore) Task: "http_serve" Scheduler dry-run: - All tasks successfully allocated.
ОК, давай запустим это.
>> nomad job run example. ==> Monitoring evaluation "8eb3657a" Evaluation triggered by job "example" Evaluation within deployment: "f31e3269" Evaluation status changed: "pending" -> "complete" ==> Evaluation "8eb3657a" finished with status "complete"
Вы можете увидеть статус работы.
>> nomad status top ID = example Name = example Submit Date = 2020-03-09T19:25:38Z Type = service Priority = 50 Datacenters = infrastructure_at_home Namespace = default Status = running Periodic = false Parameterized = false Summary Task Group Queued Starting Running Failed Complete Lost exec 0 0 1 2 1 0 Latest Deployment ID = f31e3269 Status = successful Description = Deployment completed successfully Deployed Task Group Desired Placed Healthy Unhealthy Progress Deadline exec 1 1 0 0 2020-03-09T19:35:38Z Allocations ID Node ID Task Group Version Desired Status Created Modified 21d08737 4b393cb6 exec 4 run running 7m49s ago 7m35s ago
Аналогичная информация также показана в веб -интерфейсе.
После завершения развертывания вы можете получить доступ к WebServer и увидеть файлы локального DIR.
Запуск работы Docker
Файл задания для запуска контейнера Docker выглядит одинаково, но имеет другие варианты:
-
водитель
этодокер
- Внутри
конфигурация
, вы указываетеИзображение
это будет загружено и обеспечитport_map
Чтобы указать, какие разоблаченные порты контейнера Docker будут выставлены работой. Декларацияhttp
означает, что открытый порт 80 будет связан с переменнойhttp
- В
resources.network
Часть мы сопоставляем открытыеhttp
Порт из контейнера Docker до статического порта 80
job "example2" { datacenters = ["infrastructure_at_home"], group "webserver" { count = 3, task "nginx" { driver = "docker", config { image = "nginx:1.17.9" port_map { http = 80 } } resources { cpu = 200, memory = 200, network { port "http" { static = 80 } } } } } }
Контроль распределения приложений
Поведение кочевника по умолчанию состоит в том, чтобы поместить как можно больше услуг в одном узле — чтобы уменьшить задержку сети. Тем не менее, есть случаи, когда вы хотите нацелить определенные узлы, например, узлы, которые имеют более эффективные ресурсы. Или вы хотите распространить приложение на разные узлы.
Nomad предлагает два варианта управления, где будет размещена приложение.
Первый вариант аффинность . Он определяет набор характеристик, которые должен иметь узел. Узлы, которые имеют эти характеристики, будут выбирать в первую очередь. Вы можете выбрать из богатого набора Узел переменных , включая арку процессора, версию ядра, имя ОС и конкретный кочевник переменные среды Анкет
Например, если мы хотим, чтобы веб -серверы NGINX запускались только в Raspberry Pi, в которых есть более 1 ГБ памяти, мы можем добавить следующий код:
job "example2" { group "webserver" { count = 2 task "nginx" { affinity { attribute = "${attr.memory.totalbytes}" operator = ">" value = "1048576" weight = 100 } ... } } }
Когда мы планируем эту работу, мы видим, что эта задача разрушит один nginx, который работал на Raspi-3-1 (который имеет только 1 ГБ), и вместо этого поместит этот экземпляр на Raspi-4-2.
Второй вариант — использовать Распространение Анкет Обычно Nomad пытается выделить как можно больше задач по одному узлу. С помощью распространения вы можете изменить это поведение и выразить, что задачи должны выполняться на разных компьютерах.
Вывод
В этой статье я объяснил, как Nomad является центральным инструментом для управления приложениями в моем проекте Infrastructure@Home. Планировщик заданий Nomads может запускать любой двоичный контейнер или контейнер Docker, динамически распределенный на узлы. Мы увидели один пример для выполнения простого бинарника HTTP -сервера, и мы увидели еще один пример для развертывания нескольких веб -серверов NGINX. Вы можете контролировать распределение с помощью атрибутов сродства или распространения. В следующей статье я объясню, как могут быть обнаружены приложения.
Инфраструктура-домохозяйство (7 серии деталей)
Оригинал: «https://dev.to/admantium/application-management-with-nomad-38jg»