Hostübergreifende Kommunikation zwischen Docker-Containern - Overlay-basierte Implementierungsmethode

Hostübergreifende Kommunikation zwischen Docker-Containern - Overlay-basierte Implementierungsmethode

Overlay-Netzwerkanalyse

Die integrierte netzwerkübergreifende Kommunikation war schon immer ein mit Spannung erwartetes Feature von Docker. Vor Version 1.9 gab es in der Community bereits viele Tools oder Methoden von Drittanbietern, die dieses Problem zu lösen versuchten, wie etwa Macvlan, Pipework, Flannel, Weave usw.

Obwohl diese Lösungen viele Unterschiede in den Implementierungsdetails aufweisen, können ihre Ideen in zwei Typen unterteilt werden: Layer 2 VLAN-Netzwerk und Overlay-Netzwerk

Einfach ausgedrückt besteht die Idee eines Layer-2-VLAN-Netzwerks zur Lösung der plattformübergreifenden Kommunikation darin, die ursprüngliche Netzwerkarchitektur in ein großes, miteinander verbundenes Layer-2-Netzwerk umzuwandeln, direkt über bestimmte Netzwerkgeräte zu routen und eine Punkt-zu-Punkt-Kommunikation zwischen Containern zu realisieren. Diese Lösung ist dem Overlay-Netzwerk hinsichtlich der Übertragungseffizienz überlegen, weist jedoch auch einige inhärente Probleme auf.

Diese Methode erfordert Unterstützung von Layer-2-Netzwerkgeräten und ist nicht so vielseitig und flexibel wie die letztere.

Da die Anzahl der auf einem Switch verfügbaren VLANs normalerweise bei etwa 4.000 liegt, begrenzt dies die Größe des Containerclusters und erfüllt bei weitem nicht die Bereitstellungsanforderungen öffentlicher Clouds oder großer privater Clouds. Die Bereitstellung von VLANs in großen Rechenzentren führt dazu, dass die Broadcast-Daten jedes VLANs das gesamte Rechenzentrum überfluten, eine große Menge an Netzwerkbandbreite verbrauchen und Wartungsschwierigkeiten verursachen.

Im Gegensatz dazu bezieht sich ein Overlay-Netzwerk auf ein neues Datenformat, das Layer-2-Nachrichten über IP-Nachrichten über ein bestimmtes vereinbartes Kommunikationsprotokoll kapselt, ohne die vorhandene Netzwerkinfrastruktur zu ändern. Dadurch wird nicht nur die ausgereifte Prozessdatenverteilung des IP-Routing-Protokolls voll ausgenutzt, sondern es wird auch ein erweitertes Isolationsidentifikationsbit in der Overlay-Technologie verwendet, um die 4000-VLAN-Grenze zu durchbrechen und bis zu 16 Millionen Benutzer zu unterstützen. Außerdem kann Broadcast-Verkehr bei Bedarf in Multicast-Verkehr umgewandelt werden, um eine Überflutung mit Broadcast-Daten zu vermeiden.

Daher ist das Overlay-Netzwerk derzeit tatsächlich die gängigste Lösung für die knotenübergreifende Datenübertragung und das Routing von Containern.

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, und dann wird das Paket an die Adresse des physischen Servers weitergeleitet und erreicht schließlich durch Routing und Switching die IP-Adresse eines anderen Servers.

1.png

Umgebungseinführung

Hostname IP-Adresse Systemversion
cdh1 30.10.10.111. centos7
cdh2 30.10.10.112. centos7

Konsul-Installationskonfiguration

Um das Overlay-Netzwerk zu implementieren, benötigen wir eine Serviceerkennung. Beispielsweise definiert Consul einen IP-Adresspool wie 10.0.2.0/24. Darauf werden Container abgelegt und die IP-Adressen der Container werden daraus bezogen. Nach Abschluss der Erfassung erfolgt die Kommunikation über ens33, sodass eine hostübergreifende Kommunikation möglich ist.

Bildbeschreibung hier einfügen

Consul wird über Docker in cdh1 bereitgestellt. Zuerst müssen Sie die Docker-Konfiguration in cdh1 ändern und neu starten.

[root@cdh1 /]# vim /etc/docker/daemon.json
//Füge die folgende Konfiguration „live-restore“ hinzu: true
[root@cdh1 /]# systemctl Neustart Docker

„live-restore“: true Diese Konfiguration ermöglicht es dem Container, weiter ausgeführt zu werden, wenn der Docker-Daemon gestoppt oder neu gestartet wird.

Laden Sie das Consul-Image auf cdh1 herunter und starten Sie es

