Eine Einführung in die Verwendung von Consul, einem Service Discovery System, unter Ubuntu 14.04

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 Anwendungscreenverwenden, 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 unsereserver1als 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/uiin Ihrem Webbrowser aufrufen:

http://192.0.2.50:8500/ui

Die Hauptoberfläche sieht folgendermaßen aus:

Consul web UI landing page

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:

Consul intro service

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:

Consul intro failed service

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.