Verwenden privater physischer Netzwerke mit Docker-Schwarmmodus

11

Ich arbeite an einem Produktionssetup mit Docker im Schwarmmodus (mit Docker 17.03.1-ce). Es werden 2 Rechenzentren beteiligt sein. In beiden Rechenzentren haben alle Computer sowohl eine öffentliche IP-Adresse als auch eine private IP-Adresse (lokal zum Rechenzentrum) in einem privaten Netzwerk, sodass zwei private Netzwerke vorhanden sind.

Link zum vereinfachten Setup der Diagrammvisualisierung

Der Netzwerkverkehr über die privaten Netzwerkschnittstellen ist kostenlos, während der Verkehr über die öffentliche Schnittstelle nicht begrenzt ist (und langsamer ist). Daher würde ich den Netzwerkverkehr nach Möglichkeit lieber über die privaten Schnittstellen übertragen.

Soweit ich weiß (glaube ich), wird der gesamte Datenverkehr zwischen Docker-Knoten im Schwarmmodus über dieselbe Netzwerkschnittstelle geleitet, die für die Kommunikation mit den Schwarmmastern verwendet wird. In meinem Fall müssen es die öffentlichen sein, um Multi-DC-Netzwerke herzustellen möglich. Der am meisten erwartete Datenverkehr wird jedoch zwischen Knoten in denselben Domänencontrollern stattfinden, und es wäre sehr schön, wenn Docker den Datenverkehr irgendwie durch meine privaten Netzwerke leiten könnte, wenn sich Quell- und Zielknoten zufällig im selben privaten Netzwerk befinden.

Ich befürchte, dass dies nicht sofort möglich ist, da die Schwarmmaster nichts über diese privaten Netzwerke und die IPs wissen, über die die Knoten verfügen.

Eine Lösung, die ich mir vorstellen könnte, besteht darin, ein VPN einzurichten und den Schwarm darüber hinaus bereitzustellen. Dies erhöht jedoch die Komplexität und ich würde eine reine Docker-Schwarmlösung bevorzugen.


Update : Wie in einem Kommentar vorgeschlagen, besteht die Grundlage für eine Lösung möglicherweise darin, iptables zu verwenden, um ausgehenden Datenverkehr an private IPs anstatt an öffentliche IPs weiterzuleiten. Wenn ich dies jedoch tun möchte, besteht mein nächstes Problem darin, wie all diese Regeln verwaltet werden. Bei 10 Servern in einem DC würde ich 10 * 9 = 90 davon benötigen, um den gesamten möglichen lokalen Verkehr über das private Netzwerk zu leiten. Ich kann mir vorstellen, dass es vielleicht ein Tool gibt, das bei einer solchen Aufgabe helfen könnte, oder ich könnte eines erstellen, aber vielleicht gibt es einen viel einfacheren Weg, dies zu tun.

Ede
quelle
1
Sie können iptables verwenden, um die Ziel-IP von Geschwistern im selben Rechenzentrum in ihre privaten Netzwerk-IPs umzuschreiben. Auch sollte dies auf Serverfehler nicht SO sein;)
n00b32
Ja, ein bisschen mehr Graben führte mich zu dem gleichen Schluss. Das wird allerdings ein Ärger sein, ich würde wirklich ein Tool brauchen, um das automatisch für mich zu erledigen (alle IPs zwischen allen Knoten in einem Cluster / DC neu schreiben). Immerhin würde ich für N Knoten (N-1) ^ 2 iptables-Regeln benötigen.

Antworten:

1

(Wahrscheinlich sollte es ein Kommentar sein, kann aber noch nicht kommentieren)

Da Sie keine Hostnamen und / oder DNS zum Booten des Clusters verwenden können, sehe ich keine Möglichkeit, den Cluster-Austausch von Raft-Daten im richtigen nicht gemessenen Netzwerk zu erzwingen, aber ich sehe, dass Sie einen Schnittstellennamen verwenden können. Seltsamerweise wird es nicht in den Schwarmdokumenten angegeben, aber ein Problem zeigt, dass die Fehlermeldung eine IP oder Schnittstelle erwartet.

Ich frage mich, ob Sie die Cluster-Mitglieder so einstellen können, dass sie mit dem Namen der privaten Schnittstelle werben, damit Sie den meisten Verkehr auf die von Ihnen gewünschte Weise erhalten.

Ich kann mich momentan nicht testen, werde es aber nächste Woche tun, da ich möglicherweise auf ein ähnliches Problem für ein bevorstehendes Projekt stoße.

Pablo
quelle
Danke, bitte lassen Sie mich wissen, wenn Sie nächste Woche etwas herausfinden. Das Problem , das Du verknüpft ist über die ‚alte‘ Docker Schwarm Funktionalität, während ich verwende (und möchten Sie verwenden beraten) , um den neuen Docker Schwarm - Modus , die in integrierten und keinen externen Schlüssel / Wert - Speicher erfordern.
Ede