[LINUX] Service Mesh mit Docker Swarm gelernt

Einführung

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.

Qiita_swarm.png

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.

logo.png

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:

Port-Nummer Verwenden
2377/tcp Kommunikation für die Clusterverwaltung
4789/udp Overlay-Netzwerk
7946/tcp Kommunikation zwischen Knoten
7946/udp Kommunikation zwischen Knoten

Servicegitter

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.

swarm2-1.png

Selbst wenn beispielsweise einer der Hosts ausfällt und der Container ausfällt, kann der Dienst auf dem folgenden Weg fortgesetzt werden.

swarm2-2.png

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.

Baue Docker Swarm

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.

Manager

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.

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) : 2377".

--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.

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.

Knoten

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.

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

Bereitstellen von Docker Swarm

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

Funktionsprüfung von Docker Swarm

Ü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.

スクリーンショット 2020-02-05 23.37.20.png

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.

alb-acces.png

Der Zugriff auf die öffentliche IP-Adresse von web2 wurde beispielsweise über den Browser gestoppt.

web2-acces.png

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

Docker Schwarmwaage

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. ** ** **

Die Natur von Docker Swarm

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

Lassen Sie Docker Swarm los

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.

Knoten

Node left the swarm.

Manager

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.

Node left the swarm.

Demontage des Hafenschwarms

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.

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

Wissen

Version von Docker-Compose

Bei Verwendung von Docker Swarm ist die Version, die mit Docker-Commpose verwendet werden kann, ** 3 **.

Vorsichtsmaßnahmen beim Erstellen mit Docker-Compose

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

Bereitstellungsfehler

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.

Über das Ergebnis der Überprüfung mit der Konfiguration dieses Artikels (1 Master und 1 Knoten)

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.

abschließend

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.

Referenz

Recommended Posts

Service Mesh mit Docker Swarm gelernt
Erstellen Sie einen Webdienst mit Docker + Flask
TFTP-Server mit Docker
Proxyserver mit Docker
Hallo, Welt mit Docker
Maschinelles Lernen mit Pokemon gelernt
PySpark Leben beginnt mit Docker
Bereiten Sie die Python3-Umgebung mit Docker vor
Mit Pyradiomics erlernte Texturanalyse
Rollendes Update für Docker Swarm
Probieren Sie Selenium Grid mit Docker aus
Versuchen Sie, Jupyter Hub mit Docker zu erstellen
Erstellen Sie eine Rails-Anwendung mit Docker