So zentralisieren Sie Ihre Docker-Protokolle mit Fluentd und ElasticSearch unter Ubuntu 16.04

Ein Artikel von Fluentd

Einführung

Wenn Sie Docker-Container in die Produktion einrollen, müssen die Protokolle immer häufiger an einem Ort aufbewahrt werden, der weniger kurzlebig ist als die von Containern. Docker wird mit einem nativen Protokollierungstreiber für Fluentd geliefert, mit dem Sie diese Protokolle auf einfache Weise sammeln und an einen anderen Ort wie Elasticsearch weiterleiten können, um die Daten zu analysieren.

Fluentd ist ein Open-Source-Datenkollektor zur Vereinheitlichung Ihrer Protokollierungsinfrastruktur. Es bringt Betriebsingenieure, Anwendungstechniker und Datentechniker zusammen, indem es das Sammeln und Speichern von Protokollen einfach und skalierbar macht.

Fluentd verfügt über vier Hauptmerkmale, die den Bau sauberer und zuverlässiger Protokollierungsleitungen ermöglichen:

  • * Unified Logging mit JSON: * Fluentd versucht, Daten so weit wie möglich als JSON zu strukturieren. Auf diese Weise kann Fluentd alle Aspekte der Verarbeitung von Protokolldaten vereinheitlichen: Sammeln, Filtern, Puffern und Ausgeben von Protokollen über mehrere Quellen und Ziele hinweg. Die nachgelagerte Datenverarbeitung ist mit JSON viel einfacher, da die Struktur ausreicht, um darauf zuzugreifen, ohne starre Schemata zu erzwingen.

  • * Steckbare Architektur: * Fluentd verfügt über ein flexibles Pluginsystem, mit dem die Community ihre Funktionalität erweitern kann. Über 300 von der Community bereitgestellte Plugins verbinden Dutzende von Datenquellen mit Dutzenden von Datenausgängen und bearbeiten die Daten nach Bedarf. Durch die Verwendung von Plugins können Sie Ihre Protokolle sofort besser nutzen.

  • * Erforderliche Mindestressourcen: * Ein Datensammler sollte leichtgewichtig sein, damit er auf einem ausgelasteten Computer problemlos ausgeführt werden kann. Fluentd ist in einer Kombination aus C und Ruby geschrieben und benötigt nur minimale Systemressourcen. Die Vanilla-Instanz wird mit 30 bis 40 MB Arbeitsspeicher ausgeführt und kann 13.000 Ereignisse pro Sekunde und Kern verarbeiten.

  • * Eingebaute Zuverlässigkeit: * Datenverlust sollte niemals auftreten. Fluentd unterstützt speicher- und dateibasiertes Puffern, um Datenverluste zwischen Knoten zu vermeiden. Fluentd unterstützt auch ein robustes Failover und kann für hohe Verfügbarkeit eingerichtet werden.

In diesem Lernprogramm erfahren Sie, wie Sie Fluentd installieren und so konfigurieren, dass Protokolle aus Docker-Containern erfasst werden. Anschließend streamen Sie die Daten in einen anderen Container, in dem Elasticsearch auf demselben Ubuntu 16.04-Server ausgeführt wird, und fragen die Protokolle ab.

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie Folgendes:

Schritt 1 - Fluentd installieren

Die häufigste Methode zum Installieren von http://www.fluentd.org [Fluentd] ist das Paket + td-agent +. https://www.treasuredata.com [Treasure Data], der ursprüngliche Autor von Fluentd, verpackt Fluentd mit einer eigenständigen Ruby-Laufzeit, sodass Sie keine Ruby-Umgebung einrichten müssen, um Fluentd auszuführen. Sie bieten auch ein Skript zum Abrufen des neuesten "+ td-agent" -Pakets, das ein Repository konfiguriert und das Paket für Sie installiert.

Melden Sie sich bei Ihrem Server als Nicht-Root-Benutzer an:

ssh sammy@

Dann installieren Sie + td-agent mit dem Skript von Treasure Data. Laden Sie zuerst das Skript herunter:

\curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh -o install-td-agent.sh

Wenn Sie das Skript überwachen möchten, öffnen Sie es mit Ihrem Texteditor:

nano install-td-agent.sh

Wenn Sie mit dem Inhalt des Skripts vertraut sind, führen Sie das Skript aus, um "+ td-agent" zu installieren:

sh install-td-agent.sh

Sobald die Installation abgeschlossen ist, starten Sie + td-agent:

sudo systemctl start td-agent

Überprüfen Sie die Protokolle, um sicherzustellen, dass sie erfolgreich installiert wurden:

tail /var/log/td-agent/td-agent.log

Es wird eine Ausgabe ähnlich der folgenden angezeigt:

Output    port 8888
 </source>
 <source>
   @type debug_agent
   bind 127.0.0.1
   port 24230
 </source>
