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

Allgemeine Datumsvergleichs- und Berechnungsfunktionen in MySQL

Implementierung des Zeitvergleichs in MySql unix_...

Vergleich der JS-Array-Loop-Methode und der Effizienzanalyse

Array-Methoden JavaScript bietet viele Array-Meth...

Liste der allgemeinen MySql-Abfragebefehlsoperationen

In MySQL häufig verwendete Abfragebefehle: mysql&...

N Möglichkeiten, mit CSS ein zweispaltiges Layout zu erreichen

1. Was ist ein zweispaltiges Layout? Es gibt zwei...

js-Datentypen und Beispiele für ihre Beurteilungsmethoden

js-Datentypen Grundlegende Datentypen: Zahl, Zeic...

Installationsmethode der dekomprimierten Version von MySQL 5.7.18 unter Win7x64

Weiterführende Literatur: Beheben Sie das Problem...

So zeigen Sie Bilder im TIF-Format im Browser an

Der Browser zeigt Bilder im TIF-Format an Code kop...

Detaillierte Erklärung der allgemeinen Verwendung von MySQL-Abfragebedingungen

Dieser Artikel veranschaulicht anhand von Beispie...

Standardzusammenfassung zur Analyse der Leistung einer SQL-Anweisung

In diesem Artikel wird die Verwendung von „Explai...

MySQL 8.0.20 Installations-Tutorial mit Bildern und Text (Windows 64-Bit)

1: Download von der offiziellen MySQL-Website htt...

JavaScript, um die Idee des Schlangenspiels umzusetzen

Die Implementierungsidee des Javascript-Spiels Sn...