Рубрики
Uncategorized

Управление приложениями с кочевником

Nomad — это распределенный планировщик работы, оркестратор и монитор. Узнайте, как установить и использовать его для P … Tagged с DevOps, Hashicorp, Nomad, Raspberrypi.

Инфраструктура-домохозяйство (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-0      false  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»