[root@cdh1 /]# Docker Pull Konsul
[root@cdh1 /]# docker run -d -p 8500:8500 -h consul --name consul consul

Ändern Sie die Docker-Konfiguration in cdh1 und starten Sie neu

[root@cdh1 /]# vim /etc/docker/daemon.json
# Fügen Sie die folgenden zwei Zeilen hinzu, um „cluster-store“ zu konfigurieren: „consul://10.30.10.111:8500“
"cluster-advertise": "10.30.10.111:2375"
[root@cdh1 /]# systemctl Neustart Docker

Ändern Sie die Docker-Konfiguration in cdh2 und starten Sie neu

[root@cdh2 /]# vim /etc/docker/daemon.json
# Fügen Sie die folgenden zwei Zeilen hinzu, um „cluster-store“ zu konfigurieren: „consul://10.30.10.111:8500“
"cluster-advertise": "10.30.10.112:2375"
[root@cdh2 /]# systemctl Neustart Docker

Der Cluster-Store gibt die Adresse des Consul-Dienstes an. Da der Consul-Dienst auf Port 8500 von cdh1 ausgeführt wird, lauten die Cluster-Store-Werte beider Maschinen consul://10.30.10.111:8500.
cluster-advertise gibt den Kommunikationsport zwischen der lokalen Maschine und Consul an, daher wird er als Port 2375 der lokalen Maschine angegeben

Zu diesem Zeitpunkt können Sie über http://10.30.10.111:8500/ auf die Konsuladresse zugreifen. Im Verzeichnis „Docker-Nodes“ im Menü „Schlüssel/Wert“ können Sie die beiden Docker-Knoten cdh1 und cdh2 sehen, was bedeutet, dass Konsul erfolgreich konfiguriert wurde.

Bildbeschreibung hier einfügen

Erstellen eines Overlay-Netzwerks

An diesem Punkt können wir ein Overlay-Netzwerk erstellen. Überprüfen Sie zunächst den Netzwerktyp, der sich derzeit im Knoten befindet.

[root@cdh1 /]# Docker-Netzwerk ls
NETZWERK-ID-NAME TREIBER-UMFANG
ab0f335423a1 Brücke Brücke lokal
b12e70a8c4e3 Host Host lokal
0dd357f3ecae keine null lokal

Erstellen Sie dann ein Overlay-Netzwerk auf dem Docker-Knoten von cdh1. Da die Consul-Diensterkennung normal ausgeführt wird und die Docker-Dienste von cdh1 und cdh2 bereits verbunden sind, wird das Overlay-Netzwerk global erstellt und kann einmal auf jedem Host erstellt werden.

[root@cdh1 /]# Docker-Netzwerk erstellen -d Overlay my_overlay
cafa97c5cf9d30dd6cef08a5e9710074c828cea3fdd72edb45315fb4b1bfd84c
[root@cdh1 /]# Docker-Netzwerk ls
NETZWERK-ID-NAME TREIBER-UMFANG
ab0f335423a1 Brücke Brücke lokal
b12e70a8c4e3 Host Host lokal
cafa97c5cf9d my_overlay Overlay global
0dd357f3ecae keine null lokal

An diesem Punkt können Sie sehen, dass das erstellte Overlay-Netzwerk als global markiert ist. Wir können das CDH2-Netzwerk überprüfen und feststellen, dass auch das Overlay-Netzwerk erstellt wurde.

[root@cdh2 ~]# Docker-Netzwerk ls
NETZWERK-ID-NAME TREIBER-UMFANG
90d99658ee8f Brücke Brücke lokal
19f844200737 Host Host lokal
cafa97c5cf9d my_overlay Overlay global
3986fe51b271 keine null lokal

Netzwerktests

Nachdem die Erstellung abgeschlossen ist, können wir das Overlay-Netzwerk in cdh1 und cdh2 angeben, um einen Docker-Container zu erstellen und ihn zu testen, um zu sehen, ob er hostübergreifend kommunizieren kann.

Erstellen Sie einen Container mit dem Namen „Master“ in cdh1 und zeigen Sie seine IP an

[root@cdh1 /]# docker run -itd -h master --name master --network my_overlay centos7_update /bin/bash
[root@cdh1 /]# docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" master
10.0.0.2

Erstellen Sie einen Container mit dem Namen „slaver“ in cdh1 und zeigen Sie seine IP an

[root@cdh2 ~]# docker run -itd -h Slaver --name Slaver --network my_overlay centos7_update /bin/bash
[root@cdh2 ~]# docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" Sklavenhalter
10.0.0.3

