


Estamos buscando activamente colaboradores y mantenedores para este proyecto. Si tiene experiencia en contenedores internales, por ejemplo, CGROUPS, espacios de nombres o ha contribuido a cualquier proyecto de código abierto alrededor de contenedores, por ejemplo, docker , containerd , nerdctl , podman , etc. o herramientas de construcción que implican tratar con contenedores internos, y estoy interesado en contribuir a este proyecto, ¡me encantaría hablar con usted! Se prefiere la experiencia de Golang pero no se requiere.
Comuníquese con mí @_shishir_m o abra un problema en este repositorio con sus datos de contacto, si está interesado en contribuir a este proyecto.
Controlador de tareas Nomad para iniciar contenedores usando Containerd.
Containerd (containerd.io) es un demonio ligero de contenedores para ejecutar y administrar el ciclo de vida del contenedor.
Docker Daemon también usa Containerd.
dockerd (docker daemon) --> containerd --> containerd-shim --> runc
¡Nomad-Driver-Containerd permite al cliente Nomad lanzar contenedores directamente usando Containerd, sin Docker!
Docker Daemon no es necesario en el sistema de host.

Asegúrese de que su $ Gopath esté configurado correctamente.
$ 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)
Si desea compilar para arm64 , puede ejecutar:
make -f Makefile.arm64
$ vagrant up
o vagrant provision si la VM vagabundia ya se está ejecutando.
Una vez que la configuración (Provisión vagrant up o vagrant provision ) está completa y el servidor Nomad está en funcionamiento, puede verificar los controladores de tareas registrados (que también mostrarán containerd-driver ) utilizando:
$ nomad node status (Note down the <node_id>)
$ nomad node status <node_id> | grep containerd-driver
Nota: setup.sh es parte de la configuración vagabunda y no debe ejecutarse directamente.
Hay pocos trabajos de ejemplo en el directorio example .
$ nomad job run <job_name.nomad>
lanzará el trabajo.
Las instrucciones más detalladas están en el example README.md
Para interactuar directamente con images y containers , puede usar nerdctl , que es una CLI compatible con Docker para containerd . nerdctl ya está instalado en la VM VM AT /usr/local/bin .
Configuración del controlador
| Opción | Tipo | Requerido | Por defecto | Descripción |
|---|---|---|---|---|
| activado | bool | No | verdadero | Habilitar/deshabilitar el controlador de tareas. |
| contenedord_runtime | cadena | Sí | N / A | Tiempo de ejecución para Containerd eg io.containerd.runc.v1 o io.containerd.runc.v2 . |
| stats_interval | cadena | No | 1s | Intervalo para recolectar TaskStats . |
| tampable_privileged | bool | No | verdadero | Si se establece en false , el conductor negará la ejecución de trabajos privilegiados. |
| auténtico | bloquear | No | N / A | Proporcionar autenticación para un registro privado. Ver autenticación para obtener más detalles. |
Configuración de tareas
| Opción | Tipo | Requerido | Descripción |
|---|---|---|---|
| imagen | cadena | Sí | La imagen OCI (Docker también es compatible con OCI) para su contenedor. |
| image_pull_timeout | cadena | No | Una duración de tiempo que controla cuánto tiempo esperará containerd-driver antes de cancelar una extracción en progreso de la imagen OCI como se especifica en image . El valor predeterminado es "5m" . |
| dominio | cadena | No | Comando para anular el comando definido en la imagen. |
| argumentos | []cadena | No | Argumentos al comando. |
| punto de entrada | []cadena | No | Una lista de cadenas que anula el punto de entrada de la imagen. |
| CWD | cadena | No | Especifique el directorio de trabajo actual para el proceso de su contenedor. Si el directorio no existe, se creará uno para usted. |
| privilegiado | bool | No | Ejecute contenedor en modo privilegiado. Su contenedor tendrá todas las capacidades de Linux cuando se ejecute en modo privilegiado. |
| pids_limit | int64 | No | Un valor entero que especifica el límite PID para el contenedor. El valor predeterminado a ilimitado. |
| pid_mode | cadena | No | host o no establecer (predeterminado). Establecer en host para compartir el espacio de nombres PID con el host. |
| nombre de host | cadena | No | El nombre de host para asignar al contenedor. Al iniciar más de una tarea (usando count ) con esta opción establecida, cada contenedor que inicia la tarea tendrá el mismo nombre de host. |
| host_dns | bool | No | Predeterminado ( true ). De manera predeterminada, un contenedor lanzado con containerd-driver usará host /etc/resolv.conf . Esto es similar al docker behavior . Sin embargo, si no desea usar DNS host, puede desactivar este indicador configurando host_dns=false . |
| seccompe | bool | No | Habilite el perfil de SECCOMP predeterminado. Lista de allowed syscalls . |
| seccomp_profile | cadena | No | Ruta al perfil SECComp personalizado. seccomp debe establecerse en true para usar seccomp_profile . El perfil docker SECCOM predeterminado que se encuentra here se puede usar como referencia y modificado para crear un perfil SECComps personalizado. |
| SHM_SIZE | cadena | No | Tamaño de /dev /shm eg "128m" Si desea 128 MB de /dev /shm. |
| sysctl | mapa [cadena] cadena | No | Un mapa de valor clave de las configuraciones SYSCTL para establecer los contenedores al inicio. |
| readonly_rootfs | bool | No | Container Root Files System será de solo lectura. |
| host_network | bool | No | Habilitar la red de host. Esto es equivalente a --net=host en Docker. |
| extra_hosts | []cadena | No | Una lista de hosts, dado como host: IP, que se agregará a /etc /hosts. |
| Cap_add | []cadena | No | Agregar capacidades individuales. |
| Cap_drop | []cadena | No | Capacidades inviduales de soltar. |
| dispositivos | []cadena | No | Una lista de dispositivos que se expondrán al contenedor. |
| auténtico | bloquear | No | Proporcionar autenticación para un registro privado. Ver autenticación para obtener más detalles. |
| montura | []bloquear | No | Una lista de monturas que se montarán en el contenedor. Se admiten soportes de volumen, ata y tipo TMPFS. mount options de estilo FSTAB son compatibles. |
Bloque de montaje
{
- Tipo (String) (Opcional): los valores compatibles son volume , bind o tmpfs . Volumen predeterminado: volumen.
- Target (String) (requerido): ruta de destino en el contenedor.
- fuente (cadena) (opcional): ruta de origen en el host.
- Opciones ([] cadena) (Opcional): mount options de estilo FSTAB. Nota : Para los soportes de enlace, se requiere al menos rbind y ro .
}
Ejemplo de montaje de encuadernación
mounts = [
{
type = "bind"
target = "/target/t1"
source = "/src/s1"
options = ["rbind", "ro"]
}
]
Además de la opción de mounts en Task Config , también puede montar sus volúmenes en el contenedor usando Nomad volume_mount stanza
Ver example job para volume_mount .
Ejemplo de perfil de SECComp personalizado
El perfil docker SECCOM predeterminado que se encuentra here se puede descargar y modificar (eliminando/agregando SYSCALLS) para crear un perfil SECComp personalizado.
El perfil SECComps personalizado se puede guardar en /opt/seccomp/seccomp.json en los nodos del cliente Nomad.
Se puede lanzar un trabajo Nomad utilizando este perfil SECComp personalizado.
config {
seccomp = true
seccomp_profile = "/opt/seccomp/seccomp.json"
}
Ejemplo de sysctl
config {
sysctl = {
"net.core.somaxconn" = "16384"
"net.ipv4.ip_forward" = "1"
}
}
auth estrofa de autenticación le permite establecer credenciales para su registro privado, por ejemplo, si desea extraer una imagen de un repositorio privado en Docker Hub.
auth estrofa de autenticación se puede configurar en Driver Config o Task Config o ambos.
Si se establece en ambos lugares, Task Config Auth tendrá prioridad sobre el autodenador Driver Config .
Nota : En el siguiente ejemplo, user y pass son solo valores de marcador de posición que deben reemplazarse por username y password reales, al especificar las credenciales. A continuación, la estrofa auth se puede utilizar tanto para Driver Config como Task Config .
auth {
username = "user"
password = "pass"
}
nomad-driver-containerd admite redes host y puentes .
Nota: host y bridge son opciones mutuamente excluyentes, y solo una de ellas debe usarse a la vez.
La red host se puede habilitar configurando host_network en true en la configuración de tareas de la especificación de trabajo (ver en Supported options ).
Bridge Network se puede habilitar configurando la estrofa network en la sección del grupo de tareas de la especificación de trabajo.
network {
mode = "bridge"
}
Debe instalar complementos CNI en los nodos del cliente Nomad en /opt/cni/bin antes de poder usar Networks bridge .
Instrucciones para instalar complementos 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
Además, asegúrese de que la distribución de su sistema operativo Linux se haya configurado para permitir que el tráfico de contenedores a través de la red del puente se enrute a través de iptables. Estos ajustes se pueden configurar de la siguiente manera:
$ 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
Para preservar estas configuraciones en el inicio de un nodo de cliente Nomad, agregue un archivo que incluya el siguiente a /etc/sysctl.d/ o elimine el archivo que su distribución de Linux pone en ese directorio.
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
Nomad admite el mapeo de puertos estático y dinámico .
La mapeo de puertos estáticos se puede agregar en la estrofa network .
network {
mode = "bridge"
port "lb" {
static = 8889
to = 8889
}
}
Aquí, el puerto host 8889 se asigna al puerto container 8889 .
Nota : Por lo general, no se recomiendan puertos estáticos, excepto para trabajos system o especializados como equilibradores de carga.
El mapeo de puertos dinámico también está habilitado en la estrofa network .
network {
mode = "bridge"
port "http" {
to = 8080
}
}
Aquí, Nomad asignará un puerto dinámico en el host y ese puerto se asignará a 8080 en el contenedor.
También puede leer más sobre network stanza en la nomad official documentation
Nomad programa cargas de trabajo de varios tipos en un clúster de hosts genéricos. Debido a esto, la colocación no se conoce de antemano y deberá utilizar el descubrimiento de servicios para conectar tareas a otros servicios implementados en su clúster. Nomad se integra con Cónsul para proporcionar descubrimiento y monitoreo de servicios.
Se puede agregar una estrofa service a su especificación de trabajo, para habilitar el descubrimiento de servicios.
La estrofa de servicio instruye a Nomad que registre un servicio con Cónsul.
Si está ejecutando las pruebas localmente, use la vagrant VM proporcionada en el repositorio.
$ vagrant up
$ vagrant ssh containerd-linux
$ sudo make test
Nota : Estas son pruebas destructivas y pueden dejar el sistema en un estado cambiado.
Se recomienda ejecutar estas pruebas, ya sea como parte de un sistema de CI/CD, por ejemplo, Circleci o en una infraestructura inmutable, por ejemplo, VMS VMS.
También puede ejecutar una prueba individual especificando el nombre de prueba. p.ej
$ cd tests
$ sudo ./run_tests.sh 001-test-redis.sh
make clean
Esto eliminará su binario: containerd-driver
vagrant destroy
Esto destruirá a tu vagabunda VM.
Ubuntu (> = 16.04)
Copyright 2020 Roblox Corporation
Con licencia bajo la licencia Apache, versión 2.0 (la "licencia"). Para más información lee la licencia.