Einführung
Consul ist ein verteiltes, hochverfügbares, Rechenzentrums-fähiges Service Discovery- und Konfigurationssystem. Es kann verwendet werden, um Dienste und Knoten in einer flexiblen und leistungsstarken Oberfläche darzustellen, die es Kunden ermöglicht, immer einen aktuellen Überblick über die Infrastruktur zu haben, zu der sie gehören.
Consul bietet viele verschiedene Funktionen, mit denen konsistente und verfügbare Informationen zu Ihrer Infrastruktur bereitgestellt werden. Dies umfasst Service- und Node-Discovery-Mechanismen, ein Tagging-System, Integritätsprüfungen, konsensbasierte Wahlroutinen, systemweite Speicherung von Schlüsseln und Werten und mehr. Durch die Nutzung von consul in Ihrem Unternehmen können Sie Ihre Anwendungen und Dienste auf einfache Weise besser bekannt machen.
In diesem Handbuch stellen wir Ihnen einige Grundlagen der Verwendung von consul vor. Wir werden die allgemeinen Verfahren behandeln, die erforderlich sind, um Consul auf Ihren Servern zum Testen zum Laufen zu bringen. Im nächsten Leitfaden konzentrieren wir uns auf die Einrichtung von consul in einer Produktionsumgebung.
Voraussetzungen und Ziele
In diesem Handbuch werden wir uns mit der Verwendung von consul vertraut machen, um ein System zur Serviceerkennung und -konfiguration für Ihre Infrastruktur zu entwickeln.
Zu unserer Demonstration konfigurieren wir drei Server und einen Client. Server werden verwendet, um Abfragen zu bearbeiten und eine konsistente Sicht auf das System zu gewährleisten. Der Client ist auch Mitglied des Systems und kann eine Verbindung zu den Servern herstellen, um Informationen über die Infrastruktur zu erhalten. Kunden können auch Dienste enthalten, die vom Konsul überwacht werden.
Für die Zwecke dieses Handbuchs und für die gesamte Serie werden 4 Computer konfiguriert. Die ersten drei sindconsul servers wie oben beschrieben. Das letzte ist einconsul agent, das als Client fungiert und zum Abfragen von Informationen über das System verwendet werden kann.
Damit wir einige der Sicherheitsmechanismen zu einem späteren Zeitpunkt implementieren können, müssen wir alle unsere Computer in einer einzigen Domäne benennen. Auf diese Weise können wir in Zukunft ein Wildcard-SSL-Zertifikat nutzen.
Die Details unserer Maschinen finden Sie hier:
Hostname | IP Adresse | Role |
---|---|---|
server1.example.com |
192.0.2.1 |
Bootstrap-Konsul-Server |
server2.example.com |
192.0.2.2 |
Konsul Server |
server3.example.com |
192.0.2.3 |
Konsul Server |
agent1.example.com |
192.0.2.50 |
Konsul Client |
Wir werden für diese Demonstration 64-Bit-Server mit Ubuntu 14.04 verwenden, aber jeder moderne Linux-Server sollte genauso gut funktionieren.
Consul herunterladen und installieren
Der erste Schritt, den wir unternehmen müssen, ist das Herunterladen und Installieren der consul-Software auf jedem unserer Computer. Die folgenden Schritte sollten füreach der oben aufgeführten Maschinen ausgeführt werden. Sie sollten als root angemeldet sein.
Bevor wir uns die Konsulanwendung ansehen, müssen wirunzip
abrufen, um die ausführbare Datei zu extrahieren. Wir werden auch die Anwendungscreen
verwenden, damit wir problemlos mehrere Sitzungen in einem einzigen Terminalfenster durchführen können. Dies ist nützlich für unsere Einführung, da consul normalerweise den gesamten Bildschirm einnimmt, wenn es nicht als Dienst ausgeführt wird.
Aktualisieren Sie den Paketcache des lokalen Systems und installieren Sie das Paket mitapt
:
apt-get update
apt-get install unzip screen
Damit wir dies später nicht vergessen, starten Sie jetzt Ihre Bildschirmsitzung:
screen
Drücken Sie die Eingabetaste, wenn Sie eine Copyright-Nachricht erhalten. Sie werden wieder in ein Terminalfenster verschoben, befinden sich jedoch jetzt in einer Bildschirmsitzung.
Jetzt können wir uns um das Konsul-Programm kümmern. Dasconsul project’s page bietet Download-Links zu Binärpaketen für Windows, OS X und Linux.
Gehen Sie zur obigen Seite und klicken Sie mit der rechten Maustaste auf das Betriebssystem und die Architektur, die Ihre Server darstellen. Da wir in diesem Handbuch 64-Bit-Server verwenden, verwenden wir den Link „amd64“ unter „Linux“. Wählen Sie "Linkspeicherort kopieren" oder eine ähnliche Option, die Ihr Browser anbietet.
Wechseln Sie in Ihrem Terminal in das Verzeichnis/usr/local/bin
, in dem die ausführbare Datei gespeichert wird. Geben Siewget
und ein Leerzeichen ein und fügen Sie die URL ein, die Sie von der Site kopiert haben:
cd /usr/local/bin
wget https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip
Jetzt können wir das Binärpaket mit dem zuvor installierten Befehlunzip
extrahieren. Wir können dann die gezippte Datei entfernen:
unzip *.zip
rm *.zip
Sie sollten jetzt den Befehlconsul
auf allen Ihren Servern verfügbar haben.
Starten des Bootstrap-Servers
Um mit consul arbeiten zu können, müssen wir unsere consul-Server in Betrieb nehmen. Wenn Sie dies in der empfohlenen Umgebung mit mehreren Servern konfigurieren, muss dieser Schritt schrittweise ausgeführt werden.
Als erstes müssen wir das Konsulprogramm auf einem unserer Server im Modusserver
undbootstrap
starten. Der Servermodus bedeutet, dass der Konsul als Serverinstanz anstelle eines Clients gestartet wird. Die Bootstrap-Option wird für den ersten Server verwendet. Dies ermöglicht es ihm, sich selbst als "Anführer" für den Cluster zu bestimmen, ohne dass eine Wahl getroffen wird (da dies der einzige verfügbare Server ist).
In der Tabelle, in der unsere Hosts angegeben sind, haben wir unsereserver1
als Bootstrap-Server festgelegt. Starten Sie auf Server1 die Bootstrap-Instanz, indem Sie Folgendes eingeben:
consul agent -server -bootstrap -data-dir /tmp/consul
Der Server wird im aktuellen Terminal gestartet und die Protokolldaten werden ausgegeben, sobald Ereignisse eintreten. Gegen Ende der Protokolldaten sehen Sie folgende Zeilen:
. . .
2014/07/07 14:32:15 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:32:17 [WARN] raft: Heartbeat timeout reached, starting election
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Candidate] entering Candidate state
2014/07/07 14:32:17 [INFO] raft: Election won. Tally: 1
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Leader] entering Leader state
2014/07/07 14:32:17 [INFO] consul: cluster leadership acquired
2014/07/07 14:32:17 [INFO] consul: New leader elected: server1.example.com
2014/07/07 14:32:17 [INFO] consul: member 'server1.example.com' joined, marking health alive
Wie Sie sehen, wurde kein Cluster-Leader gefunden, da dies der ursprüngliche Knoten ist. Da wir jedoch die Bootstrap-Option aktiviert haben, konnte dieser Server selbst in den Leader-Status wechseln, um einen Cluster mit einem einzelnen Host zu initiieren.
Starten der anderen Server
Aufserver2
undserver3
können wir jetzt den Konsulendienstwithout der Bootstrap-Option starten, indem wir Folgendes eingeben:
consul agent -server -data-dir /tmp/consul
Für diese Server werden auch die Protokolleinträge angezeigt. Gegen Ende sehen Sie Nachrichten wie diese:
. . .
2014/07/07 14:37:25 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:37:27 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
2014/07/07 14:37:53 [ERR] agent: failed to sync remote state: No cluster leader
Dies liegt daran, dass kein Cluster-Leader gefunden werden kann und nicht aktiviert ist, der Leader selbst zu werden. Dieser Status tritt auf, weil unser zweiter und dritter Server aktiviert sind, aber noch keiner unserer Server miteinander verbunden ist.
Um eine Verbindung herzustellen, müssen diese Server miteinander verbunden werden. Dies kann in jede Richtung erfolgen, am einfachsten jedoch von unsererserver1
-Maschine.
Da wir den Konsulenserver im aktuellen Terminalfenster vonserver1
ausführen, müssen wir ein weiteres Terminal mitscreen
erstellen, um zusätzliche Arbeit zu leisten. Erstellen Sie ein neues Terminalfenster innerhalb der vorhandenen Bildschirmsitzung vonserver1
, indem Sie Folgendes eingeben:
CTRL-A C
Dadurch wird eine neue Terminalinstanz geöffnet, während die vorherige Sitzung ausgeführt wird. Sie können die vorhandenen Terminalsitzungen schrittweise durchlaufen, indem Sie Folgendes eingeben:
CTRL-A N
Kehren Sie in Ihr frisches Terminal zurück und verbinden Sie die beiden anderen Instanzen, indem Sie ihre IP-Adressen wie folgt referenzieren:
consul join 192.0.2.2 192.0.2.3
Das sollte sofort alle drei Server in demselben Cluster verbinden. Sie können dies überprüfen, indem Sie Folgendes eingeben:
consul members
Node Address Status Type Build Protocol
server1.example.com 192.0.2.1:8301 alive server 0.3.0 2
server2.example.com 192.0.2.2:8301 alive server 0.3.0 2
server3.example.com 192.0.2.3:8301 alive server 0.3.0 2
Sie können diese Informationen auch von jedem anderen Server abrufen, indem Sie wie oben beschrieben eine neue Terminalsitzung auf dem Bildschirm erstellen und denselben Befehl eingeben.
Entfernen des Bootstrap-Servers und erneutes Beitreten als regulärer Server
Wir haben alle drei unserer Server in einem Cluster zusammengeschlossen, aber wir sind noch nicht fertig.
Daserver1
im Bootstrap-Modus gestartet wurde, kann es derzeit Entscheidungen treffen, ohne die anderen Server zu konsultieren. Da sie als gleichberechtigt fungieren und Entscheidungen nach Quorum treffen sollen, möchten wir dieses Privileg entfernen, nachdem der Cluster gebootet wurde.
Dazu müssen wir den Konsulendienst aufserver1
beenden. Dadurch können die verbleibenden Maschinen einen neuen Anführer auswählen. Wir können dann den Konsulendienst aufserver1
ohne die Bootstrap-Option neu starten und dem Cluster wieder beitreten.
Wechseln Sie auf Server1 zurück zu dem Terminal, auf dem consul ausgeführt wird:
CTRL-A N
Beenden Sie den Dienst, indem Sie Folgendes eingeben:
CTRL-C
Starten Sie den Dienst jetzt ohne die Bootstrap-Option neu:
consul agent -server -data-dir /tmp/consul
Wechseln Sie zurück zu Ihrem offenen Terminal und treten Sie dem Cluster wieder bei, indem Sie eine Verbindung mit einem der beiden Server im Cluster herstellen:
CTRL-A N
consul join 192.0.2.2
Sie sollten nun Ihre drei Server gleichberechtigt zur Verfügung haben. Sie replizieren Informationen und behandeln Situationen, in denen ein einzelner Server nicht mehr verfügbar ist. Zusätzliche Server können nun ebenfalls dem Cluster beitreten, indem Sie den Server einfach ohne Bootstrap starten und dem Cluster beitreten.
Beitreten zum Cluster als Client und Bereitstellen der Webbenutzeroberfläche
Nachdem der Servercluster verfügbar ist, können wir über den Clientcomputer eine Verbindung herstellen.
Wir werden die Web-Benutzeroberfläche von consul auf unseren Clientcomputer stellen, damit wir mit dem Cluster interagieren und dessen Zustand überwachen können. Dazuvisit the download page for the web UI. Klicken Sie mit der rechten Maustaste auf die Download-Schaltfläche und wählen Sie "Linkspeicherort kopieren" oder eine ähnliche Option, die Ihnen zur Verfügung steht.
Wechseln Sie auf Ihrem Client-Computer in Ihr Ausgangsverzeichnis. Geben Siewget
und ein Leerzeichen ein und fügen Sie die von der Seite kopierte URL ein:
cd ~
wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip
Wenn der Download abgeschlossen ist, entpacken und löschen Sie das Archiv:
unzip *.zip
rm *.zip
Es wird ein Verzeichnis namensdist
geben, das alle Dateien enthält, die zum Rendern der Konsul-Web-Benutzeroberfläche erforderlich sind. Wir müssen dieses Verzeichnis nur angeben, wenn wir eine Verbindung zum Cluster herstellen.
Um eine Verbindung zum Cluster herzustellen, verwenden wir einen ähnlichen Anruf an den Consul-Agenten, den wir für die Server verwendet haben. Wir werden jedoch andere Flags verwenden.
Wir werden dasserver
-Flag nicht verwenden, da wir im Client-Modus arbeiten möchten. Standardmäßig ist die Client-Schnittstelle jedes Knotens über die lokale Loopback-Schnittstelle zugänglich. Da wir remote auf die Web-Benutzeroberfläche zugreifen möchten, müssen wir stattdessen die öffentliche IP-Adresse des Clients angeben.
Wir müssen consul auf das Verzeichnis verweisen, in dem sich die Web-Benutzeroberfläche befindet, um diesen Inhalt bereitzustellen. Darüber hinaus werden wir dem Cluster sofort beitreten, indem wir die IP-Adresse eines der Server im Cluster übergeben. Dadurch können wir vermeiden, dass wir später beitreten müssen. Dies hätten wir auch früher mit den Serverbeispielen tun können.
Am Ende ist unser Verbindungsbefehl ziemlich lang. Es wird so aussehen:
consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dir -join 192.0.2.1
Dadurch wird unser Clientcomputer als regulärer Agent ohne Server mit dem Cluster verbunden. Dieser Agent antwortet auf Anfragen über seine öffentliche IP-Adresse anstelle der üblichen127.0.0.1
-Schnittstelle. Aus diesem Grund müssen Sie allen Konsul-Befehlen, dierpc-addr
angeben, ein zusätzliches Flag hinzufügen.
Wenn Sie beispielsweise die Mitgliederliste des Clients abfragen möchten, müssen Sie dazu die von Ihnen ausgewählte alternative Schnittstelle und den Port eingeben:
consul members -rpc-addr=192.0.2.50:8400
Node Address Status Type Build Protocol
agent1 192.0.2.50:8301 alive client 0.3.0 2
server2 192.0.2.2:8301 alive server 0.3.0 2
server1 192.0.2.1:8301 alive server 0.3.0 2
server3 192.0.2.3:8301 alive server 0.3.0 2
Dies mag mühsam erscheinen, bietet uns jedoch die Möglichkeit, auf die Weboberfläche von consul zuzugreifen. Sie können zur Weboberfläche gelangen, indem Sie die IP-Adresse Ihres Kunden und anschließend:8500/ui
in Ihrem Webbrowser aufrufen:
http://192.0.2.50:8500/ui
Die Hauptoberfläche sieht folgendermaßen aus:
Sie können durch verschiedene Menüs klicken und die Benutzeroberfläche erkunden. Dies bietet Ihnen eine gute Möglichkeit, Ihren Cluster und den Zustand Ihrer Maschinen und Dienste zu visualisieren.
Services und Checks hinzufügen
Jetzt möchten wir consul Services hinzufügen, was der primäre Anwendungsfall für die Einrichtung ist. Sie können Dienste auf verschiedene Arten hinzufügen. Am einfachsten ist es jedoch, ein Konfigurationsverzeichnis zum Speichern Ihrer Dienstdefinitionen zu erstellen.
Ein Dienst ist dem Knoten zugeordnet, der die Dienstdefinition enthält. Wenn wir also einen Webserver haben, sollten wir den Consul-Agenten auf diesem Server installieren und dort eine Service-Definitionsdatei erstellen.
Für unsere Zwecke installieren wir Nginx auf unserem Client, um dies zu demonstrieren. Beenden Sie die aktuelle Client-Sitzung, indem Sie Folgendes eingeben:
CTRL-C
Installieren Sie Nginx auf dem Client, indem Sie Folgendes eingeben:
apt-get install nginx
Jetzt können wir ein Konfigurationsverzeichnis erstellen, in dem unsere Servicedefinitionen gespeichert werden:
mkdir ~/services
In diesem Verzeichnis erstellen wir eine JSON-Datei, die unseren Webdienst beschreibt. Wir werden diesweb.json
nennen:
nano ~/services/web.json
In dieser Datei müssen wir eine Struktur für unsere Service-Definition einfügen. Innerhalb dieser Struktur definieren wir eine Unterstruktur für eine Integritätsprüfung des Dienstes, damit wir zuverlässig erkennen können, ob er ausgeführt wird oder nicht.
Der Grundriss sieht folgendermaßen aus:
{
"service": {
. . .
"check": {
. . .
}
}
}
Für den Dienst müssen wir einen Namen für den Dienst definieren und dem Konsul mitteilen, welchen Port er überprüfen soll. Zusätzlich können wir ihm eine Liste von Tags geben, mit denen wir den Service für unsere eigenen Sortierzwecke beliebig kategorisieren können.
In unserem Beispiel sieht das so aus:
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
. . .
}
}
}
Dies ist alles, was wir brauchen, um den Service selbst zu definieren. Wir möchten jedoch auch eine Methode definieren, mit der der Konsul den Zustand des Dienstes überprüfen kann. Dies ist normalerweise recht einfach und wiederholt die manuellen Überprüfungen eines normalen Systemadministrators.
Für unseren Service implementieren wir eine einfache Webanforderung mitcurl
, wie das Konsulprojekt inits own documentation auflistet. Wir müssen eigentlich nicht wissen, welche Locke abgerufen werden kann, sondern es interessiert uns nur, ob der Befehl fehlerfrei ausgeführt werden konnte. Aus diesem Grund können wir jede Ausgabe wegwerfen.
Wir müssen auch das Intervall einstellen, in dem die Prüfung ausgeführt wird. Dies ist immer ein Kompromiss zwischen Leistung und aktuellen Informationen. Wir werden 10 Sekunden verwenden, da wir relativ bald wissen möchten, ob etwas nicht stimmt:
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
"script": "curl localhost:80 > /dev/null 2>&1",
"interval": "10s"
}
}
}
Speichern und schließen Sie die Datei, wenn Sie fertig sind.
Jetzt können wir einfach die Client-Konsul-Sitzung neu starten und auf dieses Verzeichnis mit den folgenden Dienstdefinitionen verweisen:
consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dist -join 192.0.2.1 -config-dir /home/your_user/services
Dadurch wird der Knoten neu gestartet und mit dem Cluster verbunden. Wenn Sie zur Weboberfläche zurückkehren, sollte jetzt ein Dienst angezeigt werden:
Zurück auf Ihrem Client können Sie ein neues Terminal erstellen und den Webserver vorübergehend stoppen:
CTRL-A C
service nginx stop
Wenn Sie die Webbenutzeroberfläche aktualisieren, können Sie wie erwartet feststellen, dass die Webdienstprüfung jetzt fehlschlägt:
Dies zeigt, dass unser Gesundheitscheck wie erwartet funktioniert.
Fazit
Sie sollten nun eine grundlegende Vorstellung davon haben, wie der Konsul arbeitet. Die Demonstration, die wir in diesem Handbuch zur Verfügung gestellt haben, ist nicht gerade die beste Methode, um mit Consul in der Produktion umzugehen, sondern wurde verwendet, um Ihnen die nützlichen Funktionen der Software schnell vor Augen zu führen.
Innext guide werden wir uns mit der Verwendung von Konsul in einer Produktionsumgebung befassen. Wir werden alle Konfigurationsdetails in Dateien ablegen, um sie leichter nachschlagen zu können, und Upstart-Skripte erstellen, um den Dienst beim Booten zu starten.