Geben Sie jetzt die beiden Container ein und pingen Sie die IPs des jeweils anderen an, um zu sehen, ob die Kommunikation erfolgreich war.

[root@cdh1 ~]# docker exec -it master /bin/bash
[root@master /]# ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) Bytes Daten.
64 Bytes von 10.0.0.3: icmp_seq=1 ttl=64 Zeit=0,587 ms
64 Bytes von 10.0.0.3: icmp_seq=2 ttl=64 Zeit=0,511 ms
64 Bytes von 10.0.0.3: icmp_seq=3 ttl=64 Zeit=0,431 ms
64 Bytes von 10.0.0.3: icmp_seq=4 ttl=64 Zeit=0,551 ms
64 Bytes von 10.0.0.3: icmp_seq=5 ttl=64 Zeit=0,424 ms
^C
--- 10.0.0.3 Ping-Statistiken ---
5 Pakete gesendet, 5 empfangen, 0 % Paketverlust, Zeit 4000 ms
RTT min./avg./max./mdev. = 0,424/0,500/0,587/0,070 ms
[root@cdh2 ~]# docker exec -it slaver /bin/bash
[root@slaver /]# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) Bytes Daten.
64 Bytes von 10.0.0.2: icmp_seq=1 ttl=64 Zeit=0,499 ms
64 Bytes von 10.0.0.2: icmp_seq=2 ttl=64 Zeit=0,500 ms
64 Bytes von 10.0.0.2: icmp_seq=3 ttl=64 Zeit=0,410 ms
64 Bytes von 10.0.0.2: icmp_seq=4 ttl=64 Zeit=0,370 ms
^C
--- 10.0.0.2 Ping-Statistiken ---
4 Pakete gesendet, 4 empfangen, 0 % Paketverlust, Zeit 3000 ms
RTT min./avg./max./mdev. = 0,370/0,444/0,500/0,062 ms

Erfolgreiche Kommunikation!

Dies ist das Ende dieses Artikels über die hostübergreifende Kommunikation zwischen Docker-Containern – Overlay-basierte Implementierungsmethode. Weitere verwandte Informationen zur hostübergreifenden Kommunikation zwischen Docker-Containern finden Sie in den vorherigen Artikeln von 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 Erläuterung des Implementierungsprozesses des Docker-Cross-Host-Container-Kommunikations-Overlays
  • Docker-Reinigungskiller/Docker-Overlay-Datei nimmt zu viel Speicherplatz ein
  • Implementierung eines Docker-Cross-Host-Netzwerks (Overlay)
  • So erstellen Sie ein Docker-Overlay-Netzwerk
  • Docker-Overlay realisiert die Container-Kommunikation zwischen Hosts

<<:  JavaScript-Implementierung des Verifizierungscode-Falls

>>:  MySQL-Abfrageoptimierung: Ursachen und Lösungen für langsame Abfragen

Artikel empfehlen

Einige Datenverarbeitungsmethoden, die häufig in JS verwendet werden können

Inhaltsverzeichnis DOM-Verarbeitung Arrays Verfah...

Detaillierte Erklärung der Beziehung zwischen Vue und VueComponent

Der folgende Fall überprüft die Wissenspunkte der...

Analyse der Protokolldateien im Tomcat-Protokollverzeichnis (Zusammenfassung)

Bei jedem Start von Tomcat werden die folgenden P...

Implementierung des CSS-Ladeeffekts Pac-Man

emmm, der Name ist nur eine zufällige Vermutung 2...

Gruselige Halloween-Linux-Befehle

Auch wenn nicht Halloween ist, lohnt es sich, sic...

Vergleich der Effizienz der Dateneinfügung in MySQL

Beim Einfügen von Daten stellte ich fest, dass ic...

Detaillierte Erläuterung gängiger Methoden von JavaScript String

Inhaltsverzeichnis 1. charAt Grammatik Parameter ...

Perfekte Lösung für das Zeitzonenproblem des Docker Alpine-Image

Als ich kürzlich Docker zum Bereitstellen einer J...

Detaillierte Erklärung der Rahmen- und Regelattribute der Tabelle in HTML

Die Rahmen- und Regelattribute des Tabellentags k...

Detaillierte Erklärung der Funktionen jedes Ports von Tomcat

Aus der Tomcat-Konfigurationsdatei können wir ers...

MySQL sollte niemals Update-Anweisungen wie diese schreiben

Inhaltsverzeichnis Vorwort Ursache Phänomen warum...

Mit CSS3 implementierter Gradienten-Folieneffekt

Ergebnisse erzielen Code html <div Klasse=&quo...