</ROOT>
2016-12-02 19:45:31 +0000 [info]: listening fluent socket on 0.0.0.0:24224
2016-12-02 19:45:31 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

Installieren Sie als Nächstes das Elasticsearch-Plugin für Fluentd mit dem Befehl + td-agent-gem +:

sudo td-agent-gem install fluent-plugin-elasticsearch

Fluentd ist jetzt mit der Standardkonfiguration betriebsbereit. Als Nächstes konfigurieren wir Fluentd so, dass wir Docker-Ereignisse überwachen und an eine Elasticsearch-Instanz senden können.

Schritt 2 - Fluentd konfigurieren

Fluentd muss wissen, woher die Informationen stammen und wo sie bereitgestellt werden. Sie definieren diese Regeln in der Fluentd-Konfigurationsdatei unter + / etc / td-agent / td-agent.conf +.

Öffnen Sie diese Datei in Ihrem Texteditor:

sudo nano /etc/td-agent/td-agent.conf

Entfernen Sie den Inhalt der Datei. In diesem Lernprogramm schreiben Sie Ihre eigenen Regeln von Grund auf neu.

Sie definieren Informationsquellen im Abschnitt + source +. Fügen Sie diese Konfiguration zur Datei hinzu:

/etc/td-agent/td-agent.conf

<source>
 @type
 port  24224
</source>

Dies definiert die Quelle als "+ forward +". Hierbei handelt es sich um das Fluentd-Protokoll, das auf TCP ausgeführt wird und von Docker beim Senden der Protokolle an Fluentd verwendet wird.

Wenn die Protokolldatensätze eingehen, sind ihnen einige zusätzliche Felder zugeordnet, darunter "+ time", "+ tag", "+ message", "+ container_id" und einige andere. Sie verwenden die Informationen im Feld "+ tag +", um zu entscheiden, wohin Fluentd diese Daten senden soll. Dies wird als Datenrouting bezeichnet.

Um dies zu konfigurieren, definieren Sie einen Abschnitt "+ match ", der mit dem Inhalt des Feldes " tag +" übereinstimmt, und leiten Sie ihn entsprechend weiter. Fügen Sie diese Konfiguration zur Datei hinzu:

/etc/td-agent/td-agent.conf

<match >
 @type
 logstash_format true
 host 127.0.0.1
 port 9200
 flush_interval
</match>

Diese Regel besagt, dass jeder Datensatz mit einem Tag mit dem Präfix "+ docker. " An Elasticsearch gesendet wird, das auf " 127.0.0.1 " an Port " 9200 " ausgeführt wird. Das ` flush_interval +` teilt Fluentd mit, wie oft es in Elasticsearch aufzeichnen soll.

Nachdem Sie die neue Konfigurationsdatei gespeichert haben, starten Sie den Dienst + td-agent + neu, damit die Änderungen übernommen werden:

sudo systemctl restart td-agent

Nachdem Fluentd für unsere Zwecke ordnungsgemäß konfiguriert wurde, installieren wir Elasticsearch, um unsere Protokolle von Fluentd zu erfassen.

Schritt 3 - Starten des Elasticsearch-Containers

Wir werden Docker verwenden, um unsere Instanz von Elasticsearch auszuführen, da dies schneller ist, als wenn Sie selbst eine Instanz konfigurieren. Wir werden den Elasticsearch Docker image verwenden, um unseren Container zu erstellen. Um dieses Image zu verwenden, erhöhen Sie den Wert von + max_map_count + auf Ihrem Docker-Host wie folgt:

sudo sysctl -w vm.max_map_count=262144

Führen Sie dann diesen Befehl aus, um das Bild von Elasticsearch herunterzuladen und den Container zu starten:

docker run -d -p 9200:9200 -p 9300:9300 elasticsearch

Das Bild wird heruntergeladen und der Elasticsearch-Container wird gestartet. Stellen Sie sicher, dass der Container ordnungsgemäß ausgeführt wird, indem Sie die Docker-Prozesse überprüfen und nach dem Container suchen:

docker ps

Sie sollten die Ausgabe so sehen:

OutputCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                            NAMES
76e96943491f               "/docker-entrypoint.s"   About a minute ago   Up 51 seconds

Wenn der Container nicht aufgeführt ist, starten Sie ihn ohne die Option "+ -d " erneut, damit der Container im Vordergrund ausgeführt wird. Führen Sie den Befehl ` docker run -p 9200: 9200 -p 9300: 9300 elasticsearch ` aus und suchen Sie nach bestimmten Fehlermeldungen. Die wahrscheinlichsten Fehler, auf die Sie stoßen, sind Probleme mit nicht genügend Systemspeicher oder dem zu niedrigen Wert für " max_map_count +" auf Ihrem Docker-Host. Überprüfen Sie alle Schritte in diesem Lernprogramm, um sicherzustellen, dass Sie nichts verpasst haben, und versuchen Sie es erneut.

Nachdem Elasticsearch im Container ausgeführt wird, generieren wir einige Protokolle und übernehmen sie in Fluentd.

