In diesem Artikel erstellen Sie einen Cluster mit Docker Swarm und erfahren mehr über Service-Meshes.
Die Umgebung verwendet ELB (Elastic Load Balancing) von AWS und zwei EC2-Instanzen (Amazon EC2), um einen Docker Swarm-Cluster zu erstellen.
Der Vorteil der Bereitstellung von Docker Swarm im Vergleich zu Kubernetes sind die geringen Bereitstellungskosten. Docker Swarm hat geringere Hürden als Kubernetes, daher denke ich, dass es ideal für Systeme ist, die versuchen, Containertechnologie in die Produktion zu bringen.
** Erleben Sie die Bedeutung des Service-Netzes durch Docker Swarm. ** ** **
Docker Swarm Docker Swarm ist ein von Docker bereitgestelltes Orchestrierungswerkzeug. Mit Docker Swarm können Sie mehrere Hosts zusammenfassen und Ihre Container einfach bereitstellen und skalieren.
Docker Swarm besteht aus Managern und Knoten, wobei ** Swarm ** für Swarm steht. Um einen Docker Swar-Cluster zu erstellen, müssen Sie folgende Schritte ausführen:
[x] Installieren Sie Docker auf dem Manager und dem Knoten.
[x] Ermöglichen Sie die erforderliche Kommunikation in der Firewall, damit die Kommunikation zwischen dem Manager und dem Knoten möglich ist.
Von der Firewall zugelassene Regeln
Port-Nummer | Verwenden |
---|---|
2377/tcp | Kommunikation für die Clusterverwaltung |
4789/udp | Overlay-Netzwerk |
7946/tcp | Kommunikation zwischen Knoten |
7946/udp | Kommunikation zwischen Knoten |
Das Service-Mesh setzt eine Microservice-Architektur voraus und bietet einen Mechanismus zur Steuerung der Kommunikation zwischen Anwendungen. Diese kontrollierte Kommunikation ist wie ein Netz gewebt, was die Zuverlässigkeit verbessert.
Im Fall eines Hosts mit zwei Einheiten lautet der normale Zugriffspfad beispielsweise wie folgt.
Wenn mit einem Browser auf den DNS-Namen des Load Balancers zugegriffen wird, verteilt der Load Balancer, der die HTTP-Anforderung empfängt, die HTTP-Anforderung an den öffentlichen Port des Hosts, der das Back-End im Round Robin ist.
Selbst wenn beispielsweise einer der Hosts ausfällt und der Container ausfällt, kann der Dienst auf dem folgenden Weg fortgesetzt werden.
Zusammenfassend lässt sich sagen, dass Sie, wenn Sie lediglich eine Konfiguration haben, bei der die Anwendungen auf Hostebene getrennt sind, keine Dienste bereitstellen können, wenn einer der Hosts ausfällt. Daher ist es möglich, ein einzelnes Hindernis zu beseitigen, indem die Containertechnologie verwendet und zu einem Servicegitter gemacht wird.
In diesem Abschnitt wird das Verfahren zum Erstellen von Docker Swarm beschrieben. Arbeiten Sie zum Erstellen von Docker Swarm in der Reihenfolge von Manager und Knoten.
In dem Beispiel in diesem Artikel ist web1 der Manager und web2 der Knoten. Die Bereitstellung erfolgt mithilfe des Nginx-Images.
Voraussetzung ist, dass Docker bereits installiert ist und die oben beschriebene Firewall ebenfalls zulässig ist. Da in diesem Artikel die Mindestkonfiguration verwendet wird, gibt es außerdem einen Manager und einen Knoten.
Initialisieren Sie zunächst Docker Swarm. ** Schwarmmodus ** wird durch Ausführen des Befehls "Docker Swarm Init" aktiviert.
Wenn Sie mehrere IP-Adressen haben, geben Sie die IP-Adresse der Schnittstelle, die für die Kommunikation mit anderen Knoten verwendet wird, im Argument "Advertise-Adr" an.
# docker swarm init --advertise-addr <IP-Adresse>
Swarm initialized: current node (zirc78nsch77ox8di6021ux4n) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-459p0pkyqgxgkhaggjhavd419ldujenqttm1mqmwup0qz9m5qv-1kj3jy6ozwrr2fkj1qvas294a <IP-Adresse des Managers>:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Notieren Sie sich nach Ausführung des Befehls das Ausgabeergebnis "Docker Swarm Join - Token SWMTKN-1- (Abkürzung)
--Knotenbestätigung
# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
zirc78nsch77ox8di6021ux4n * web1 Ready Active Leader 18.09.9-ce
Für Manager wird ** Leader ** an MANAGER STATUS ausgegeben.
# docker network ls
NETWORK ID NAME DRIVER SCOPE
53703efd3d07 bridge bridge local
aacf6f5e0eb4 docker_gwbridge bridge local
1f0d0e4ae3e7 host host local
xip5tlqmokpb ingress overlay swarm
2d36f1c8c80f none null local
Bei der Initialisierung von Swarm werden zwei neue Netzwerke (docker_gwbridge, ingress) erstellt.
Führen Sie als Nächstes den folgenden Befehl auf der Knotenseite aus, um den Knoten mit dem Docker Swarm-Cluster zu verbinden.
Der als Argument von "--token" verwendete Wert ist ein Beispiel. Sie können die Ausgabe des obigen Befehls "Docker Swarm Init" kopieren und einfügen.
Sie können das Token auch erneut anzeigen, indem Sie auf der Managerseite den Befehl "Docker-Schwarm-Join-Token-Worker" ausführen.
# docker swarm join --token SWMTKN-1- (Ausgelassen) <Manager-IP-Adresse>: 2377
This node joined a swarm as a worker.
Führen Sie zur Bestätigung auf der Managerseite den Befehl docker node ls
erneut aus, um zu bestätigen, dass der Knoten erkannt wird.
--Knotenbestätigung
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
zirc78nsch77ox8di6021ux4n * web1 Ready Active Leader 18.09.9-ce
n2o22ptdmyhan8qg0ijmo0qn5 web2 Ready Active 18.09.9-ce
In diesem Artikel werden wir Docker-Commpose bereitstellen, das einfach zu verwalten ist.
Sie können auch mit dem Befehl docker service create
bereitstellen. Ich werde die Erklärung von Service und Stack weglassen.
Die Bereitstellungsarbeiten werden auf der Managerseite ausgeführt. Wechseln Sie in ein beliebiges Verzeichnis und erstellen Sie die folgende Datei "docker-commpose.yml".
version: "3"
services:
web:
image: nginx
deploy:
replicas: 2
#resources:
# limits:
# cpus: "0.1"
# memory: 100M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- webnet
networks:
webnet:
Führen Sie nach dem Erstellen der Datei "docker-commpose.yml" den folgenden Befehl aus, um sie bereitzustellen.
test
ist ein Beispiel, geben Sie also einen beliebigen Namen an.
# docker stack deploy -c docker-commpose.yml test
Updating service test_web (id: egubeieuri00rzmm9imsna93o)
Nach der Bereitstellung können Sie den Dienststatus mit dem folgenden Befehl überprüfen. Da ** REPLICAS ** 2 ist, werden zwei Container ausgeführt.
# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
r04mfg1se3nh test_web replicated 2/2 nginx:latest *:80->80/tcp
Wenn Sie den Befehl docker container ps -a
auf der Manager- und Knotenseite ausführen, können Sie sehen, dass der Container ausgeführt wird.
--Managerseite
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a26c3ca6df7 nginx:latest "nginx -g 'daemon of…" 3 seconds ago Up 2 seconds 80/tcp test_web.1.mnnz40tdykzd2intwz5hf68bs
--Knotenseite
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
614c19349bf0 nginx:latest "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp test_web.2.6om5oazbavassohd4akucbum2
Überprüfen Sie die Funktion von Docker Swarm.
Greifen Sie über Ihren Browser auf den DNS-Namen des Load Balancers zu und überprüfen Sie, ob die Last normal verteilt ist.
Wenn Sie das Protokoll des Containers überprüfen, können Sie feststellen, dass die Last per Round Robin verteilt wird.
Überprüfen Sie die ** CONTAINER ID ** mit dem Befehl docker container ps -a
.
# docker logs -f <CONTAINER ID>
10.255.0.3 - - [06/Feb/2020:14:20:51 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" "<Globale IP der Zugriffsquelle>"
Stoppen Sie als Test den Container, der auf web2 (Knotenseite) ausgeführt wird.
# docker stop <CONTAINER ID>
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
423f673b0513 nginx:latest "nginx -g 'daemon of…" 19 hours ago Exited (0) 5 seconds ago test_web.2.kc7yypyasgvjtolsb1zwmhjoy
Derzeit wird der Container nicht auf web2 ausgeführt. Stellen Sie sicher, dass Sie auf den DNS-Namen des Load Balancers zugreifen können.
Der Zugriff auf die öffentliche IP-Adresse von web2 wurde beispielsweise über den Browser gestoppt.
Sie können den Zugriff auf die öffentliche IP des gestoppten web2 (Knotens) im Zugriffsprotokoll des Containers auf Web1 (Manager) überprüfen.
10.255.0.3 - - [07/Feb/2020:02:19:01 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36" "-"
Sie können vom gestoppten Web2 (Knotenseite) lokal auf den Container zugreifen, indem Sie den folgenden Befehl ausführen.
# curl localhost 80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
curl: (7) Couldn't connect to server
Im Protokoll von web1 (Manager) wird es wie folgt ausgegeben.
10.255.0.2 - - [07/Feb/2020:02:41:47 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.1" "-"
Wenn Sie den 4789-Port in web1 (Manager) sichern und anzeigen, können Sie die Kommunikation des Overlay-Netzwerks sehen.
# tcpdump -nli eth0 port 4789 -Av
Sie können skalieren, indem Sie den folgenden Befehl ausführen, während der Dienst bereits ausgeführt wird. Der folgende Befehl ändert die Anzahl der Container in 4 Container.
# docker service scale test_web=4
test_web scaled to 4
overall progress: 4 out of 4 tasks
1/4: running [==================================================>]
2/4: running [==================================================>]
3/4: running [==================================================>]
4/4: running [==================================================>]
verify: Service converged
Führen Sie nach der Skalierung den Befehl "Docker Container ps -a" aus, und Sie werden feststellen, dass die Anzahl der Container zunimmt.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41962946aa48 nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp test_web.4.pytl36ejcd81ybthisxfo47br
423f673b0513 nginx:latest "nginx -g 'daemon of…" 7 hours ago Up 7 hours 80/tcp test_web.2.kc7yypyasgvjtolsb1zwmhjoy
** Bei der Bereitstellung müssen die Anwendungsressourcen nicht für jeden Server ersetzt werden, sondern nur für einen Manager. ** ** **
Docker Swarm ist gleichgestellt.
Insbesondere verwaltet Docker Swarm eine bestimmte Anzahl von Replikaten. Wenn also einer der Cluster-Hosts ausfällt, wird der Container auf diesem Host gestartet.
Das Folgende ist die Ausgabe des Befehls "Docker Container ps -a". In web1 und web2 werden beispielsweise Container ausgeführt.
e5ccbfa9739b nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp test_web.1.mrgkhbd7juer72v6bv0l42fxq
4820c7bbe9c1 nginx:latest "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp test_web.2.wfe1n11s8940rdl8r1c47o6nc
Der web2-Host wurde gestoppt. Wenn festgestellt wird, dass web2 nicht verfügbar ist, wird ein Container auf web1 erstellt.
0a88f53039a3 nginx:latest "nginx -g 'daemon of…" 5 seconds ago Created test_web.2.p06zas3c3kt9ekjojhhfnl3co
e5ccbfa9739b nginx:latest "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp test_web.1.mrgkhbd7juer72v6bv0l42fxq
Auf web1 laufen zwei Container.
0a88f53039a3 nginx:latest "nginx -g 'daemon of…" 37 seconds ago Up 31 seconds 80/tcp test_web.2.p06zas3c3kt9ekjojhhfnl3co
e5ccbfa9739b nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp test_web.1.mrgkhbd7juer72v6bv0l42fxq
Beschreibt, wie Docker Swarm abgebrochen wird.
Führen Sie zunächst den folgenden Befehl auf der Managerseite aus, um den Dienst zu löschen.
# docker service rm test_web
test_web
Als nächstes arbeiten Sie am Knoten und dann am Manager.
# docker swarm leave
Node left the swarm.
Stellen Sie sicher, dass der STATUS des Knotens ** DOWN ** ist.
--Knotenbestätigung
# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
zirc78nsch77ox8di6021ux4n * web1 Ready Active Leader 18.09.9-ce
n2o22ptdmyhan8qg0ijmo0qn5 web2 Down Active 18.09.9-ce
Löschen Sie den Knoten. Geben Sie den Knotennamen im optionalen Argument an.
--knoten gelöscht
# docker node rm --force web2
web2
Stellen Sie sicher, dass der Knoten vom Manager nicht mehr erkannt wird.
--Knotenbestätigung
# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
zirc78nsch77ox8di6021ux4n * web1 Ready Active Leader 18.09.9-ce
Trennen Sie zum Schluss den Manager.
# docker swarm leave --force
Node left the swarm.
Wenn Sie Docker Swarm nicht verwenden, gehen Sie auf der Managerseite wie folgt vor:
Stellen Sie sicher, dass der Knoten nicht vorhanden ist.
--Knotenbestätigung
# docker node ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
Stellen Sie sicher, dass das von Docker Swarm erstellte Netzwerk gelöscht wurde. Das Netzwerk docker_gwbridge bleibt bestehen.
# docker network ls
NETWORK ID NAME DRIVER SCOPE
987cfc73d87c bridge bridge local
aacf6f5e0eb4 docker_gwbridge bridge local
1f0d0e4ae3e7 host host local
2d36f1c8c80f none null local
Führen Sie den folgenden Befehl aus, um alle nicht verwendeten Ressourcen zu löschen.
# docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Networks:
docker_gwbridge
Deleted Images:
untagged: nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
deleted: sha256:2073e0bcb60ee98548d313ead5eacbfe16d9054f8800a32bedd859922a99a6e1
deleted: sha256:a3136fbf38691346715cac8360bcdfca0fff812cede416469653670f04e2cab0
deleted: sha256:99360ffcb2da18fd9ede194efaf5d4b90e7aee99f45737e918113e6833dcf278
deleted: sha256:488dfecc21b1bc607e09368d2791cb784cf8c4ec5c05d2952b045b3e0f8cc01e
untagged: nginx@sha256:70821e443be75ea38bdf52a974fd2271babd5875b2b1964f05025981c75a6717
deleted: sha256:5ad3bd0e67a9c542210a21a3c72f56ef6387cf9b7f4c2506d2398d55a2593ed0
deleted: sha256:b69e2ed46519bc33e7c887967e4f61a2ee53aef165b70f75e208937fb42e7b4c
deleted: sha256:4cb7f732537bf0f65cd9f8f7b63bbe71abcf9d0df396f58621ef3be0b2487b27
deleted: sha256:556c5fb0d91b726083a8ce42e2faaed99f11bc68d3f70e2c7bbce87e7e0b3e10
Total reclaimed space: 253.4MB
Bei Verwendung von Docker Swarm ist die Version, die mit Docker-Commpose verwendet werden kann, ** 3 **.
Beim Erstellen (Stapeln) mit Docker-Commpose ist ein Image erforderlich.
Aus der Referenz zu Compose File Version 3
Hinweis: (Version 3) Diese Option wird ignoriert, wenn der Stapel im Schwarmmodus mithilfe der Compose-Datei bereitgestellt wird. Dieser Docker-Stack-Befehl akzeptiert nur vorgefertigte Images.
Daher ist die Umgebung der ** Docker-Registrierung ** erforderlich.
Informationen zum lokalen Einrichten der Docker-Registrierung finden Sie unter der folgenden offiziellen URL.
Wenn Sie beispielsweise den Build angeben und die Bereitstellung wie unten gezeigt ausführen,
version: '3'
services:
app:
build: ./src
Die folgende Fehlermeldung wird ausgegeben und kann nicht bereitgestellt werden.
failed to create service stackdemo_backend: Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: image reference must be provided
Wenn Sie beispielsweise einen Host mit zwei Einheiten mit dem Wert ** replicas ** in der Datei docker-commpose.yml auf 2 bereitstellen, wird dieser grundsätzlich in einem Container für einen Host verteilt.
Wenn während der Bereitstellung zwei Container auf einem Host gestartet werden, ist möglicherweise ein Fehler aufgetreten, und die Container konnten nicht auf einem Host gestartet werden. Unter Linux kann der Fehler über das Syslog bestätigt werden.
Das Ergebnis der Überprüfung mit der Konfiguration dieses Artikels (1 Master und 1 Knoten) wird als Erinnerung beschrieben.
Einfach ausgedrückt, ein Master und ein Node können keine echte Redundanz erreichen.
Um die Zuverlässigkeit weiter zu verbessern, muss mit zwei Mastern Redundanz hergestellt werden. Es gibt eine offizielle Beschreibung der Master-Redundanz.
** Verhalten, wenn ein Container in der Konfiguration dieses Artikels gestoppt oder gelöscht wird (1 Master und 1 Knoten) **
Wenn Sie einen der Master- und Node-Container stoppen oder löschen, wird er sich selbst neu regenerieren, bis er die in ** replicas ** in der Datei docker-compose.yml
definierte Anzahl erreicht. Sie können auch über das Service-Mesh auf die öffentliche IP zugreifen, während diese vorübergehende Unterbrechung auftritt. Wenn es jedoch lokal ist, tritt eine vorübergehende Unterbrechung auf.
** Verhalten, wenn der Knotenhost selbst in der Konfiguration dieses Artikels gestoppt wird (1 Master und 1 Knoten) ** Auf dem Knoten ausgeführte Container werden auf der Masterseite erstellt, bis die in ** Replikaten ** der Datei "docker-compose.yml" definierte Nummer erreicht ist. (Die Bewegung ähnelt der Vmotion von Vmware, aber die Realität sieht anders aus.) Selbst wenn Node gestartet wird, wird der auf Node ausgeführte Container danach nicht automatisch wiederhergestellt, sodass manuelle Maßnahmen erforderlich sind. Übrigens, wenn Sie den zuvor im Master erstellten Container stoppen oder löschen, wird der Container auf der Knotenseite erneut erstellt.
** Verhalten, wenn der Master-Host selbst in der Konfiguration dieses Artikels gestoppt wird (1 Master und 1 Knoten) ** Der Master of Docker Swarm wird gestoppt, aber das Service-Mesh kann auf ihn zugreifen, damit er als Anwendung fortgesetzt werden kann.
Orchestrierungswerkzeuge sind eine wesentliche Technologie für die moderne Anwendungsentwicklung, bei der Unsicherheit und schnelle Änderungen erforderlich sind.
Als Anwendung kann die serverlose Technologie verwendet werden, um Schwellenwerte für CPU- und Speicherressourcen festzulegen. Wenn die Schwellenwerte überschritten werden, kann der Server skaliert werden.
Recommended Posts