


Мы активно ищем участников и сопровождающих для этого проекта. Если у вас есть опыт работы в области контейнеров, например, CGROUPS, пространства имен или внесли свой вклад в любые проекты с открытым исходным кодом вокруг контейнеров, например, docker , containerd , nerdctl , podman и т. Д. Или или создание инструментов, которые включают в себя взаимодействие с внутренними контейнерами, и заинтересованы в участии в этом проекте, я бы хотел поговорить с вами! Опыт Голанга предпочтительнее, но не требуется.
Пожалуйста, обратитесь ко мне @_shishir_m или откройте проблему в этом репозитории с вашими контактными данными, если вы заинтересованы в участии в этом проекте.
DIRMAD TASCE DRIVER для запуска контейнеров с помощью контейнера.
Containerd (containerd.io) - это легкий демон контейнера для работы и управления жизненным циклом контейнера.
Docker Daemon также использует Containerd.
dockerd (docker daemon) --> containerd --> containerd-shim --> runc
Nomad-Driver-Containerd позволяет Nomad Client напрямую запускать контейнеры с помощью контейнера, без Docker!
Docker Daemon не требуется в хост -системе.

Убедитесь, что ваш $ Gopath настроен правильно.
$ mkdir -p $GOPATH/src/github.com/Roblox
$ cd $GOPATH/src/github.com/Roblox
$ git clone [email protected]:Roblox/nomad-driver-containerd.git
$ cd nomad-driver-containerd
$ make build (This will build your containerd-driver binary)
Если вы хотите скомпилировать arm64 , вы можете запустить:
make -f Makefile.arm64
$ vagrant up
Или vagrant provision если бродяга уже работает.
После завершения настройки ( vagrant up или vagrant provision ), и сервер Nomad работает и работает, вы можете проверить зарегистрированные драйверы задач (на которых также будет показан containerd-driver ), используя:
$ nomad node status (Note down the <node_id>)
$ nomad node status <node_id> | grep containerd-driver
Примечание. setup.sh является частью настройки бродяги и не должна выполняться напрямую.
В каталоге example есть несколько примеров.
$ nomad job run <job_name.nomad>
запустит работу.
Более подробные инструкции приведены в example README.md
Чтобы напрямую взаимодействовать с images и containers , вы можете использовать nerdctl , который представляет собой CLI, совместимый с Docker для containerd . nerdctl уже установлен в VAGRANT VM AT /usr/local/bin .
Конфигурация драйвера
| Вариант | Тип | Необходимый | По умолчанию | Описание |
|---|---|---|---|---|
| включено | буль | нет | истинный | Включить/отключить драйвер задачи. |
| containerd_runtime | нить | да | N/a | Время выполнения для контейнера EG io.containerd.runc.v1 или io.containerd.runc.v2 . |
| stats_interval | нить | нет | 1с | Интервал для сбора TaskStats . |
| Alling_privileged | буль | нет | истинный | Если установить на false , Драйвер отрицает привилегированные задания. |
| аут | блокировать | нет | N/a | Обеспечить аутентификацию для частного реестра. Смотрите аутентификацию для более подробной информации. |
Задача конфигурация
| Вариант | Тип | Необходимый | Описание |
|---|---|---|---|
| изображение | нить | да | Изображение OCI (Docker также совместим с OCI) для вашего контейнера. |
| image_pull_timeout | нить | нет | Продолжительность времени, которая контролирует, как долго будет ждать containerd-driver , прежде чем отменить в процессе вытягивания изображения OCI, как указано на image . По умолчанию "5m" . |
| командование | нить | нет | Команда переопределить команду, определенную на изображении. |
| Аргс | []нить | нет | Аргументы в команду. |
| входная точка | []нить | нет | Список строк, переопределяющий точку записи изображения. |
| CWD | нить | нет | Укажите текущий рабочий каталог для вашего процесса контейнера. Если каталог не существует, для вас будет создан. |
| привилегирован | буль | нет | Запустите контейнер в привилегированном режиме. Ваш контейнер будет иметь все возможности Linux при запуске в привилегированном режиме. |
| pids_limit | Int64 | нет | Целочисленное значение, которое указывает предел PID для контейнера. По умолчанию неограниченное. |
| pid_mode | нить | нет | host или не установлен (по умолчанию). Установите host , чтобы поделиться пространством имен PID с хостом. |
| имя хоста | нить | нет | Имя хоста, чтобы назначить контейнеру. При запуске более чем одной из задач (используя count ) с помощью этого набора опций, каждый контейнер, который запускает задание, будет иметь одинаковое имя хоста. |
| host_dns | буль | нет | По умолчанию ( true ). По умолчанию контейнер, запускаемый с использованием containerd-driver будет использовать host /etc/resolv.conf . Это похоже на docker behavior . Однако, если вы не хотите использовать Host DNS, вы можете отключить этот флаг, установив host_dns=false . |
| Seccomp | буль | нет | Включить профиль seccomp по умолчанию. Список allowed syscalls . |
| seccomp_profile | нить | нет | Путь к пользовательскому профилю seccomp. seccomp должен быть установлен на true , чтобы использовать seccomp_profile . Профиль docker Seccomp по умолчанию, найденное here может использоваться в качестве ссылки и изменен для создания пользовательского профиля SECCOMP. |
| shm_size | нить | нет | Размер /dev /shm, например, "128m", если вы хотите 128 МБ /dev /shm. |
| sysctl | карта [String] String | нет | Карта ключей конфигураций SYSCTL для установки в контейнеры при запуске. |
| readonly_rootfs | буль | нет | Файловая система корневой системы контейнера будет только для чтения. |
| host_network | буль | нет | Включить хост -сеть. Это эквивалентно --net=host в Docker. |
| extra_hosts | []нить | нет | Список хостов, приведенный в качестве хоста: ip, будет добавлено в /и т. Д. /Хост. |
| cap_add | []нить | нет | Добавьте отдельные возможности. |
| cap_drop | []нить | нет | Отбросить инвазованные возможности. |
| устройства | []нить | нет | Список устройств, которые будут подвергаться воздействию контейнера. |
| аут | блокировать | нет | Обеспечить аутентификацию для частного реестра. Смотрите аутентификацию для более подробной информации. |
| крепления | []блокировать | нет | Список креплений, которые должны быть установлены в контейнере. Поддерживаются монтады типа Tompfs и TMPFS. Поддерживаются mount options в стиле FSTAB. |
Горный блок
{
- type (string) (необязательно): поддерживаемыми значениями являются volume , bind или tmpfs . По умолчанию: том.
- Target (String) (требуется): целевой путь в контейнере.
- Source (String) (необязательно): Путь источника на хосте.
- Options ([] String) (необязательно): mount options в стиле FSTAB. Примечание . Для привязки требуются как минимум rbind и ro .
}
Пример привязки привязки
mounts = [
{
type = "bind"
target = "/target/t1"
source = "/src/s1"
options = ["rbind", "ro"]
}
]
В Additon к параметрам mounts в Task Config вы также можете установить свои объемы в контейнер, используя NOMAD volume_mount stanza
См. example job для volume_mount .
Пример индивидуального профиля SECComp
Профиль docker Seccomp, найденный here может быть загружен и модифицирован (путем удаления/добавления Syscalls) для создания пользовательского профиля SECComp.
Пользовательский профиль SECCOMP может быть сохранен под /opt/seccomp/seccomp.json в узлах клиентов Nomad.
Задача кочевника может быть запущена с помощью этого пользовательского профиля SECCOMP.
config {
seccomp = true
seccomp_profile = "/opt/seccomp/seccomp.json"
}
Sysctl пример
config {
sysctl = {
"net.core.somaxconn" = "16384"
"net.ipv4.ip_forward" = "1"
}
}
auth Stanza позволяет вам устанавливать учетные данные для вашего частного реестра, например, если вы хотите вытащить изображение из частного репозитория в Docker Hub.
auth Stanza может быть установлена либо в Driver Config , либо Task Config или в обоих.
Если установить в обоих местах, Task Config Auth будет иметь приоритет над Driver Config .
ПРИМЕЧАНИЕ . В приведенном ниже примере user и pass - это просто значения заполнителей, которые необходимо заменить фактическим username и password при указании учетных данных. Ниже auth Stanza можно использовать как для Driver Config , так и Task Config .
auth {
username = "user"
password = "pass"
}
nomad-driver-containerd поддерживает сети хоста и мостовых мостов .
Примечание: host и bridge являются взаимоисключающими вариантами, и только один из них должен использоваться одновременно.
Хост -сеть может быть включена, установив host_network для true в конфигурации задачи спецификации задания (см. Supported options ).
Bridge Network может быть включена, установив network строфе в разделе Task Group спецификации задания.
network {
mode = "bridge"
}
Вам необходимо установить плагины CNI на Nomad Client Nodes Under /opt/cni/bin прежде чем вы сможете использовать bridge сети.
Инструкции по установке плагинов CNI.
$ curl -L -o cni-plugins.tgz https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
$ sudo mkdir -p /opt/cni/bin
$ sudo tar -C /opt/cni/bin -xzf cni-plugins.tgz
Кроме того, убедитесь, что ваше распределение операционной системы Linux было настроено, чтобы позволить контейнерному трафику через мостовую сеть маршрутизации через iptables. Эти контакты могут быть установлены следующим образом:
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-arptables
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
Чтобы сохранить эти настройки при запуске клиентского узла Nomad, добавьте файл, включающий в себя следующее в /etc/sysctl.d/ или удалите файл, который распределяет ваш дистрибутив Linux в этом каталоге.
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
Nomad поддерживает как статическое , так и динамическое отображение портов.
Статическое отображение портов может быть добавлено в network строфе.
network {
mode = "bridge"
port "lb" {
static = 8889
to = 8889
}
}
Здесь host -порт 8889 сопоставлен с container портом 8889 .
Примечание . Статические порты обычно не рекомендуются, за исключением system или специализированных заданий, таких как балансировщики нагрузки.
Динамическое отображение порта также включено в network строфе.
network {
mode = "bridge"
port "http" {
to = 8080
}
}
Здесь Nomad выделяет динамический порт на host , и этот порт будет сопоставлен с 8080 в контейнере.
Вы также можете прочитать больше о network stanza в nomad official documentation
Nomad планирует рабочие нагрузки различных типов в группе общих хостов. Из -за этого размещение не известно заранее, и вам нужно будет использовать Service Discovery для подключения задач к другим услугам, развернутым в вашем кластере. Nomad интегрируется с консулом для обеспечения обнаружения и мониторинга услуг.
service строфа может быть добавлена в вашу задачу, чтобы включить обнаружение услуг.
Сервис Stanza инструктирует Nomad зарегистрировать услугу с консулом.
Если вы запускаете тесты локально, используйте vagrant VM представленную в репозитории.
$ vagrant up
$ vagrant ssh containerd-linux
$ sudo make test
Примечание : это деструктивные тесты и могут оставить систему в измененном состоянии.
Настоятельно рекомендуется запустить эти тесты либо в рамках системы CI/CD, например, Circleci, либо на неизменной инфраструктуре, например VAGRANT VMS.
Вы также можете запустить отдельный тест, указав имя теста. например
$ cd tests
$ sudo ./run_tests.sh 001-test-redis.sh
make clean
Это удалит ваш двоичный файл: containerd-driver
vagrant destroy
Это разрушит вашу бродяковую виртуальную машину.
Ubuntu (> = 16,04)
Copyright 2020 Roblox Corporation
Лицензирован по лицензии Apache, версия 2.0 («Лицензия»). Для получения дополнительной информации прочитайте лицензию.