2016-07-02 26 views
1

Szenario:Wie DNS konfigurieren (und/oder Loadbalancer) für Docker Swarm-Manager

Ich baue und ein Docker Swarm Cluster konfigurieren. Meine Idee ist, 2 Gruppen von 3 virtuellen Maschinen in 2 getrennten Hosts (HostA und HostB), unter Verwendung von Consul von Discovery-Backend zu implementieren:

HostA: manager0, node0, node1

HostB: manager1, node2, node3

Auf diese Weise bekomme ich die gewünschte Redundanz in den Swarm-Managern und Knoten. Allerdings meine aktuelle Situation in einer früheren und viel einfachen Bühne ist: Ich habe gesponnen nur einen einzigen Docker Swarm-Manager wie folgt:

docker \ 
    run -d \ 
    -p 3376:3376 \ 
    swarm manage \ 
    -H :3376 --advertise manager0:3376 \ 
    --replication consul://consul0:8500/ 

(Hinweis: Der obige Befehl für diese Frage, da einige angepasst wurde irrelevant Argumente wie TLS Überprüfung gelöscht wurden)

Dieser erste Samen der Swarm-Cluster wie erwartet funktioniert.

docker -H tcp://manager0:3376 version 
Client: 
Version:  1.11.2 
API version: 1.23 
Go version: go1.5.4 
Git commit: b9f10c9 
Built:  Wed Jun 1 21:47:50 2016 
OS/Arch:  linux/amd64 

Server: 
Version:  swarm/1.2.3 
API version: 1.22 
Go version: go1.5.4 
Git commit: eaa53c7 
Built:  Fri May 27 17:25:03 UTC 2016 
OS/Arch:  linux/amd64 

Frage:

Nehmen wir an, dass ich erfolgreich den ursprünglichen Plan anspreche und einen zweiten Manager, den sekundären, hinzufüge. Soweit ich sehen kann, pflegen Konsul die Informationen über den Swarm-Cluster, er weiß, wer der primäre und der sekundäre ist, er führt Gesundheitschecks usw. durch.

Jetzt trage ich meinen Deployer Hut. Ich möchte meinen Docker-Client mit dem Swarm-Cluster verbinden, um beispielsweise meine Nginx-basierten Dienste bereitzustellen. Ich möchte nicht manuell eine Verbindung entweder zu manager0 oder manager1 je nachdem, welche die primäre in jedem Fall ist, möchte ich einen einzigen Endpunkt für den gesamten Cluster verwenden. Also:

Wie verwende ich Consul DNS-Auflösung, um auf den richtigen Swarm-Manager mit einem einzigen Endpunkt zu zeigen? Zum Beispiel:

docker -H tcp://swarm.cluster.example.com:3376 version 

statt entweder:

docker -H tcp://manager0:3376 version 

oder

docker -H tcp://manager1:3376 version 
+0

Tipp: Durch Hinzufügen des zweiten Hosts reduzieren Sie die Fehlertoleranz. Das liegt daran, dass die verteilten Konfigurationstools ein Quorum erfordern oder mehr als 50% der Knoten verfügbar sein müssen. Wenn also ein Host ausfällt, hat das andere nicht mehr das Quorum zu operieren. Sie benötigen mindestens 3 Hosts, um einen ausgefallenen Host zu unterstützen. – BMitch

+1

Wenn Sie jetzt einen neuen Schwarm entwickeln, würde ich die 1.12-Route gehen, die neuen Befehle "docker swarm" und "docker service" entfernen viele der Herausforderungen, die Sie hier zu lösen versuchen. – BMitch

+0

Hallo @BMitch, vielen Dank für Ihren Vorschlag über die Route 1.12. Ich werde das für die Zukunft berücksichtigen! –

Antwort

2

Ich denke, dass HostA und HostB Consul als DNS-Server verwendet werden soll. Um dies zu tun, müssen Sie den Standard-DNS-Server-Port von Consul auf 53 ändern. Danach ändern Sie den Domain Name Server der Hosts (Datei /etc/resolv.conf).

Siehe den Link https://www.consul.io/docs/agent/dns.html

Das DNS-Abfrage-System macht Prüfinformation Verwendung von gesundheits Routing zu ungesunden Knoten zu verhindern. Wenn eine Serviceanfrage gestellt wird, werden alle Services , deren Health-Check fehlgeschlagen ist oder eine Knotensystemprüfung nicht bestanden, in den Ergebnissen weggelassen.Um einen einfachen Lastenausgleich zu ermöglichen, wird die Menge der zurückgegebenen Knoten jedes Mal ebenfalls zufällig ausgewählt. Diese Mechanismen machen es einfach, DNS zusammen mit Wiederholungen auf Anwendungsebene als Grundlage für eine Auto-Heilung Service-orientierte Architektur zu verwenden.

+0

Danke @Nguyen - Ich werde es versuchen. Ich bin bei Consul sehr neu und seine Dokumentation geht von einem grundlegenden Wissen aus, das ich noch nicht beherrsche. –