Pull to refresh

Альтернативный оркестратор nomad на десктопе

Reading time4 min
Views15K
В настоящее время оркестрация контейнеров ассоциируется в первую очередь с kubernetes. Но это не единственный возможный выбор. Есть и альтернативные средства оркестрации, например nomad, разработчик HashiCorp (хорошо известный как разработчик средства виртуализации Vagrant).

Осваивать работу с средствами оркестрации как правило сложно, т.к. не у всех имеется доступ к инфраструктуре из нескольких серверов с рутовым доступом, поэтому, в предыдущем посте
Разворачиваем Kubernetes на десктопе за несколько минут с MicroK8s был описан процесс разворачивания среды Kubernetes на десктопе на примере веб-приложения Django. Первоначально я планировал в продолжении описать разворачивание базы данных в среде MicroK8s. Но потом подумал, чтоб будет интересно продолжить работу с не менее удобным средством оркестрации nomad. Я не буду давать даже намека на сравнение разных систем оркестрации. Единственное замечу для тех кто сомневается, что nomad установить еще проще чем MicroK8s, т.к. для этого нужно просто скопировать два исполняемых файла (nomad и consul) с сервера разработчика.

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

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

Итак, сначала необходимо создать файл конфигурации nomad. Nomad можно запускать в режиме сервера или в режиме клиента, а также одновременно в обоих режимах (не рекомендуется на продакшине). Для этого в файле конфигурации необходимо поместить секцию server, секцию client или обе эти секции:

bind_addr = "127.0.0.1"
data_dir  = "/tmp/nomad"

advertise {
  http = "127.0.0.1"
  rpc = "127.0.0.1"
  serf = "127.0.0.1"
}

server {
  enabled = true
  bootstrap_expect = 1
}

client {
  enabled = true
  options = {
    "driver.raw_exec.enable" = "1"
  }
}

consul {
  address = "127.0.0.1:8500"
}

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

nomad agent --config nomad/nomad.conf

В последней секции конфигурации задан адрес, по которому будет работать consul. Consul также может работать в режиме сервера, в режиме клиента, и в режиме одновременно сервера и клиента:

consul agent -server -client 127.0.0.1 -advertise 127.0.0.1 -data-dir /tmp/consul -ui -bootstrap

Посе выполнения этих команд можно открыть в браузере (http://localhost:4646) — это UI nomad, и (http://localhost:8500) — это UI consul.

Далее создадим Dockerfile для имиджа Django. От Dockerfile в предыдущем посте от отличается строчкой в которой разрешается доступ к Django через любой хост:

FROM python:3-slim
LABEL maintainer="apapacy@gmail.com"
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
RUN django-admin startproject mysite /app \
    && echo "\nALLOWED_HOSTS = ['*']\n" >> /app/mysite/settings.py
EXPOSE 8000
STOPSIGNAL SIGINT
ENTRYPOINT ["python", "manage.py"]
CMD ["runserver", "0.0.0.0:8000"]

После билдинга контейнера:

docker build django/ -t apapacy/tut-django:1.0.1

Необходимо создать задание, в котором будет создано необходимое количество реплик контейнеров Django (nomad/django.conf):

job "django-job" {
  datacenters = ["dc1"]
  type = "service"
  group "django-group" {
    count = 3
    restart {
      attempts = 2
      interval = "30m"
      delay = "15s"
      mode = "fail"
    }
    ephemeral_disk {
      size = 300
    }
    task "django-job" {
      driver = "docker"
      config {
        image = "apapacy/tut-django:1.0.1"
        port_map {
          lb = 8000
        }
      }
      resources {
        network {
          mbits = 10
          port "lb" {}
        }
      }
      service {
        name = "django"
        tags = ["urlprefix-/"]
        port = "lb"
        check {
          name     = "alive"
          type     = "http"
          path     = "/"
          interval = "10s"
          timeout  = "2s"
        }
      }
    }
  }
}

Все параметры этой конфигурации вполне понятны исходя из их имен. Единственное что хотелось бы расшифровать одну строку: port "lb" {}, которая означает, что порты будут динамически назначаться средой (можно задавать их и статически).

Задание запускается командой:

nomad job run nomad/django.conf

Теперь через UI nomad (http://localhost:4646) можно посмотреть статус задания django-job, а через UI consul (http://localhost:8500) — статус сервиса django, а ткаже на каких именно ip-адресах и портах работает каждая реплика сервиса django. Теперь сервисы доступны через эти ip-адреса, но только внутри сети nomad, и не доступны извне. Для того, чтобы опубликовать сервисы для доступа извне, можно использовать целый ряд возможностей. Например через haproxy, но проще всего сделать это через еще один (третий после nomad и consul) модуль от HashiCorp — fabio.

Вам не нужно будет загружать еще и его — можно предоставить это дело nomad, который, как я уже упоминал в начале сообщения, может работать не только с контейнерами docker, но и с любыми исполняемыми файлами. Для этого нужно создать еще одно задание (nomad/fabio.conf):

job "fabio-job" {
  datacenters = ["dc1"]
  type = "system"
  update {
     stagger      = "60s"
     max_parallel = 1
 }
  group "fabio-group" {
    count = 1
    task "fabio-task" {
      driver = "raw_exec"
      artifact {
        source = "https://github.com/fabiolb/fabio/releases/download/v1.5.4/fabio-1.5.4-go1.9.2-linux_amd64"
      }
      config {
        command = "fabio-1.5.4-go1.9.2-linux_amd64"
      }
      resources {
        cpu    = 100 # 500 MHz
        memory = 128 # 256MB
        network {
          mbits = 10
          port "lb" {
            static = 9999
          }
          port "admin" {
            static = 9998
          }
        }
      }
    }
  }
}

Для выполнения этого задания используется драйвер driver = "raw_exec". Не все драйверы загружаются по умолчанию, поэтому в конфигурации nomad мы предусмотрели эту возможность:

client {
  enabled = true
  options = {
    "driver.raw_exec.enable" = "1"
  }
}

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

Задание запускается командой:

nomad job run nomad/fabio.conf

После этого в браузере доступен UI fabio по адресу (http://localhost:9998). А по адресу (http://localhost:9999) будут опубликован сервис django.

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

Полезные ссылки

1. dvps.blog/minimalnoie-sravnieniie-swarm-kubernetes-mesos-nomad-rancher

papacy@gmail.com
20 февраля 2019 года
Tags:
Hubs:
+6
Comments2

Articles