Erstellen eines Dienstes mit Platzierungsbeschränkungen und -präferenzen
In diesem Schritt lernen Sie, wie Sie Platzierungsbeschränkungen und -präferenzen nutzen, um zu steuern, wo Ihre Dienstaufgaben innerhalb des Docker Swarms deployed werden. Platzierungsbeschränkungen sind harte Anforderungen, die ein Knoten erfüllen muss, damit eine Aufgabe auf ihm geplant werden kann. Platzierungspräferenzen sind weiche Anforderungen, die die Planung beeinflussen, aber nicht verhindern, dass eine Aufgabe geplant wird, wenn kein Knoten die Präferenz erfüllt.
Zunächst lassen Sie uns den aktuellen Knoten untersuchen, um seine Labels (Bezeichnungen) zu sehen. Labels sind Schlüssel-Wert-Paare, die Sie an Knoten anhängen können, um Metadaten bereitzustellen.
docker node inspect self --format '{{ .Spec.Labels }}'
Dieser Befehl untersucht den aktuellen Knoten (identifiziert durch self
) und formatiert die Ausgabe, um seine Labels anzuzeigen. Standardmäßig gibt es möglicherweise keine benutzerdefinierten Labels.
Fügen wir dem aktuellen Knoten ein Label hinzu. Wir werden das Label node_type=app
hinzufügen.
docker node update --label-add node_type=app self
Dieser Befehl aktualisiert den aktuellen Knoten und fügt das Label node_type=app
hinzu.
Jetzt überprüfen wir, ob das Label hinzugefügt wurde.
docker node inspect self --format '{{ .Spec.Labels }}'
Sie sollten map[node_type:app]
in der Ausgabe sehen, was darauf hinweist, dass das Label erfolgreich hinzugefügt wurde.
Jetzt erstellen wir einen replizierten Dienst namens my-constrained-service
mit einer Platzierungsbeschränkung, die erfordert, dass der Knoten das Label node_type=app
hat. Wir verwenden das nginx
-Image.
docker service create \
--name my-constrained-service \
--replicas 1 \
--constraint 'node.labels.node_type == app' \
nginx:latest
Dieser Befehl erstellt einen Dienst mit einer Beschränkung. --constraint 'node.labels.node_type == app'
gibt an, dass Aufgaben für diesen Dienst nur auf Knoten geplant werden können, bei denen das Label node_type
gleich app
ist. Da wir dieses Label dem aktuellen Knoten hinzugefügt haben, sollte die Aufgabe hier geplant werden.
Überprüfen Sie den Dienststatus und die Aufgaben:
docker service ls
docker service ps my-constrained-service
Sie sollten my-constrained-service
aufgeführt sehen und seine Aufgabe auf dem aktuellen Knoten laufen.
Jetzt erstellen wir einen anderen Dienst mit einer Platzierungspräferenz. Platzierungspräferenzen werden verwendet, um den Scheduler (Planer) zu leiten, werden aber nicht streng 强制执行。Wir verwenden das busybox
-Image und bevorzugen Knoten mit dem Label node_type=database
. Da unser aktueller Knoten dieses Label nicht hat, wird die Aufgabe dennoch auf dem aktuellen Knoten geplant, aber wenn es andere Knoten mit diesem Label gäbe, würde der Scheduler diese bevorzugen.
Zunächst laden wir das busybox
-Image herunter.
docker pull busybox:latest
Jetzt erstellen wir den Dienst mit einer Platzierungspräferenz.
docker service create \
--name my-preferred-service \
--replicas 1 \
--placement-pref 'spread=node.labels.node_type' \
busybox:latest sleep infinity
Die Option --placement-pref 'spread=node.labels.node_type'
teilt dem Scheduler mit, die Aufgaben auf Knoten zu verteilen, basierend auf dem Wert des node_type
-Labels. In einem Multi-Knoten-Swarm mit verschiedenen node_type
-Labels würde dies die Aufgaben gleichmäßiger verteilen. In dieser Ein-Knoten-Umgebung wird die Aufgabe einfach auf dem verfügbaren Knoten geplant.
Überprüfen Sie den Dienststatus und die Aufgaben:
docker service ls
docker service ps my-preferred-service
Sie sollten my-preferred-service
aufgeführt sehen und seine Aufgabe auf dem aktuellen Knoten laufen.