Schritt 4 - Generieren von Protokollen aus einem Docker-Container

Mit Docker können Sie Protokolle über die Standardausgabe- (+ STDOUT +) und die Fehler- (+ STDERR +) Schnittstelle als Datenstrom behandeln. Wenn Sie eine Docker-Anwendung starten, weisen Sie Docker einfach an, die Protokolle mit dem nativen Fluentd-Protokollierungstreiber zu löschen. Der Fluentd-Dienst empfängt dann die Protokolle und sendet sie an Elasticsearch.

Testen Sie dies, indem Sie einen Bash-Befehl in einem Docker-Container wie folgt starten:

docker run  ubuntu /bin/echo 'Hello world'

Dadurch wird die Meldung "+ Hello world " an die Standardausgabe ausgegeben, sie wird jedoch auch vom Docker Fluentd-Treiber abgefangen und an den zuvor konfigurierten Fluentd-Dienst gesendet. Nach ungefähr fünf Sekunden werden die Datensätze an Elasticsearch gesendet. Sie haben dieses Intervall im Abschnitt " match +" Ihrer Fluentd-Konfigurationsdatei konfiguriert.

Dies reicht aus, um die Protokolle an Elasticsearch weiterzuleiten. Weitere Informationen zu den von Ihnen gewählten Optionen finden Sie unter official documentation Kann mit Docker verwendet werden, um den Fluentd-Treiber zu verwalten.

Bestätigen wir abschließend, dass Elasticsearch die Ereignisse empfängt. Verwenden Sie + curl +, um eine Anfrage an Elasticsearch zu senden:

curl -XGET 'http://localhost:9200/_all/_search?q=*'

Die Ausgabe enthält Ereignisse, die folgendermaßen aussehen:

{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"logstash-2016.12.02","_type":"fluentd","_id":"AVQwUi-UHBhoWtOFQKVx","_score":1.0,"_source":{"container_id":"d16af3ad3f0d361a1764e9a63c6de92d8d083dcc502cd904155e217f0297e525","container_name":"","source":"stdout","log":"","@timestamp":"2016-12-02T14:59:26-06:00"}}]}}

Je nach Konfiguration werden möglicherweise einige Ereignisse protokolliert. Ein einzelnes Ereignis sollte mit + {" taken ": + beginnen und mit einem Zeitstempel enden. Es enthält auch einige zusätzliche Informationen, die dem Quellcontainer zugeordnet sind. Wie diese Ausgabe zeigt, empfängt Elasticsearch Daten von unserem Docker-Container.

Fazit

Das Sammeln von Protokollen aus Docker-Containern ist nur eine Möglichkeit, Fluentd zu verwenden. Viele Benutzer kommen zu Fluentd, um eine Protokollierungspipeline zu erstellen, die sowohl eine Echtzeit-Protokollsuche als auch eine Langzeitspeicherung durchführt. Diese Architektur nutzt die Fähigkeit von Fluentd, Datenströme zu kopieren und auf mehrere Speichersysteme auszugeben. Beispielsweise können Sie Elasticsearch für die Echtzeitsuche verwenden, MongoDB oder Hadoop jedoch für die Stapelanalyse und die Langzeitspeicherung.

Webanwendungen erstellen viele Protokolle und werden häufig willkürlich formatiert und im lokalen Dateisystem gespeichert. Dies kann aus zwei Gründen zu Problemen führen. Erstens sind die Protokolle nur schwer programmgesteuert zu analysieren und erfordern viele regular expressions und sind daher für diejenigen, die nicht sehr zugänglich möchten das Nutzerverhalten durch statistische Analysen verstehen, die Ergebnisse von A / B-Tests überprüfen oder Betrugserkennungen durchführen.

Zweitens kann nicht in Echtzeit auf die Protokolle zugegriffen werden, da die Textprotokolle massenweise in Speichersysteme geladen werden. Schlimmer noch, wenn die Festplatte des Servers zwischen Massenladevorgängen beschädigt wird, gehen die Protokolle verloren oder sind beschädigt.

Fluentd löst beide Probleme, indem Logger-Bibliotheken für verschiedene Programmiersprachen mit einer konsistenten API bereitgestellt werden. Jeder Logger sendet einen Datensatz mit dem Zeitstempel, einem Tag und einem JSON-formatierten Ereignis an Fluentd, wie Sie es in diesem Tutorial gesehen haben. Es gibt logger-Bibliotheken für Ruby, Node.js, Go, Python, Perl, PHP, Java und C ++. Auf diese Weise können Anwendungen "ausgelöst und vergessen" werden. Der Logger sendet die Daten asynchron an Fluentd, wodurch die Protokolle gepuffert werden, bevor sie an Back-End-Systeme gesendet werden.

Es gibt viele andere nützliche Dinge, die Sie mit Fluentd und Elasticsearch tun können. Folgende Links könnten Sie interessieren: