Docker-Cross-Server-Kommunikations-Overlay-Lösung (Teil 1) Consul-Einzelinstanz

Docker-Cross-Server-Kommunikations-Overlay-Lösung (Teil 1) Consul-Einzelinstanz

Szenario

Die Microservices des Unternehmens werden bald online gehen. Microservices werden mithilfe von Docker-Containern bereitgestellt. Alle Services werden auf demselben Host bereitgestellt. Die bei Nacos registrierte IP und der PORT sind die Intranet-IP und die im Dockerfile definierte Portnummer. Es scheint, dass es kein Problem gibt. Es kann auch über das Gateway aufgerufen werden. Bitte beachten Sie, dass es eine große Prämisse gibt:

Alle Service-Container müssen auf demselben Host bereitgestellt werden!

Wenn die Dienstinstanzen nicht auf demselben Host bereitgestellt werden, sich der Gateway-Dienst beispielsweise auf Server A und Dienst A auf Server B befindet und beide bei Nacos (oder anderen Registrierungszentren) registriert sind, stammen die gemeldeten IP-Adressen alle aus dem Intranet. Wenn eine externe Anfrage eingeht, findet das Gateway die entsprechende Intranet-IP-Adresse von Dienst A über die Dienstliste von Nacos, aber der Aufruf schlägt fehl.

ps: Wie kann die Intranetanbindung erfolgen...

Aufgabe

Microservice-Container können auf unterschiedlichen Servern liegen und sich gegenseitig aufrufen

Idee

  • Da die gemeldete IP aus dem Intranet stammt, werde ich ihn einfach bitten, die IP und den Port des Hostcomputers zu melden.
  • Verwenden des Host-Netzwerkmodus von Docker
  • Ändern Sie das Bereitstellungsskript, um die Host-IP und die festgelegte Zuordnungsportnummer abzurufen, wenn Sie den Container über die Shell bereitstellen.
  • Machen Sie das Docker-Netzwerk interoperabel

analysieren

Nachfolgend finden Sie eine Erläuterung des Problems gemäß dem Abschnitt „Ideen“ weiter oben.

1. Nach Durchsicht der offiziellen Dokumente und von Github gibt es zwei Lösungen:

  • Fester IP-Port, Host-IP und Port in der Konfigurationsdatei fest codiert: Es scheint gelöst zu sein, aber das Problem ist, dass es nicht horizontal erweitert werden kann - kaum nutzbar
  • Die Netzwerkkarte wurde repariert, um zu verhindern, dass aufgrund mehrerer Netzwerkkartenumgebungen der falsche IP-Port gemeldet wird: Es ist nutzlos. Nach dem Aufrufen des Containers stellte ifconfig fest, dass nur zwei interne Netzwerkkarten vorhanden sind, eth0 und lo . Die IP der entsprechenden Netzwerkkarte ist die interne Netzwerk-IP. Es ist immer noch nutzlos.

2. Wenn Sie den Host-Netzwerkmodus von Docker verwenden, werden Sie feststellen, dass die diesmal gemeldete IP tatsächlich die Host-IP ist, aber die Portnummer falsch ist ... Wenn Sie den Java-Parameter verwenden, um die über die Shell zuzuordnende Portnummer zu übergeben, ist dies theoretisch möglich. Der einzige Nachteil besteht darin, dass docker ps die Portnummer nicht mehr direkt sehen kann und Sie zusätzlich docker inspect verwenden müssen - Sie können verwenden

3. Die zugeordnete Portnummer kann abgerufen werden, aber der Name der Netzwerkkarte des Hosts ist anders und nach der Festcodierung nicht flexibel. Was ist, wenn einige eth0 und einige ens33 sind? Es gibt noch viele weitere unvorhersehbare Situationen! ——Vielleicht kann es verwendet werden

4. Teilen Sie über einige ausgereifte Docker-Containernetzwerke, aber es wird einige Leistungseinbußen geben - vollständig verfügbar

Konzept und Auswahl

Am zuverlässigsten ist die Verwendung der Docker-Netzwerkfreigabe. Mithilfe von Suchmaschinen habe ich beschlossen, Overlay zu verwenden, um den Effekt zu erzielen.

Hier ist eine kurze Beschreibung von Overlay:

Wenn Container über zwei Hosts hinweg kommunizieren, verwenden sie für die Kommunikation den Overlay-Netzwerkmodus. Wenn der Host verwendet wird, kann die hostübergreifende Kommunikation auch durch die direkte Verwendung der physischen IP-Adresse erreicht werden. Overlay erstellt ein virtuelles Netzwerk, beispielsweise die IP-Adresse 10.0.2.3. In diesem Overlay-Netzwerkmodus gibt es eine Adresse ähnlich einem Service-Gateway, die das Paket an die Adresse des physischen Servers weiterleitet und schließlich durch Routing und Switching die IP-Adresse eines anderen Servers erreicht.

