2017-09-25 6 views
1

Ich habe einen Schwarm besteht aus drei Knoten:Docker Schwarm Skalierungsverhalten auf Port-Mapping

$ sudo docker node ls 
ID       HOSTNAME   STATUS    AVAILABILITY  MANAGER STATUS 
i12s3zxsn4vu1c98bv3i5idr8  node03   Ready    Active 
i2ckxvsju4tmommxim3dbfq7l  node02   Ready    Active 
wak4isl46dn7pbo39drrhphju * node01   Ready    Active    Leader 

Dann laufe ich 1 Replik von nginx auf diesem Schwarm und Karte seinen Port 8080:

$ sudo docker service create --replicas 1 --publish 8080:80 --name nginx nginx 
$ sudo docker service ls 
ID     NAME    MODE    REPLICAS   IMAGE    PORTS 
neahnb9mvi1i  nginx    replicated   1/1     nginx:latest  *:8080->80/tcp 

von dort i nginx auf http://node01:8080

Weiter erreichen kann, skalieren ich nginx Instanzen bis 6:

$ sudo docker service scale nginx=6 
$ sudo docker service ls 
ID     NAME    MODE    REPLICAS   IMAGE    PORTS 
neahnb9mvi1i  nginx    replicated   6/6     nginx:latest  *:8080->80/tcp 

Von dort aus kann ich noch nginx auf http://node01:8080 erreichen.

Wenn jedoch ein Docker-Schwarm mehrere Knoten als eindeutigen Host exponiert, wie verwaltet er den Port während einer solchen Skalierung, da alle meine nginx-Dienste auf demselben 8080-Port zugeordnet sind? Gibt es einen Round-Robin-Load-Balancing zwischen allen Service-Instanzen, der intern durch Schwarm erfolgt und die Antwort auf 8080 zurückgibt?

Antwort

0

Sie können jeden Dienst (der mit einem Stack bereitgestellt wird) erreichen, der seinen Port freigibt, indem er die IP einer beliebigen Maschine im Schwarm und diesem Port verwendet. Docker-Schwarm leitet diese Anfrage an eines der Replikate weiter. Welches Replikat durch den Status "healthstate" (ungesunde Dienste werden ignoriert) und die Load-Balancing-Option, die standardmäßig Round-Robin ist, konfiguriert wird.