Vorgänger: HowTo: Install ELK-Stack unter Debian 9
Das folgende HowTo zeigt wie ein Amazon OpenSearch Cluster installiert werden kann mithilfe von Docker Containern bzw. Docker-Compose.
OpenSearch ist ein auf dem ELK-Stack (Elasticsearch Version 7.10.2), der letzten „freien“ Version, aufbauender Ersatz welcher das Sammeln, Auswerten, Anreichern und Darstellen von Logs bzw. Logeinträgen ermöglicht.
1. Vorbereitung:
- fertig installierter Ubuntu 20.04 LTS Server (>=4GB RAM empfohlen)
- Dokumentation OpenSearch (https://opensearch.org/docs/latest)
2. Update
apt-get update &&apt-get -y dist-upgrade apt-get install
apt-transport-https software-properties-common wget telnet net-tools psmisc curl ca-certificates curl gnupg lsb-release vim
3. Vorbereitung Installation Docker und Docker-Compose
Installation von Docker für die Bereitstellung von Container und die Installation von Docker-Compose. Letzteres ist eine Verwaltung von Docker Container mithilfe von Konfigurations-Dateien (yml files).
Hinzufügen des Docker GPG Schlüssel für die Nutzung des Repository:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Ergänzen des Docker Repository in der lokalen Konfiguration:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Installation von Docker:
apt-get update && apt-get install docker-ce docker-ce-cli containerd.io
Installation von Docker-Compose:
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Ausführrechte setzen, damit docker-compose ausgeführt werden kann:
chmod +x /usr/local/bin/docker-compose /usr/local/bin/docker-compose
Verlinkung von docker-compose, damit dieses systemweit genutzt werden kann, ohne den absoluten Pfad nutzen zu müssen:
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. Installation & Konfiguration OpenSearch und OpenSearch-Dashboards
Der folgende Abschnitt beschreibt wie OpenSearch (Ersatz Elasticsearch) und OpenSearch Dashboards (Kibana Ersatz) installiert wird. Generell kann man OpenSearch per Tar-Archive (Empfohlen für Test- und Entwicklungssysteme) standalone betreiben oder mittels Docker Container. Allgemein sind die Docker Container zu empfehlen, da diese einfach erweiterbar (Skalierbarkeit), leichter zu updaten und komfortabler zu verwalten sind.
Erstellung von Unterordnern für den besseren Überblick
mkdir -p /opt/docker/opensearch/docker-compose && cd /opt/docker/opensearch/docker-compose
Beispiel docker-compose.yml Inhalt, zu finden unter Sample Docker Compose File
version: '3'
services:
opensearch-node1:
image: opensearchproject/opensearch:1.1.0
container_name: opensearch-node1
environment:
- cluster.name=opensearch-cluster
- node.name=opensearch-node1
- discovery.seed_hosts=opensearch-node1,opensearch-node2
- cluster.initial_master_nodes=opensearch-node1,opensearch-node2
- bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536 # maximum number of open files for the OpenSearch user, set to at least 65536 on modern systems
hard: 65536
volumes:
- opensearch-data1:/usr/share/opensearch/data
ports:
- 9200:9200
- 9600:9600 # required for Performance Analyzer
networks:
- opensearch-net
opensearch-node2:
image: opensearchproject/opensearch:1.1.0
container_name: opensearch-node2
environment:
- cluster.name=opensearch-cluster
- node.name=opensearch-node2
- discovery.seed_hosts=opensearch-node1,opensearch-node2
- cluster.initial_master_nodes=opensearch-node1,opensearch-node2
- bootstrap.memory_lock=true
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- opensearch-data2:/usr/share/opensearch/data
networks:
- opensearch-net
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:1.1.0
container_name: opensearch-dashboards
ports:
- 5601:5601
expose:
- "5601"
environment:
OPENSEARCH_HOSTS: '["https://opensearch-node1:9200","https://opensearch-node2:9200"]' # must be a string with no spaces when specified as an environment variable
networks:
- opensearch-net
volumes:
opensearch-data1:
opensearch-data2:
networks:
opensearch-net:
Bevor der Container gestartet wird müssen noch Limits angehoben werden, da ansonsten Fehlermeldungen wie die folgende angezeigt werden:
opensearch-dashboards | {"type":"log","@timestamp":"2021-10-20T18:21:53Z","tags":["error","opensearch","data"],"pid":1,"message":"[ConnectionError]: getaddrinfo ENOTFOUND opensearch-node1 opensearch-node1:9200"}
Die Lösung: Ergänzen des Parameters „vm.max_map_count=262144“ in der „/etc/sysctl.conf“ und anschließendes neuladen der Parameter per „sysctl -p“.
Der Container kann wie folgt gestartet werden:
docker-compose up -d
Sofern man den Parameter „-d“ weglässt, startet der Container in der aktuellen Sitzung und man erhält alle Debug/Log Informationen
Die letzten Zeiles des Outputs (ohne „-d“ Parameter) sollten in etwa wie folgt aussehen:
opensearch-dashboards | {"type":"log","@timestamp":"2021-11-11T19:53:57Z","tags":["info","savedobjects-service"],"pid":1,"message":"Starting saved objects migrations"}
opensearch-dashboards | {"type":"log","@timestamp":"2021-11-11T19:53:57Z","tags":["info","savedobjects-service"],"pid":1,"message":"Creating index .kibana_1."}
opensearch-node1 | [2021-11-11T19:53:57,737][DEPRECATION][o.o.d.c.m.MetadataCreateIndexService] [opensearch-node1] index name [.kibana_1] starts with a dot '.', in the next major version, index names starting with a dot are reserved for hidden indices and system indices
opensearch-node1 | [2021-11-11T19:53:57,760][INFO ][o.o.c.m.MetadataCreateIndexService] [opensearch-node1] [.kibana_1] creating index, cause [api], templates [], shards [1]/[1]
opensearch-dashboards | {"type":"log","@timestamp":"2021-11-11T19:53:57Z","tags":["info","savedobjects-service"],"pid":1,"message":"Pointing alias .kibana to .kibana_1."}
opensearch-dashboards | {"type":"log","@timestamp":"2021-11-11T19:53:58Z","tags":["info","savedobjects-service"],"pid":1,"message":"Finished in 312ms."}
opensearch-dashboards | {"type":"log","@timestamp":"2021-11-11T19:53:58Z","tags":["info","plugins-system"],"pid":1,"message":"Starting [45] plugins: [alertingDashboards,usageCollection,opensearchDashboardsUsageCollection,opensearchDashboardsLegacy,mapsLegacy,share,opensearchUiShared,legacyExport,embeddable,expressions,data,home,console,apmOss,management,indexPatternManagement,advancedSettings,savedObjects,securityDashboards,indexManagementDashboards,anomalyDetectionDashboards,dashboard,notebooksDashboards,visualizations,visTypeVega,visTypeTimeline,timeline,visTypeTable,visTypeMarkdown,tileMap,regionMap,inputControlVis,ganttChartDashboards,visualize,traceAnalyticsDashboards,reportsDashboards,queryWorkbenchDashboards,charts,visTypeVislib,visTypeTimeseries,visTypeTagcloud,visTypeMetric,discover,savedObjectsManagement,bfetch]"}
opensearch-node1 | [2021-11-11T19:53:58,080][INFO ][o.o.c.r.a.AllocationService] [opensearch-node1] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[.kibana_1][0]]]).
opensearch-node1 | [2021-11-11T19:53:58,589][INFO ][o.o.c.m.MetadataIndexTemplateService] [opensearch-node1] adding template [tenant_template] for index patterns [.kibana_-*_*, .kibana_0*_*, .kibana_1*_*, .kibana_2*_*, .kibana_3*_*, .kibana_4*_*, .kibana_5*_*, .kibana_6*_*, .kibana_7*_*, .kibana_8*_*, .kibana_9*_*]
opensearch-dashboards | {"type":"log","@timestamp":"2021-11-11T19:53:58Z","tags":["listening","info"],"pid":1,"message":"Server running at http://0:5601"}
opensearch-dashboards | {"type":"log","@timestamp":"2021-11-11T19:53:59Z","tags":["info","http","server","OpenSearchDashboards"],"pid":1,"message":"http server running at http://0:5601"}
Nun werden drei Container gestartet: OpenSearch-Node1 sowie OpenSearch-Node2 (jeweils „Elasticsearch“) sowie OpenSearch-Dashboard (Kibana). Sinnvoll wäre eine Verteilung der Container auf verschiedene virtuelle Maschinen (VMs) oder direkt auf mehrere Hardware Nodes. Zu beachten ist, dass zusätzlich Port 9300 freigegeben wird.
Nachdem alle Container korrekt gestartet sind, kann man mittels der IP/DNS Adresse und dem Protokoll https per Port 9200 auf das Opensearch Backend zugreifen:
Ebenso muss nun Opensearch-Dashboard erreichbar sein via „http://%ip%:5601“. Einloggen kann man sich mit den Default-Logindaten „admin“ und gleichnamigen Passwort:
5. Installation & Konfiguration Logstash
Erstellung von Unterordnern für den besseren Überblick
mkdir -p /opt/docker/logstash/docker-compose && cd /opt/docker/logstash/docker-compose
Logstah docker-compose.yml:
version: '3'
services:
logstash-node01:
image: opensearchproject/logstash-oss-with-opensearch-output-plugin:7.13.2
container_name: logstash
volumes:
# - opensearch-logstash1
- /opt/logstash/data/config/pipeline:/usr/share/logstash/pipeline
- /opt/logstash/data/config/patterns:/usr/share/logstash/patterns
ports:
- "5044:5044"
- "514:514"
- "10514:10514"
networks:
- opensearch-net
#volumes:
# opensearch-logstash1:
networks:
opensearch-net:
In der Sektion „ports“ müssen alle Ports hinterlegt werden, welche auch für Inputs genutzt werden.
Datei: /opt/logstash/data/config/pipeline/logstash-opensearch.conf
input {
beats {
port => 5044
}
}
output {
opensearch {
hosts => ["https://opensearch-node1:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
ssl => true
ssl_certificate_verification => false
user => "admin"
password => "admin"
}
}
Die Konfigurationen können und sollten bei umfangreicheren Einstellungen in verschiedene „*.conf“ Dateien ausgelagert werden. Ebenso ist ein sinniges Index-Namensschema zu empfehlen, da Elasticsearch per Default auf 1.000 Indices begrenzt ist. In der o.g. Datei sind auch keine Filter hinterlegt.
Weitere Hinweise zur Installation von Logstash folgen…
TODOs:
- Zertifikate selbst generieren
- Adminzugang für Logstash austauschen
- Passwort admin für GUI ändern