Overlay-NetzwerkanalyseDie 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. Umgebungseinführung |
Hostname | IP-Adresse | Systemversion |
---|---|---|
cdh1 | 30.10.10.111. | centos7 |
cdh2 | 30.10.10.112. | centos7 |
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.
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.
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
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!
<<: JavaScript-Implementierung des Verifizierungscode-Falls
>>: MySQL-Abfrageoptimierung: Ursachen und Lösungen für langsame Abfragen
Eigentlich ist das ganz einfach. Wir fügen ein a-...
Implementierung des Zeitvergleichs in MySql unix_...
Array-Methoden JavaScript bietet viele Array-Meth...
In MySQL häufig verwendete Abfragebefehle: mysql&...
Installieren Sie nginx Beachten Sie, dass Sie ngi...
1. Was ist ein zweispaltiges Layout? Es gibt zwei...
Frage Nginx nimmt $remote_addr als echte IP-Adres...
js-Datentypen Grundlegende Datentypen: Zahl, Zeic...
Weiterführende Literatur: Beheben Sie das Problem...
Der Browser zeigt Bilder im TIF-Format an Code kop...
Dieser Artikel veranschaulicht anhand von Beispie...
In diesem Artikel wird die Verwendung von „Explai...
Da die Plattform weiter wächst, ist die Forschung...
1: Download von der offiziellen MySQL-Website htt...
Die Implementierungsidee des Javascript-Spiels Sn...