- Tutorial
Осваивать работу с средствами оркестрации как правило сложно, т.к. не у всех имеется доступ к инфраструктуре из нескольких серверов с рутовым доступом, поэтому, в предыдущем посте
был описан процесс разворачивания среды 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.
Код приведенных в публикации конфигрураций можно найти в репозитарии github.com/apapacy/microk8s-tut
apapacy@gmail.com
20 ферваля 2019 года