Elasticsearch · 16 min read · Dec 18, 2025

So installieren Sie den Elasticsearch, Fluentd und Kibana (EFK) Logging-Stack auf Ubuntu 22.04

Das Überwachen und Analysieren von Protokollen ist ein wesentlicher Bestandteil der Server- oder Container-Infrastruktur und nützlich beim Umgang mit komplexen Anwendungen. Eine der beliebten Logging-Lösungen ist der Elasticsearch, Fluentd und Kibana (EFK) Stack. Bevor wir weiter in das Tutorial eintauchen, lassen Sie uns die Komponenten des Stacks kennenlernen.

Elasticsearch ist eine Echtzeit-, verteilte und skalierbare Suchmaschine, die eine Volltextsuche und Analysen ermöglicht. Es wird verwendet, um große Datenmengen zu indizieren und zu durchsuchen. Es wird häufig zusammen mit Kibana bereitgestellt, einem leistungsstarken Datenvisualisierungs-Dashboard für Elasticsearch. Kibana ermöglicht es Ihnen, die Elasticsearch-Protokolldaten zu erkunden und Dashboards sowie Abfragen zu erstellen, um Einblicke in Ihre Anwendung zu gewinnen. Fluentd sammelt, transformiert und versendet die Protokolldaten an das Elasticsearch-Backend.

In diesem Tutorial werden wir den EFK-Stack mithilfe von Docker auf einer Ubuntu 22.04-Maschine installieren und Containerprotokolle an Kibana senden, nachdem wir sie mit Fluentd gefiltert und transformiert haben.

Voraussetzungen

  • Ein Server, der Ubuntu 22.04 mit mindestens 6 GB RAM ausführt.
  • Ein Nicht-Root-Benutzer mit Sudo-Rechten.
  • Die unkomplizierte Firewall (UFW) ist aktiviert und läuft.
  • Ein vollqualifizierter Domainname (FQDN), der auf den Server zeigt, wie kibana.example.com.
  • Alles ist aktualisiert. $ sudo apt update && sudo apt upgrade

Schritt 1 - Firewall konfigurieren

Bevor Sie Pakete installieren, besteht der erste Schritt darin, die Firewall so zu konfigurieren, dass HTTP- und HTTPS-Verbindungen erlaubt sind.

Überprüfen Sie den Status der Firewall.

$ sudo ufw status

Sie sollten etwas sehen, das wie folgt aussieht.

Status: aktiv

Zu                         Aktion      Von
--                         ------      ----
OpenSSH                    ERLAUBEN   Überall
OpenSSH (v6)               ERLAUBEN   Überall (v6)

Erlauben Sie HTTP- und HTTPS-Ports.

$ sudo ufw allow http
$ sudo ufw allow https

Überprüfen Sie den Status erneut, um zu bestätigen.

$ sudo ufw status
Status: aktiv

Zu                         Aktion      Von
--                         ------      ----
OpenSSH                    ERLAUBEN   Überall
80/tcp                     ERLAUBEN   Überall
443                        ERLAUBEN   Überall
OpenSSH (v6)               ERLAUBEN   Überall (v6)
80/tcp (v6)                ERLAUBEN   Überall (v6)
443 (v6)                   ERLAUBEN   Überall (v6)

Schritt 2 - Docker und Docker Compose installieren

Fügen Sie den offiziellen GPG-Schlüssel von Docker hinzu.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Führen Sie den folgenden Befehl aus, um das Docker-Repository hinzuzufügen.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Aktualisieren Sie das System, um das Docker-Repository einzuschließen.

$ sudo apt update

Installieren Sie Docker und das Docker-Compose-Plugin.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

In diesem Tutorial verwenden wir das Docker Compose v2-Plugin anstelle des älteren Legacy-Binaries. Daher hat sich der Befehl zum Ausführen von docker-compose in docker compose geändert, und dies wird hier reflektiert.

Docker läuft mit erhöhten Rechten, sodass Sie häufig sudo verwenden müssen, um Befehle auszuführen. Die bessere Option ist, Ihr Linux-Benutzerkonto zur docker-Benutzergruppe hinzuzufügen.

$ sudo usermod -aG docker ${USER}

Die ${USER}-Variable erfasst das aktuell angemeldete Systemkonto. Wenn Sie nicht mit dem Benutzer angemeldet sind, dem Sie Berechtigungen erteilen möchten, ersetzen Sie ${USER} durch den Benutzernamen.

