Docker-Schwarm mit heterogenen Knoten: Begrenzung auf verfügbare Ressourcen?

714
r2evans

Ich habe einen kleinen Docker-Schwarm, der in meinem Büro läuft: ein 40-Core (128 GB RAM) und zwei 8-Core (16 GB RAM). Wenn ich einen Service über den Schwarm bereitstellen, werden die Aufträge ausgeführt wird, aber sie verteilen sich gleichmäßig auf Kapazität pro-Maschine ohne Rücksicht.

Ich habe den Schwarm mit dem Manager gestartet mit:

docker swarm init docker swarm update --task-history-limit 2 

und an jedem Knoten:

docker swarm join --token <token-string> <ipaddr:port> 

Dann starte ich einen Service mit:

docker service create --detach \ --mount type=bind,src=/s/mypath,dst=/home/mypath \ --entrypoint "/home/mypath/myscript.sh arg1 arg2" \ --name "mystuff" -w /home/mypath myregistry.me.com:5433/myimage 

Der Prozess arbeitet individuell. Ich habe keinen Hinweis auf Zuweisungsgewichtung oder Affinität basierend auf der Knotenstärke gefunden.

Im Idealfall würde ich gerne so etwas sagen können:

  1. Treten Sie dem Schwarm bei, nehmen Sie nicht mehr als nAufgaben (etwas naiv)
  2. dem Schwarm beitreten, meine (cpu-) Kapazität als 0.2(oder 5auf die größeren) belasten
  3. Starten Sie diesen Dienst und weisen Sie pro verfügbaren Kern nicht mehr als eine Aufgabe zu

Ich reguliere den gesamten Umfang des Dienstes mit docker service scale, aber das bietet keine Granularität. Ist es möglich, die Docker-Schwarmdienste pro Knoten nach verfügbaren Ressourcen zu regulieren?

(Dies könnte ein noch mehr Anreiz sein, auf k8s umzusteigen, was meiner Meinung nach Funktionalität in dieser Richtung bietet. Mit dem Lernen und dem Übergang, den ich steif bewaffnet habe, gibt es zunehmende Schmerzen.)

0

1 Antwort auf die Frage

1
Bret Fisher

All dies ist in der Tat möglich, wenn Sie einen Swarm-Service erstellen oder aktualisieren.

Dies fällt unter die Optionen für die Platzierung von Containern in diesen Befehlen. Wenn es nur um Ressourcenreservierung geht, machen Sie sich Gedanken über --reserve-cpuund --reserve-memory. Dadurch wird sichergestellt, dass der Knoten über die freie CPU oder den freien Speicherplatz auf einem Knoten verfügt, bevor er die einzelnen Container ausführt.

Beispiel: Wenn Sie einen Swarm-Dienst benötigen, um zwei PHP-Replikate bereitzustellen, und jeder sicherstellen muss, dass er sich auf einem Knoten mit 1 GB Arbeitsspeicher und einer CPU befindet, service create --reserve-cpu 1 --reserve-memory 1GB phpplanen Sie nur die Container auf Knoten, die dem Swarm-Scheduler über diese Menge an Hardware verfügen verfügbar. Wenn ein Knoten nur über zwei logische CPUs verfügt, werden niemals mehr als 2 Replikate dieses Dienstes auf diesem Knoten bereitgestellt.

Es gibt viele andere Möglichkeiten, die Aufgabenplatzierung zu steuern, einschließlich der Begrenzung der CPU / des Arbeitsspeichers, des "Modus" (global / ersetzt), der Diensteinschränkungen (Etikettenanpassung), der Platzierungspräferenzen und der Verfügbarkeit von Knoten. Die, die ich erwähne, sind wahrscheinlich Ihre Antwort. Bret Fisher vor 6 Jahren 0
Das war einfacher als ich erwartet hatte, nicht sicher, wie ich es vermisst habe. Danke, Bret! r2evans vor 6 Jahren 0
Eine andere Frage, wenn Sie es vorziehen: Gibt es eine einfache Möglichkeit, die Gesamtzahl der gestarteten Instanzen zu begrenzen? Das heißt, "diese Aufgabe 100 Mal ausführen" (und sich entsprechend auf die heterogenen Arbeiter ausbreiten) "und dann aufhören"? r2evans vor 6 Jahren 0
nicht eingebaut. Swarm geht davon aus, dass ein Dienst lange läuft. Zwei Optionen: Versuchen Sie, etwas mit den Diensterstellungsoptionen zu hacken [nach Neustart suchen] (https://docs.docker.com/engine/reference/commandline/service_create/), dies ist jedoch normalerweise keine gute Erfahrung. Die beste Option ist, JaaS (Jobs as a Service) zu überprüfen. Von Alex Ellis https://github.com/alexellis/jaas, das auf Schwarm läuft und einmalige Aufgaben ausführen kann. Bret Fisher vor 6 Jahren 0
Ich habe das mit Schwarm schon vermutet (ein Grund, warum k8s ansprechend sein könnte). Ich hatte JaaS noch nicht gesehen, ich werde es überprüfen. Vielen Dank! r2evans vor 6 Jahren 0
Ja, Swarm hat Dinge eingebaut, die K8s nicht hat, und K8s hat dasselbe. Deshalb gibt es mehrere erfolgreiche Orchestratoren (Nomaden, Mesos, Schwarm, K8s usw.). Bret Fisher vor 6 Jahren 0