


Wir suchen aktiv nach Mitwirkenden und Betreuern für dieses Projekt. Wenn Sie Erfahrung in Container -Interna haben podman z. B. containerd , nerdctl oder bei docker zu Open -Source -Projekten um Container, z. Golang -Erfahrung ist bevorzugt, aber nicht erforderlich.
Bitte wenden Sie sich an mich @_shishir_m oder öffnen Sie ein Problem in diesem Repository mit Ihren Kontaktdaten, wenn Sie daran interessiert sind, zu diesem Projekt beizutragen.
NOMAD -Task -Treiber zum Starten von Containern mit Container.
Container (containerd.io) ist ein leichtgewichtiger Container -Daemon zum Ausführen und Verwalten von Containerlebenszyklus.
Docker Daemon verwendet auch Container.
dockerd (docker daemon) --> containerd --> containerd-shim --> runc
Mit Nomad-Driver-Containerd ermöglicht es dem NOMAD-Client, Container direkt mit Container zu starten, ohne Docker!
Docker Daemon ist im Hostsystem nicht erforderlich.

Stellen Sie sicher, dass Ihr $ gopath korrekt eingerichtet ist.
$ 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)
Wenn Sie für arm64 kompilieren möchten, können Sie ausführen:
make -f Makefile.arm64
$ vagrant up
oder vagrant provision , wenn der Vagrant VM bereits ausgeführt wird.
Sobald das Einrichten ( vagrant up oder vagrant provision ) abgeschlossen ist und der Nomad-Server in Betrieb ist, können Sie die registrierten Task-Treiber (die auch containerd-driver anzeigen) mit:
$ nomad node status (Note down the <node_id>)
$ nomad node status <node_id> | grep containerd-driver
Hinweis: setup.sh ist Teil des Vagrant -Setups und sollte nicht direkt ausgeführt werden.
Es gibt nur wenige Beispieljobs im example .
$ nomad job run <job_name.nomad>
wird den Job starten.
Detailliertere Anweisungen finden Sie in der example README.md
Um direkt mit images und containers zu interagieren, können Sie nerdctl verwenden, ein Docker -kompatibler CLI für containerd . nerdctl ist bereits im Vagrant VM AT /usr/local/bin installiert.
Treiberkonfiguration
| Option | Typ | Erforderlich | Standard | Beschreibung |
|---|---|---|---|---|
| ermöglicht | bool | NEIN | WAHR | Tasktreiber aktivieren/deaktivieren. |
| Containerd_Runtime | Saite | Ja | N / A | Laufzeit für Container EG io.containerd.runc.v1 oder io.containerd.runc.v2 . |
| STATS_INTERVAL | Saite | NEIN | 1s | Intervall zum Sammeln TaskStats . |
| ALLE_PRIVILEGED | bool | NEIN | WAHR | Wenn er auf false festgelegt ist, verweigert der Fahrer die laufenden privilegierten Jobs. |
| Auth | Block | NEIN | N / A | Authentifizierung für ein privates Register bereitstellen. Weitere Informationen finden Sie unter Authentifizierung. |
Aufgabenkonfiguration
| Option | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| Bild | Saite | Ja | OCI Image (Docker ist auch OCI -kompatibel) für Ihren Container. |
| Image_pull_timeout | Saite | NEIN | Eine Zeitdauer, die steuert, wie lange containerd-driver wartet, bevor das OCI-Bild im Bild des Bildes abgesagt wird, wie in image angegeben. Standardeinstellungen zu "5m" . |
| Befehl | Saite | NEIN | Befehl zum Befehl zum Überschreiben im Bild. |
| Args | [] String | NEIN | Argumente an den Befehl. |
| Einstiegspunkt | [] String | NEIN | Eine Zeichenfolgeliste überschreibt den Eintragspunkt des Bildes. |
| CWD | Saite | NEIN | Geben Sie das aktuelle Arbeitsverzeichnis für Ihren Containerprozess an. Wenn das Verzeichnis nicht vorhanden ist, wird für Sie erstellt. |
| privilegiert | bool | NEIN | Führen Sie den Container im privilegierten Modus aus. Ihr Container verfügt über alle Linux -Funktionen, wenn Sie im privilegierten Modus ausgeführt werden. |
| pids_limit | INT64 | NEIN | Ein ganzzahliger Wert, der die PID -Grenze für den Container angibt. Standardmäßig unbegrenzt. |
| PID_MODE | Saite | NEIN | host oder nicht festgelegt (Standard). Setzen Sie auf host , um den PID -Namespace mit dem Host zu teilen. |
| Hostname | Saite | NEIN | Der Hostname, der dem Container zugewiesen werden soll. Wenn Sie mehr als eine von einer Aufgabe (mit der count ) mit diesem Optionssatz starten, hat jeder Container, den die Aufgabe startet, denselben Hostnamen. |
| Host_dns | bool | NEIN | Standard ( true ). Standardmäßig verwendet ein Container, der mit containerd-driver gestartet wurde, Host /etc/resolv.conf . Dies ähnelt dem docker behavior . Wenn Sie jedoch keinen Host -DNS verwenden möchten, können Sie dieses Flag deaktivieren, indem Sie host_dns=false einstellen. |
| SecComp | bool | NEIN | Aktivieren Sie das Standard -SECComp -Profil. Liste der allowed syscalls . |
| secComp_profile | Saite | NEIN | Pfad zum benutzerdefinierten SecComp -Profil. seccomp muss auf true festgelegt werden, um seccomp_profile zu verwenden. Das here gefundene Standard docker -Profil kann als Referenz verwendet und geändert werden, um ein benutzerdefiniertes SECComp -Profil zu erstellen. |
| SHM_SIZE | Saite | NEIN | Größe von /dev /shm z. "128m" Wenn Sie 128 MB von /dev /shm wollen. |
| sysctl | Karte [String] String | NEIN | Eine Schlüsselwertkarte von SYSCTL-Konfigurationen, die auf den Start auf die Container einstellen können. |
| readonly_rootfs | bool | NEIN | Container-Root-Dateisystem ist schreibgeschützt. |
| Host_network | bool | NEIN | Aktivieren Sie das Host -Netzwerk. Dies entspricht --net=host in Docker. |
| extra_hosts | [] String | NEIN | Eine Liste von Hosts, die als Host: IP angegeben werden, um zu /etc /hosts hinzugefügt zu werden. |
| Cap_add | [] String | NEIN | Fügen Sie individuelle Funktionen hinzu. |
| Cap_drop | [] String | NEIN | Inviduelle Fähigkeiten fallen lassen. |
| Geräte | [] String | NEIN | Eine Liste von Geräten, die dem Container ausgesetzt sind. |
| Auth | Block | NEIN | Authentifizierung für ein privates Register bereitstellen. Weitere Informationen finden Sie unter Authentifizierung. |
| Reittiere | []Block | NEIN | Eine Liste von Reittieren, die im Behälter montiert werden sollen. Volumen-, Bind- und TMPFS -Typ -Reittypen werden unterstützt. Die Optionen für fstab -Stil mount options werden unterstützt. |
Mountblock
{
- Typ (Zeichenfolge) (optional): Unterstützte Werte sind volume , bind oder tmpfs . Standard: Volumen.
- Ziel (Zeichenfolge) (erforderlich): Zielpfad im Container.
- Quelle (String) (optional): Quellpfad auf dem Host.
- Optionen ([] String) (optional): Mount -Optionen mount options . HINWEIS : Für Bindmontage sind mindestens rbind und ro erforderlich.
}
Binden Sie den Mount Beispiel
mounts = [
{
type = "bind"
target = "/target/t1"
source = "/src/s1"
options = ["rbind", "ro"]
}
]
Über die Option zur Task Config der mounts -Option in Additon können Sie Ihre Volumina auch mit NOMAD volume_mount stanza in den Container montieren
Siehe example job für volume_mount .
Custom SecComp -Profilbeispiel
Das here gefundene Standard docker -Profil kann heruntergeladen und geändert werden (durch Entfernen/Hinzufügen von Syscalls), um ein benutzerdefiniertes SecComp -Profil zu erstellen.
Das benutzerdefinierte SecComp -Profil kann dann unter /opt/seccomp/seccomp.json auf den Nomad -Client -Knoten gespeichert werden.
Ein Nomad -Job kann mit diesem benutzerdefinierten SECComp -Profil gestartet werden.
config {
seccomp = true
seccomp_profile = "/opt/seccomp/seccomp.json"
}
SYSCTL -Beispiel
config {
sysctl = {
"net.core.somaxconn" = "16384"
"net.ipv4.ip_forward" = "1"
}
}
auth -Strophe können Sie Anmeldeinformationen für Ihre private Registrierung festlegen, z. B. wenn Sie ein Bild aus einem privaten Repository in Docker Hub ziehen möchten.
auth Stanza kann entweder in Driver Config oder Task Config oder beides festgelegt werden.
Wenn es an beiden Stellen festgelegt ist, hat Task Config Author vor Angehörigen Driver Config -Konfiguration.
Hinweis : Im folgenden Beispiel müssen user und pass nur Platzhalterwerte sind, die durch die Angabe der Anmeldeinformationen durch den tatsächlichen username und password ersetzt werden müssen. Die folgende auth -Strophe kann sowohl für Driver Config als auch Task Config verwendet werden.
auth {
username = "user"
password = "pass"
}
nomad-driver-containerd unterstützt Host- und Bridge -Netzwerke.
Hinweis: host und bridge sind gegenseitig ausschließende Optionen, und nur eine davon sollte gleichzeitig verwendet werden.
Das Host -Netzwerk kann aktiviert werden, indem host_network in der Aufgabenkonfiguration der Jobspezifikation true wird (siehe unter Supported options ).
Bridge Network kann aktiviert werden, indem die network im Abschnitt "Aufgabengruppe" der Jobspezifikation festgelegt wird.
network {
mode = "bridge"
}
Sie müssen CNI -Plugins auf NOMAD -Client -Knoten unter /opt/cni/bin installieren, bevor Sie bridge verwenden können.
Anweisungen zur Installation von CNI -Plugins.
$ 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
Stellen Sie außerdem sicher, dass Ihre Linux -Betriebssystemverteilung konfiguriert wurde, damit der Containerverkehr über das Bridge -Netzwerk über Iptables geleitet wird. Diese Tunables können wie folgt festgelegt werden:
$ 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
Fügen Sie diese Einstellungen beim Start eines NOMAD -Client -Knotens beizubehalten, fügen Sie eine Datei hinzu, einschließlich der folgenden zu /etc/sysctl.d/ oder entfernen Sie die Datei, die Ihre Linux -Verteilung in dieses Verzeichnis einfügt.
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
NOMAD unterstützt sowohl statische als auch dynamische Port -Mapping.
Die statische Portzuordnung kann in der network hinzugefügt werden.
network {
mode = "bridge"
port "lb" {
static = 8889
to = 8889
}
}
Hier wird host Port 8889 dem container 8889 zugeordnet.
HINWEIS : Statische Anschlüsse werden normalerweise nicht empfohlen, mit Ausnahme von system oder spezialisierten Aufträgen wie Last -Balancern.
Die dynamische Portzuordnung ist auch in der network -Strophe aktiviert.
network {
mode = "bridge"
port "http" {
to = 8080
}
}
Hier wird Nomad den host einen dynamischen Port zugewiesen und dieser Port wird 8080 im Container zugeordnet.
In der nomad official documentation können Sie auch mehr über network stanza erfahren
NOMAD -Pläne für Arbeitsbelastungen verschiedener Typen in einer Gruppe generischer Hosts. Aus diesem Grund ist die Platzierung im Voraus nicht bekannt und Sie müssen die Service -Erkennung verwenden, um Aufgaben mit anderen in Ihrem Cluster bereitgestellten Diensten zu verbinden. NOMAD integriert sich in den Konsul, um die Erkennung und Überwachung von Service zu erhalten.
Eine service -Strophe kann zu Ihrer Jobspezifikation hinzugefügt werden, um die Service -Entdeckung zu ermöglichen.
Der Service Stanza weist Nomad an, einen Service bei Consul zu registrieren.
Wenn Sie die Tests lokal ausführen, verwenden Sie die im Repository bereitgestellte vagrant VM .
$ vagrant up
$ vagrant ssh containerd-linux
$ sudo make test
Hinweis : Dies sind destruktive Tests und können das System in einem veränderten Zustand lassen.
Es wird dringend empfohlen, diese Tests entweder als Teil eines CI/CD -Systems, z. B. Circleci, oder auf einer unveränderlichen Infrastruktur, z.
Sie können auch einen individuellen Test ausführen, indem Sie den Testnamen angeben. z.B
$ cd tests
$ sudo ./run_tests.sh 001-test-redis.sh
make clean
Dadurch wird Ihr Binärdatum gelöscht: containerd-driver
vagrant destroy
Dies wird Ihre Vagrant -VM zerstören.
Ubuntu (> = 16.04)
Copyright 2020 Roblox Corporation
Lizenziert unter der Apache -Lizenz, Version 2.0 ("Lizenz"). Weitere Informationen finden Sie in der Lizenz.