Um die neue Gruppenmitgliedschaft anzuwenden, melden Sie sich vom Server ab und wieder an oder verwenden Sie den folgenden Befehl. Sie werden nach dem Passwort des Benutzers gefragt.

$ su - ${USER}

Schritt 3 - Erstellen Sie die Docker Compose-Datei

Zuerst erstellen Sie das Verzeichnis für das EFK-Projekt.

$ mkdir ~/efk

Wechseln Sie in das Verzeichnis.

$ cd ~/efk

Erstellen und öffnen Sie die docker-compose.yml-Datei zur Bearbeitung.

$ nano docker-compose.yml

Fügen Sie den folgenden Code ein.

services:
  # Bereitstellung mit dem benutzerdefinierten Bild, das während des Build-Prozesses automatisch erstellt wird.
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links: # Sendet eingehende Protokolle an den Elasticsearch-Container.
      - elasticsearch
    depends_on:
      - elasticsearch
    ports: # Exponiert den Port 24224 sowohl im TCP- als auch im UDP-Protokoll für die Protokollaggregation
      - 24224:24224
      - 24224:24224/udp

  elasticsearch:
    image: elasticsearch:8.7.1
    expose:
      - 9200
    environment:
      - discovery.type=single-node # Läuft als Einzelknoten
      - xpack.security.enabled=false
    volumes: # Speichert Elasticsearch-Daten lokal im esdata-Docker-Volume
      - esdata:/usr/share/elasticsearch/data

  kibana:
    image: kibana:8.7.1
    links: # Verknüpft den Kibana-Dienst mit dem Elasticsearch-Container
      - elasticsearch
    depends_on:
      - elasticsearch
    ports:
      - 5601:5601
    environment: # Definierte Hostkonfiguration
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

# Definieren Sie das Docker-Volume mit dem Namen esdata für den Elasticsearch-Container.
volumes:
  esdata:

Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden. Wir haben konfiguriert, um drei Dienste zu starten, einen für jeden, Fluentd, Elasticsearch und Kibana.

Für Fluentd werden wir einen Container erstellen, anstatt ein fertiges Bild zu verwenden. Die Build-Dateien für Fluentd werden im nächsten Schritt eingerichtet. Wir haben ein Verzeichnis für seine Build-Dateien und ein Volume für die Konfigurationsdateien gemountet und den Port 24224 sowohl im TCP- als auch im UDP-Protokoll für die Protokollaggregation exponiert.

Der nächste Dienst ist Elasticsearch, und wir verwenden die neueste Version, die zum Zeitpunkt des Schreibens dieses Tutorials verfügbar ist. Wir haben es über den Port 9200 exponiert und einige Umgebungsvariablen eingerichtet, damit wir es als Einzelknoten-Cluster ausführen können, und die Sicherheitsfunktionen deaktiviert. Dies wird normalerweise nicht empfohlen, aber die Aktivierung der Sicherheit liegt außerhalb des Rahmens dieses Tutorials. Wir haben auch ein lokales Volume für die Elasticsearch-Daten gemountet.

Schließlich konfigurieren wir Kibana und exponieren es über den Port 5601, der verwendet wird, um auf das Dashboard zuzugreifen. Wir haben auch eine Variable eingerichtet, um den Elasticsearch-Host zu konfigurieren, damit er darauf zugreifen kann.

Schritt 4 - Einrichten der Fluentd-Build-Dateien

Erstellen Sie Fluentd und das Konfigurationsverzeichnis.

$ mkdir fluentd/conf -p

Führen Sie den Befehl tree aus, um die Verzeichnisstruktur zu überprüfen.

$ tree

Es sollte wie folgt aussehen.

Ausgabe des Tree-Befehls

Wechseln Sie in das Fluentd-Verzeichnis.

$ cd fluentd

Erstellen und öffnen Sie die Dockerfile zur Bearbeitung.

$ nano Dockerfile

Fügen Sie den folgenden Code ein. Dieser Code zieht das Fluentd Debian Docker-Image und installiert das Fluentd-Plugin für Elasticsearch.

# fluentd/Dockerfile
FROM fluent/fluentd:v1.16-debian-1
USER root
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "5.3.0"]
USER fluent

Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.

Wechseln Sie in das Konfigurationsverzeichnis.

$ cd conf

Erstellen und öffnen Sie die fluentd.conf-Datei zur Bearbeitung.

