Archive for  Oktober 2021

Home / Oktober 2021
1 Post

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:

 

2. Update

apt-get update &&apt-get -y dist-upgrade
apt-get installapt-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