Um ein Overlay-Netzwerk zu implementieren, müssen Sie eine KV-Datenbank einführen, um Netzwerkstatusinformationen, einschließlich Netzwerk, Endpunkt, IP usw., zu speichern. Consul, Etcd und ZooKeeper sind allesamt von Docker unterstützte KV-Datenbanken

Wir verwenden hier Consul. Im Vergleich zu anderen KV-Datenbanken ist die von Consul bereitgestellte Schnittstelle für die Verwaltung bequem, sodass Consul hier zur Implementierung von Overlay verwendet wird

Indem Sie den Docker-Daemon jedes Servers seine eigene IP-Adresse bei Consul registrieren lassen, können Sie das Docker-Intranet gemeinsam nutzen. Das hier gemeinsam genutzte Intranet befindet sich im Overlay-Netzwerkmodus. Nur Container, die dasselbe Overlay-Netzwerk in der registrierten Docker-Umgebung verwenden, können miteinander kommunizieren.

ps: Nach der Erstellung können Cross-Server-Container, die das Overlay-Netzwerk nicht verwenden, nicht mehr gepingt werden

Ein kleiner Test

Single-Node-Consul implementiert Overlay-Netzwerk mithilfe eines Docker-Images

Umgebungsbeschreibung

Server-Betriebssystem Host-IP Docker-Version Name der Netzwerkkarte
Ubuntu Server 18.04 LTS 192.168.87.133 18.09.6 ens33
Ubuntu Server 18.04 LTS 192.168.87.139 18.09.7 ens33
Die zu verwendende Consul-Version ist 1.5.2, die derzeit die kleinste Schwachstelle auf Docker Hub aufweist.

Diese Testumgebung ist für Linux-Distributionen geeignet, die von Systemd verwaltet werden

Consul hat das inoffizielle Progrium/Consul nicht verwendet, hauptsächlich weil dieses Image zu alt ist. Wenn es vor vier Jahren Schwachstellen gab, konnten diese nicht rechtzeitig behoben werden, also bin ich zu <hub.docker.com> gegangen, um alle offiziellen Fallstricke zu erkunden! 💔

Vorsichtsmaßnahmen

Jeder Host, auf dem Docker ausgeführt wird, muss einen anderen Hostnamen haben. Sie können verwenden

$ sudo hostnamectl set-hostname Ihr neuer Hostname

Der gleiche Hostname führt dazu, dass die Host-Docker mit dem gleichen Namen nicht miteinander kommunizieren können.

Praxisnah

Bereiten Sie Consul für den Start auf dem 133-Server unter Verwendung des Images vor, sodass Sie zunächst die Startparameter des Docker-Daemons so konfigurieren können, dass sie auf den 133-Server verweisen.

Ändern Sie den Docker.Service der Server 133 bzw. 139.

$ ifconfig
#Die störende Netzwerkkarte wurde entfernt und der Name der Netzwerkkarte lautet ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        inet 192.168.87.133 Netzmaske 255.255.255.0 Broadcast 192.168.87.255
        inet6 fe80::20c:29ff:fe02:e00a Präfixlänge 64 Bereichs-ID 0x20<Link>
        Ether 00:0c:29:02:e0:0a txqueuelen 1000 (Ethernet)
        RX-Pakete 156739 Bytes 233182466 (233,1 MB)
        RX-Fehler 0 verloren 0 Überläufe 0 Frame 0
        TX-Pakete 45173 Bytes 2809606 (2,8 MB)
        TX-Fehler 0 verloren 0 Überläufe 0 Träger 0 Kollisionen 0

$ vim /etc/docker/daemon.json 

Speichern und beenden.

  • cluster-store : Die Leader-Adresse des konfigurierten Consul. Die einzelnen Einheiten können direkt geschrieben werden. Andere Software sollte das Protokoll beachten.
  • cluster-advertise : Geben Sie die Netzwerkkarte und den Port an, die die Nachrichten empfangen sollen, und geben Sie außerdem IP:PORT an.

Eine andere Möglichkeit besteht darin, docker.service direkt zu ändern, wie unten gezeigt:

$ cd /etc/systemd/system/multi-user.target.wants
$ sudo vim docker.service

Suchen Sie nach dem Wort ExecStart= und fügen Sie am Ende dieser Zeile den folgenden Code hinzu

--cluster-store=consul://192.168.87.133:8500 --cluster-advertise=ens33:2375

Die Wirkung ist wie folgt:

Der Operationseffekt stimmt mit der obigen Methode überein

Führen Sie dann den Befehl aus, um den Docker-Dienst neu zu starten. Die Vorgehensweise des anderen Servers ist dieselbe. Achten Sie auf den Namen der Netzwerkkarte.

$ sudo systemctl daemon-reload und sudo systemctl docker neu starten

Starten Sie den Consul-Dienst auf dem 133-Server

docker run -d --network host -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2

Der Grund für die Verwendung des Hostmodus besteht darin, zu verhindern, dass einige Ports nicht zugeordnet werden. Der Hostmodus ist die einzige Möglichkeit, Consul die externe Netzwerkkarte erkennen zu lassen. Hier ist eine Nicht-Host-Methode