$ nano fluentd.conf

Fügen Sie den folgenden Code ein.

# binde fluentd an IP 0.0.0.0
# port 24224

  @type forward
  port 24224
  bind 0.0.0.0


# sendlog an den Elasticsearch
# der Host muss mit dem Elasticsearch
# Containerdienst übereinstimmen

  @type copy
  
    @type elasticsearch_dynamic
    hosts elasticsearch:9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    tag_key @log_name
    include_timestamp true
    flush_interval 30s
  
  
    @type stdout
  

Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.

Die source-Direktive oben verwendet das forward-Plugin, das Fluentd in einen TCP-Endpunkt verwandelt, um TCP-Pakete zu akzeptieren.

Die match-Direktive sucht nach Ereignissen mit übereinstimmenden Tags, was in diesem Fall bedeutet, dass sie alle Ereignisse übereinstimmt. Wir werden das elasticsearch_dynamic-Plugin für die Speicherung verwenden, das es ermöglicht, Konfigurationswerte dynamisch anzugeben. Das Feld hosts gibt den Hostnamen für die Elasticsearch-Anwendung an, der der Dienstname in der Docker-Compose-Datei ist. Das logstash_format ist auf true gesetzt, was bedeutet, dass Fluentd das konventionelle Namensformat logstash-%Y.%m.%d verwendet. Der Präfixname zum Schreiben der Ereignisse ist auf fluentd gesetzt. Das include_tag_key ist auf true gesetzt, was den Fluentd-Tag im JSON-Format hinzufügt. Der tag_key ist der Feldname, der für das Tag extrahiert werden soll. Das Setzen der Variablen include_timestamp auf true fügt ein Zeitstempelfeld zum Protokoll hinzu. Das flush_interval gibt das Intervall zwischen den Datenflüssen an. Wir verwenden auch das stdout-Plugin, um Ereignisse/Protokolle an die Standardausgabe zu drucken.

Schritt 5 - Führen Sie die Docker-Container aus

Wechseln Sie zurück in das EFK-Verzeichnis.

$ cd ~/efk

Starten Sie die Container mit dem folgenden Befehl.

$ docker compose up -d

Überprüfen Sie den Status der laufenden Container.

$ docker ps
b3780c311154   efk-fluentd           "tini -- /bin/entryp…"   vor 9 Sekunden   Hoch 8 Sekunden   5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp   efk-fluentd-1
5a48f0a9ade1   kibana:8.7.1          "/bin/tini -- /usr/l…"   vor 9 Sekunden   Hoch 7 Sekunden   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                efk-kibana-1
dab3a0ab0312   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   vor 9 Sekunden   Hoch 8 Sekunden   9200/tcp, 9300/tcp                                                                                       efk-elasticsearch-1

Sie können auch den folgenden Befehl dafür verwenden.

$ docker compose ps
NAME                  IMAGE                 COMMAND                  SERVICE             CREATED             STATUS              PORTS
efk-elasticsearch-1   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   elasticsearch       vor 37 Sekunden      Hoch 36 Sekunden       9200/tcp, 9300/tcp
efk-fluentd-1         efk-fluentd           "tini -- /bin/entryp…"   fluentd             vor 37 Sekunden      Hoch 36 Sekunden       5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp
efk-kibana-1          kibana:8.7.1          "/bin/tini -- /usr/l…"   kibana              vor 37 Sekunden      Hoch 36 Sekunden       0.0.0.0:5601->5601/tcp, :::5601->5601/tcp

Führen Sie die folgenden Befehle aus, um die Protokolle des EFK-Bauprozesses zu überprüfen.

$ docker logs efk-fluentd-1
$ docker logs efk-kibana-1
$ docker logs efk-elasticsearch-1

Untersuchen Sie den Elasticsearch-Container. Es wird die detaillierte Konfiguration des Containers ausgeben.

$ docker inspect efk-elasticsearch-1

Sie können die IP-Adresse sehen, die dem Container zugewiesen wurde.

