{"id":6358,"date":"2019-10-12T20:26:42","date_gmt":"2019-10-12T18:26:42","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=6358"},"modified":"2019-10-13T12:45:25","modified_gmt":"2019-10-13T10:45:25","slug":"elasticsearch-und-kibana-mit-docker-compose-installieren","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/elasticsearch-und-kibana-mit-docker-compose-installieren\/","title":{"rendered":"Elasticsearch und Kibana mit Docker-Compose installieren"},"content":{"rendered":"<p>Elasticsearch ist einer der verbreitetsten Suchserver: Er ist schnell und bietet umfangreiche M\u00f6glichkeiten, um verschiedene Inhalte zu durchsuchen. Ein g\u00e4ngiger Anwendungsfall ist der ELK-Stack: Logstash sammelt hierbei die Logs von verschiedenen Anwendungen und speichert diese in Elasticsearch. Kibana erm\u00f6glicht das Durchsuchen sowie visuelle Aufbereiten der Daten in einem Web-Interface. Elasticsearch kann eben so f\u00fcr eigene Daten genutzt werden &#8211; beispielsweise um Anwendungen mit einer Suchfunktion zu versehen.<\/p>\n<p>In diesem Artikel m\u00f6chten wir uns auf ein simples Beispiel beschr\u00e4nken: Jeweils ein Container stellt Elasticsearch und Kibana bereit. Beispieldaten werden mit einem simplen Python-Skript eingef\u00fcgt. Dies steht repr\u00e4sentativ f\u00fcr eine Applikation.<\/p>\n<h2 class=\"wp-block-heading\">Vorbereitung<\/h2>\n<p>Elasticsearch erfordert das Erh\u00f6hen des Kernel-Parameters vm.max_map_count. Hierzu folgenden Befehl als root ausf\u00fchren:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsysctl -w vm.max_map_count=262144\n<\/pre>\n<\/div>\n<p>Dies setzt den Parameter bis zum n\u00e4chsten Neustart. Damit er dauerhaft erhalten bleibt, sollte er zus\u00e4tzlich in \/etc\/sysctl.conf  gesetzt werden. <\/p>\n<h2 class=\"wp-block-heading\">Docker-Compose File erstellen<\/h2>\n<p>Zun\u00e4chst erzeugen wir die zwei genannten Container:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nversion: &#039;2.2&#039;\n\nservices:\n  elasticsearch:\n    image: docker.elastic.co\/elasticsearch\/elasticsearch:6.8.3\n    mem_limit: 4G\n    ulimits:\n      memlock:\n        soft: -1\n        hard: -1\n    volumes:\n      - es-ul-test-data:\/usr\/share\/elasticsearch\/data\n    environment:\n      - bootstrap.memory_lock=true\n      - ES_JAVA_OPTS=-Xms512m -Xmx512m\n      - discovery.type=single-node\n      - http.port=9200\n      - http.cors.enabled=true\n      - http.cors.allow-origin=*\n      - http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization\n      - http.cors.allow-credentials=true\n    ports:\n      - 9200:9200\n      - 9300:9300\n\n  kibana:\n    image: docker.elastic.co\/kibana\/kibana:6.8.3\n    mem_limit: 2G\n    ports:\n      - 5601:5601\n\nvolumes:\n  es-ul-test-data:\n\n<\/pre>\n<\/div>\n<p>Die Compose-Datei ist recht einfach gehalten. Nach dem Ausf\u00fchren von docker-compose up -d dauert es einige Sekunden, bis ihr Kibana \u00fcber http:\/\/localhost:5601 erreichen k\u00f6nnt. <\/p>\n<p>Produktiv sollten mindestens http.cors.allow-origin auf die jeweilige Adresse des Frontends gesetzt sowie Kibana gesch\u00fctzt werden. Es empfiehlt sich jedoch, Elasticsearch nicht \u00f6ffentlich erreichbar zu machen. Stattdessen soll nur \u00fcber Wrapper (z.B. das Backend der Web-Applikation) darauf zugegriffen werden. <\/p>\n<h2 class=\"wp-block-heading\">Index mit Beispieldaten erzeugen<\/h2>\n<p>Alle nachfolgenden Aktionen f\u00fchren wir in der Konsole von Kibana aus: Links auf &#8222;Dev Tools&#8220;, dann &#8222;Konsole&#8220;. Es gibt aber diverse andere Methoden: Die Verwendung der Web-API mit einem Werkzeug wie curl, diverse Frameworks f\u00fcr nahezu alle g\u00e4ngigen Programmiersprachen (C#, Java, Python und weitere). Das manuelle Ausf\u00fchren der Anfragen halte ich f\u00fcr den Einstieg am sinnvollsten, um ein Grundverst\u00e4ndnis von Elasticsearch zu erlangen. <\/p>\n<p>Zun\u00e4chst erzeugen wir einen Index, den wir hier &#8222;test&#8220; nennen: <\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/4985Wv.png\" alt=\"\"\/><\/figure>\n<p>Die Warnung rechts kann f\u00fcr erste Tests ignoriert werden. Nun lassen sich Daten einf\u00fcgen. Hierf\u00fcr dienen JSON-Dokumente ohne Schema:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nPUT \/test\/_doc\/1\n{\n    &quot;title&quot;: &quot;Erstes Dokument&quot;,\n    &quot;author&quot;: &quot;Testuser&quot;\n}\n<\/pre>\n<\/div>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/7053Vx.png\" alt=\"\"\/><\/figure>\n<p>Nach diesem Schema k\u00f6nnen ein paar Testdokumente angelegt werden: Einfach die Id erh\u00f6hen und wahlweise die Daten etwas \u00e4ndern.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nPUT \/test\/_doc\/2\n{\n    &quot;title&quot;: &quot;Zweites Dokument&quot;,\n    &quot;author&quot;: &quot;DokTester&quot;\n}\n<\/pre>\n<\/div>\n<h2 class=\"wp-block-heading\">Daten in Kibana anzeigen<\/h2>\n<p>Zun\u00e4chst f\u00fcgen wir den Index hinzu: Management &gt; Kibana Index Pattern &gt; Create Index Pattern. In das Feld &#8222;Index pattern&#8220; den Name des Index (hier &#8222;test&#8220;) eingeben und mit &#8222;Next Step&#8220; sowie anschlie\u00dfend &#8222;Create Index Pattern&#8220; best\u00e4tigen.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/8785Xd.png\" alt=\"\"\/><\/figure>\n<p>Nun in der Navigationsleiste links auf &#8222;Discover&#8220; klicken und sicherstellen, dass der soeben angelegte Index &#8222;test*&#8220; ausgew\u00e4hlt ist. Darunter sind die erstellten Test-Dokumente sichtbar:<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/5146Ed.png\" alt=\"\"\/><\/figure>\n<p>Via Klick l\u00e4sst sich das Dokument ausklappen und mit entsprechenden Zeilenumbr\u00fcchen besser lesen (wichtig bei komplexeren Daten). Im Suchfeld oben k\u00f6nnen wir auf alle Eigenschaften filtern. Beispielsweise suchen wir mit<\/p>\n<pre class=\"wp-block-code\"><code class=\"\" data-line=\"\">title: &quot;Erstes&quot;<\/code><\/pre>\n<p>nach allen Dokumenten, deren Titel das Wort &#8222;Erstes&#8220; beinhaltet: <\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/6395Om.png\" alt=\"\"\/><\/figure>\n<h2 class=\"wp-block-heading\">Fazit: M\u00e4chtiges Werkzeug<\/h2>\n<p>Obwohl sowohl Elasticsearch als auch Kibana m\u00e4chtige Werkzeuge sind, gelingt der Einstieg vergleichsweise schnell. Je nach Einsatzzweck kann man nun verschiedene Themen vertiefen, beispielsweise: Realisieren und Integrieren einer Suche, in Kibana Filter oder Diagramme zur Visualisierung erstellen usw. Letzteres ist vor allem f\u00fcr die Analyse von Logs n\u00fctzlich. So k\u00f6nnte man sich ein Dashboard erstellen, dass beispielsweise in einem Diagramm alle HTTP-Statuscodes anzeigt und diese mit dem zeitlichen Auftreten verkn\u00fcpft. <\/p>\n<p>Diese Themen steigen jedoch deutlich Tiefer in die Thematik ein und w\u00fcrden den Rahmen dieses Artikels sprengen. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Elasticsearch ist einer der verbreitetsten Suchserver: Er ist schnell und bietet umfangreiche M\u00f6glichkeiten, um verschiedene Inhalte zu durchsuchen. Ein g\u00e4ngiger Anwendungsfall ist der ELK-Stack: Logstash sammelt hierbei die Logs von verschiedenen Anwendungen und speichert diese in Elasticsearch. Kibana erm\u00f6glicht das Durchsuchen sowie visuelle Aufbereiten der Daten in einem Web-Interface. Elasticsearch kann eben so f\u00fcr eigene &#8230;<\/p>\n","protected":false},"author":5,"featured_media":6366,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78,1],"tags":[497,749,748,751,752],"class_list":["post-6358","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","category-technik-news","tag-docker","tag-elasticsearch","tag-kibana","tag-logs","tag-suche"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=6358"}],"version-history":[{"count":9,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6358\/revisions"}],"predecessor-version":[{"id":6380,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6358\/revisions\/6380"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/6366"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=6358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=6358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=6358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}