$ docker run -di -h consul -p 8500:8500 --name=consul consul:1.5.2

Erstellen Sie ein gemeinsam genutztes Docker-Overlay-Netzwerk

$ Docker-Netzwerk erstellen -d Overlay mein_Overlay

Der Unterschied zwischen diesem und dem Erstellen eines normalen Netzwerks besteht darin, dass das Overlay-Modus-Netzwerk angegeben wird. -d kann auch als --driver geschrieben werden.

Besuchen Sie die Consul-Seite, meine ist beispielsweise 192.168.87.133:8500

Unsere Konfiguration erfolgt bei Schlüssel/Wert.

Klicken Sie auf Docker -> Knoten

Die beiden Knoten oben sind die von zwei Docker-Daemons registrierten Werte.

prüfen

Erstellen Sie zwei neue CentOS-Container auf zwei Servern und verwenden Sie dabei das soeben erstellte Overlay-Netzwerk.

133 Server

$ docker run -di --network my_overlay --name mycentos1 centos:7

139 Server

$ docker run -di --network my_overlay --name mycentos2 centos:7

--net wird als --network geschrieben. Das mit -- beginnende Zeichen kann weggelassen werden =

Zeigen Sie die IP des mycentos1-Containers auf dem 133-Server an

$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos1
10.0.1.2

Zeigen Sie die IP des mycentos2-Containers auf dem 139-Server an

$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos2
10.0.1.3

Pingen Sie die Intranet-IP von mycentos2 des Servers 139 vom Server 133 aus.

Ping ist das Gleiche wie umgekehrt, aber es erlaubt uns nicht, von außen darauf zuzugreifen, sondern über den Container im selben Overlay-Netzwerk. Wenn Sie mir nicht glauben, versuchen wir es wie folgt

133 Server

$ docker exec -it mycentos1 bash
# Ping 10.0.1.3 

Der Zugriff ist erfolgreich, es gibt keinen Paketverlust und umgekehrt. Aus Platzgründen werde ich es nicht testen.

Dies zeigt zumindest, dass die aktuellen Dienste tatsächlich miteinander verbunden sind. Im nächsten Artikel werden wir eine Clustering-Methode für die Produktion entwickeln.

Zitate

Technisches Gespräch | Implementierung eines Docker-Overlay-Netzwerks

Docker-Container-Overlay-Netzwerk

Docker-Cross-Host-Netzwerk – Overlay

Tag 22: Einführung in das Docker-Netzwerk (Teil 3)

Konsul KV

Docker Hub Konsul

Github Docker-Bibliothek/Dokumente

Github Docker-Konsul

Dieser Artikel ist ein Lern- und Übungsartikel von Hellxz. Das Crawlen von Crawler-Websites von Drittanbietern wie Bubukou und Mami ist verboten.

Damit ist dieser Artikel über die Docker-Overlay-Lösung für serverübergreifende Kommunikation (Teil 1) – Consul-Einzelinstanz – abgeschlossen. Weitere relevante Inhalte zum Docker-Overlay-Netzwerk finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung des Overlay-Netzwerks in Docker
  • Implementierung eines Docker-Cross-Host-Netzwerks (Overlay)
  • So erstellen Sie ein Docker-Overlay-Netzwerk
  • Erstellen einer experimentellen Overlay-Netzwerkumgebung in Docker

<<:  MySQL-Tutorial: Beispiel einer DML-Datenmanipulationssprache, ausführliche Erklärung

>>:  CSS implementiert sechs adaptive zweispaltige Layoutmethoden

Artikel empfehlen

Zusammenfassung zur Verwendung von HTML-Meta-Tags (empfohlen)

Meta-Tag-Funktion Der META-Tag ist ein Schlüsselt...

MySQL Dezimalzahl unsigned Update negative Zahlen in 0 umgewandelt

Heute habe ich bei der Überprüfung des Parallelit...

Detaillierte Erklärung zur Verwendung von MySQL mysqldump

1. Einführung in mysqldump mysqldump ist ein logi...

HTML-Tabellen-Markup-Tutorial (38): Rahmenfarben-Attribut der Kopfzeile BORDERCOLOR

Um die Tabelle zu verschönern, können Sie für die...

Implementierungsschritte zur Installation von RocketMQ im Docker

Inhaltsverzeichnis 1. Rufen Sie das Bild ab 2. Br...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.18

Lernziele: Lernen Sie, MySQL-Datenbanken unter de...

Beispielcode einer in Vue3 gekapselten Lupenkomponente

Inhaltsverzeichnis Komponenteninfrastruktur Zweck...

3 Codes zur automatischen Aktualisierung von Webseiten

Tatsächlich ist es sehr einfach, diesen Effekt zu ...

Vue + echart realisiert Doppelsäulendiagramm

In diesem Artikel wird der spezifische Code von v...