[
    {
        "Id": "dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66",
        "Created": "2023-05-04T09:58:00.256169904Z",
        "Path": "/bin/tini",
        "Args": [
            "--",
            "/usr/local/bin/docker-entrypoint.sh",
            "eswrapper"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 23619,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-05-04T09:58:00.563700803Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:59075530be34d3a06866f894ae9735f6d739a7a751ad45efb86dec3c9bd16836",
        "ResolvConfPath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/hostname",
        "HostsPath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/hosts",
        "LogPath": "/var/lib/docker/containers/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66/dab3a0ab03120d3a7192045e1ea84fdd0f8fdb7819cc6d6780e05109d61e0b66-json.log",
        "Name": "/efk-elasticsearch-1",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "efk_default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                0,
                0
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "private",
            "Dns": null,
            "DnsOptions": null,
            "DnsSearch": null,
            "ExtraHosts": [],
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": null,
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": null,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "Mounts": [
                {
                    "Type": "volume",
                    "Source": "efk_esdata",
                    "Target": "/usr/share/elasticsearch/data",
                    "VolumeOptions": {}
                }
            ],
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf-init/diff:/var/lib/docker/overlay2/51d6cfcb59e473a3f163e68984a1ba1325a2c816ed7925c4dffdefcf2e104d11/diff:/var/lib/docker/overlay2/b9c096454bda31f1cb2ea33f108be8b29b2e94827ebe94cc17563eb596b7cab1/diff:/var/lib/docker/overlay2/effe604c5b015ba02cf3b7a238bd3ff5dad7970a72e689ef5275fcf03fd0bcd1/diff:/var/lib/docker/overlay2/72fbf23251467ea2f6af8d9458c7fdd8fa3ef716eeafd9319ceff59d07d96788/diff:/var/lib/docker/overlay2/02094ec9e4ebb04371f782744a3a46852a00bf6fd7e8820d466a3576aeb9d5fc/diff:/var/lib/docker/overlay2/ce364cdd636b67e10c879aa152360d965d08fe456663ed8fbe78c3bd37bde6c7/diff:/var/lib/docker/overlay2/33bf44b475ea5ea249845b7eed75ded47dd9dc7877b9231fa4195b4753071945/diff:/var/lib/docker/overlay2/4f19bd8089599ef879075012c710ec464d8e0446fc0a0813850657dddd23a5dc/diff:/var/lib/docker/overlay2/a39a61b12d8565c6d5b33c17a04d47c8bd47609a787e0548fbac0d47d00eecc8/diff:/var/lib/docker/overlay2/cbd9d77eb9ed6b600511f9a676aab511d2aa2b3dbd18d5403559699558546996/diff",
                "MergedDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf/merged",
                "UpperDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf/diff",
                "WorkDir": "/var/lib/docker/overlay2/ee03648cf34e03601848b1769569b4d3bb7192db118102ca050215ba87060bbf/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "efk_esdata",
                "Source": "/var/lib/docker/volumes/efk_esdata/_data",
                "Destination": "/usr/share/elasticsearch/data",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "dab3a0ab0312",
            "Domainname": "",
            "User": "elasticsearch:root",
            "AttachStdin": false,
            "AttachStdout": true,
            "AttachStderr": true,
            "ExposedPorts": {
                "9200": {},
                "9200/tcp": {},
                "9300/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "xpack.security.enabled=false",
                "discovery.type=single-node",
                "PATH=/usr/share/elasticsearch/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "ELASTIC_CONTAINER=true"
            ],
            "Cmd": [
                "eswrapper"
            ],
            "Image": "elasticsearch:8.7.1",
            "Volumes": null,
            "WorkingDir": "/usr/share/elasticsearch",
            "Entrypoint": [
                "/bin/tini",
                "--",
                "/usr/local/bin/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "com.docker.compose.config-hash": "51c818791aa87ea7eccc389578c76ec4d596265eba8baefb8833bf5df13777e3",
                "com.docker.compose.container-number": "1",
                "com.docker.compose.depends_on": "",
                "com.docker.compose.image": "sha256:59075530be34d3a06866f894ae9735f6d739a7a751ad45efb86dec3c9bd16836",
                "com.docker.compose.oneoff": "False",
                "com.docker.compose.project": "efk",
                "com.docker.compose.project.config_files": "/home/navjot/efk/docker-compose.yml",
                "com.docker.compose.project.working_dir": "/home/navjot/efk",
                "com.docker.compose.service": "elasticsearch",
                "com.docker.compose.version": "2.17.3",
                "org.label-schema.build-date": "2023-04-27T04:33:42.127815583Z",
                "org.label-schema.license": "Elastic-License-2.0",
                "org.label-schema.name": "Elasticsearch",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.url": "https://www.elastic.co/products/elasticsearch",
                "org.label-schema.usage": "https://www.elastic.co/guide/en/elasticsearch/reference/index.html",
                "org.label-schema.vcs-ref": "f229ed3f893a515d590d0f39b05f68913e2d9b53",
                "org.label-schema.vcs-url": "https://github.com/elastic/elasticsearch",
                "org.label-schema.vendor": "Elastic",
                "org.label-schema.version": "8.7.1",
                "org.opencontainers.image.created": "2023-04-27T04:33:42.127815583Z",
                "org.opencontainers.image.documentation": "https://www.elastic.co/guide/en/elasticsearch/reference/index.html",
                "org.opencontainers.image.licenses": "Elastic-License-2.0",
                "org.opencontainers.image.ref.name": "ubuntu",
                "org.opencontainers.image.revision": "f229ed3f893a515d590d0f39b05f68913e2d9b53",
                "org.opencontainers.image.source": "https://github.com/elastic/elasticsearch",
                "org.opencontainers.image.title": "Elasticsearch",
                "org.opencontainers.image.url": "https://www.elastic.co/products/elasticsearch",
                "org.opencontainers.image.vendor": "Elastic",
                "org.opencontainers.image.version": "8.7.1"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "bf47cd7764585766349085d35100611e086cf233fc9fc655c6eb9e086f1cd59a",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "9200/tcp": null,
                "9300/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/bf47cd776458",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "efk_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "efk-elasticsearch-1",
                        "elasticsearch",
                        "dab3a0ab0312"
                    ],
                    "NetworkID": "1bc8ac0185982b84a24a201852f2cddc0432a3ffff1a2bd4008074875f696cac",
                    "EndpointID": "e1c67199e679f350d1da47f0b1e208ec6a7767eb57d60f773ba08b88a6962dcf",
                    "Gateway": "172.23.0.1",
                    "IPAddress": "172.23.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:17:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

Wie Sie sehen können, hat der Container die IP-Adresse 172.23.0.2 erhalten. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob Elasticsearch korrekt funktioniert.

$ curl 172.23.0.2:9200
{
  "name" : "dab3a0ab0312",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "gldMFBtQSxS5sL93rBAdzA",
  "version" : {
    "number" : "8.7.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "f229ed3f893a515d590d0f39b05f68913e2d9b53",
    "build_date" : "2023-04-27T04:33:42.127815583Z",
    "build_snapshot" : false,
    "lucene_version" : "9.5.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Schritt 6 - Kibana konfigurieren

Jetzt, da der EFK-Stack bereitgestellt ist, ist es Zeit, Kibana zu konfigurieren. Öffnen Sie die URL http://:5601 im Browser.

Kibana-Startseite

Klicken Sie auf die Schaltfläche Erforschen Sie es selbst, um zum Kibana-Dashboard zu gelangen.

Kibana-Dashboard

Klicken Sie auf den Link Stack-Verwaltung, um die Kibana-Datenansicht einzurichten. Wählen Sie die Option Kibana >> Datenansichten aus der linken Seitenleiste, um die Seite für die Datenansicht zu öffnen.

Kibana-Datenansicht-Seite

Klicken Sie auf die Schaltfläche Datenansicht erstellen, um fortzufahren.

Kibana-Datenansicht erstellen

Geben Sie den Namen der Datenansicht und das Indexmuster als fluentd-* ein. Stellen Sie sicher, dass das Zeitstempelfeld auf @timestamp eingestellt ist. Das Quellfeld wird automatisch aktualisiert. Klicken Sie auf die Schaltfläche Datenansicht in Kibana speichern, um die Datenansicht zu erstellen.

Klicken Sie als Nächstes auf das obere Menü (Ellipsen) und klicken Sie auf die Option Entdecken, um die Protokollüberwachung anzuzeigen.

Sie erhalten die folgende Seite, die bestätigt, dass Ihre Einrichtung perfekt funktioniert. Die Protokolle stammen alle von Elasticsearch und werden von der Fluentd-Protokollaggregation versendet.

Kibana Fluentd Überwachungsprotokolle

Schritt 7 - Nginx installieren

Ubuntu 22.04 wird mit einer älteren Version von Nginx ausgeliefert. Sie müssen das offizielle Nginx-Repository herunterladen, um die neueste Version zu installieren.

Importieren Sie den Signaturschlüssel von Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Fügen Sie das Repository für die stabile Version von Nginx hinzu.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Aktualisieren Sie die System-Repositorys.

$ sudo apt update

Installieren Sie Nginx.

$ sudo apt install nginx

Überprüfen Sie die Installation.

$ nginx -v
nginx version: nginx/1.24.0

Starten Sie den Nginx-Server.

$ sudo systemctl start nginx

Schritt 8 - SSL installieren

Der erste Schritt besteht darin, das Let’s Encrypt SSL-Zertifikat zu installieren. Wir müssen Certbot installieren, um das SSL-Zertifikat zu generieren. Sie können Certbot entweder über das Ubuntu-Repository installieren oder die neueste Version mit dem Snapd-Tool herunterladen. Wir werden die Snapd-Version verwenden.

Ubuntu 22.04 wird standardmäßig mit Snapd installiert. Führen Sie die folgenden Befehle aus, um sicherzustellen, dass Ihre Version von Snapd auf dem neuesten Stand ist.

$ sudo snap install core && sudo snap refresh core

Installieren Sie Certbot.

$ sudo snap install --classic certbot

Verwenden Sie den folgenden Befehl, um sicherzustellen, dass der Certbot-Befehl ausgeführt werden kann, indem Sie einen symbolischen Link zum Verzeichnis /usr/bin erstellen.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Generieren Sie das SSL-Zertifikat für die Domain kibana.example.com.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d kibana.example.com

Der obige Befehl lädt ein Zertifikat in das Verzeichnis /etc/letsencrypt/live/kibana.example.com auf Ihrem Server herunter.

Generieren Sie ein Diffie-Hellman-Gruppen-Zertifikat.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Überprüfen Sie den Certbot-Erneuerungsplanungsdienst.

$ sudo systemctl list-timers

Sie finden snap.certbot.renew.service als einen der Dienste, die geplant sind, um ausgeführt zu werden.

NEXT                        LEFT          LAST                        PASSED         UNIT                     ACTIVATES
------------------------------------------------------------------------------------------------------------------------------------
Mon 2023-05-06 13:37:57 UTC 3h 45min left Mon 2023-05-01 07:20:42 UTC 2h 31min ago   ua-timer.timer           ua-timer.service
Mon 2023-05-06 14:39:29 UTC 4h 47min left Sat 2023-02-04 16:04:18 UTC 2 months ago   motd-news.timer          motd-news.service
Mon 2023-05-06 15:53:00 UTC 6h left       n/a                         n/a            snap.certbot.renew.timer snap.certbot.renew.service

Führen Sie einen Testlauf des Prozesses durch, um zu überprüfen, ob die SSL-Erneuerung einwandfrei funktioniert.

$ sudo certbot renew --dry-run

Wenn Sie keine Fehler sehen, sind Sie bereit. Ihr Zertifikat wird automatisch erneuert.

Schritt 9 - Nginx konfigurieren

Erstellen und öffnen Sie die Nginx-Konfigurationsdatei für Kibana.

$ sudo nano /etc/nginx/conf.d/kibana.conf

Fügen Sie den folgenden Code ein. Ersetzen Sie die IP-Adresse durch die private IP-Adresse Ihres Elasticsearch-Servers.

server {
        listen 80; listen [::]:80;
        server_name kibana.example.com;
        return 301 https://$host$request_uri;
}

server {
        server_name kibana.example.com;
        charset utf-8;

        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        access_log /var/log/nginx/kibana.access.log;
        error_log /var/log/nginx/kibana.error.log;

        ssl_certificate /etc/letsencrypt/live/kibana.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/kibana.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/kibana.example.com/chain.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;
        ssl_session_tickets off;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

        resolver 8.8.8.8;

        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        location / {
                proxy_pass http://localhost:5601;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.

Öffnen Sie die Datei /etc/nginx/nginx.conf zur Bearbeitung.

$ sudo nano /etc/nginx/nginx.conf

Fügen Sie die folgende Zeile vor der Zeile include /etc/nginx/conf.d/*.conf; hinzu.

server_names_hash_bucket_size  64;

Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden.

Überprüfen Sie die Konfiguration.

$ sudo nginx -t
nginx: die Konfigurationsdatei /etc/nginx/nginx.conf Syntax ist ok
nginx: Konfigurationsdatei /etc/nginx/nginx.conf Test war erfolgreich

Starten Sie den Nginx-Dienst neu.

$ sudo systemctl restart nginx

Es gibt noch einen Schritt, der erforderlich ist. Öffnen Sie die Docker-Compose-Datei zur Bearbeitung.

$ nano ~/docker-compose.yml

Fügen Sie die Zeile SERVER_PUBLICBASEURL=https://kibana.example.com unter dem Abschnitt Umgebung unter dem Kibana-Dienst wie folgt ein.

    environment: # Definierte Hostkonfiguration
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - SERVER_PUBLICBASEURL=https://kibana.example.com

Speichern Sie die Datei, indem Sie Ctrl + X drücken und Y eingeben, wenn Sie dazu aufgefordert werden, sobald Sie fertig sind.

Stoppen und entfernen Sie die Container.

$ docker compose down --remove-orphans

Starten Sie die Container erneut mit der aktualisierten Konfiguration.

$ docker compose up -d

Ihr Kibana-Dashboard sollte über die URL https://kibana.example.com von überall zugänglich sein.

Schritt 10 - Ausführen eines Docker-Containers mit dem Fluentd-Protokolltreiber

Jetzt werden wir einen Docker-Container mit dem Fluentd-Protokolltreiber ausführen, der automatisch Protokolle an den Stack sendet. Wir werden den Nginx-Container zu Testzwecken verwenden.

Ziehen Sie das Nginx-Image aus dem Docker Hub-Registry. Wir verwenden die alpine-Version, da es die kleinste Version des Images ist.

$ docker pull nginx:alpine

Führen Sie den folgenden Befehl aus, um den Nginx-Container zu erstellen und zu starten. Wir haben den Protokolltreiber auf Fluentd und den Port auf 8080 gesetzt, da der Standardport 80 bereits vom Nginx-Server im Proxy-Modus verwendet wird.

$ docker run --name nginx-fluentd-test -d --log-driver=fluentd -p 8080:80 nginx:alpine

Überprüfen Sie den Containerstatus.

$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                    NAMES
038c43e4e1a3   nginx:alpine          "/docker-entrypoint.…"   vor 12 Sekunden   Hoch 11 Sekunden   0.0.0.0:8080->80/tcp, :::8080->80/tcp                                                                    nginx-fluentd-test
a94ca706bd0c   efk-fluentd           "tini -- /bin/entryp…"   vor 8 Stunden      Hoch 8 Stunden      5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp, :::24224->24224/tcp, :::24224->24224/udp   efk-fluentd-1
0cf04a446425   kibana:8.7.1          "/bin/tini -- /usr/l…"   vor 8 Stunden      Hoch 8 Stunden      0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                efk-kibana-1
7c7ad8f9b123   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   vor 8 Stunden      Hoch 8 Stunden      9200/tcp, 9300/tcp                                                                                       efk-elasticsearch-1

Führen Sie den folgenden Befehl aus, um auf den Nginx-Container zuzugreifen und Zugriffsprotokolle zu generieren.

$ curl localhost:8080



Willkommen bei nginx!



Willkommen bei nginx!

Wenn Sie diese Seite sehen, wurde der Nginx-Webserver erfolgreich installiert und funktioniert. Weitere Konfiguration ist erforderlich.

Für Online-Dokumentation und Unterstützung besuchen Sie bitte nginx.org.
Kommerzielle Unterstützung ist verfügbar unter nginx.com.

Danke, dass Sie nginx verwenden.

Alternativ können Sie die URL http://:8080 in Ihrem Browser öffnen, und Sie erhalten die folgende Seite.

Nginx-Startseite

Öffnen Sie das Kibana-Dashboard und klicken Sie auf den Link Entdecken im linken Seitenmenü. Klicken Sie auf das +-Zeichen im oberen Menü, um das Popup Filter hinzufügen zu öffnen.

Kibana Popup Filter hinzufügen

Wählen Sie das Feld container_name aus dem Dropdown-Menü, is als Operator und füllen Sie den Containernamen (nginx-fluentd-test) als Feldwert aus.

Kibana Container auswählen Abfrage

Klicken Sie auf die Schaltfläche Filter hinzufügen, um die Daten aus dem Nginx-Container zu visualisieren.

Nginx-Container Fluentd-Protokoll

Fazit

Damit endet unser Tutorial zur Installation des Elasticsearch, Fluentd und Kibana (EFK) Logging-Stacks auf einer Ubuntu 22.04-Maschine. Wenn Sie Fragen haben, posten Sie diese bitte in den Kommentaren unten.

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.