Ako nainštalovať zásobník protokolovania Elasticsearch, Fluentd a Kibana (EFK) na Ubuntu 22.04


Na tejto stránke

  1. Predpoklady
  2. Krok 1 - Nakonfigurujte bránu firewall
  3. Krok 2 - Nainštalujte Docker a Docker Compose
  4. Krok 3 - Vytvorte súbor Docker Compose File
  5. Krok 4 – Nastavte súbory Fluentd Build Files
  6. Krok 5 - Spustite kontajnery Docker
  7. Krok 6 - Nakonfigurujte Kibana
  8. Krok 7 - Nainštalujte Nginx
  9. Krok 8 - Nainštalujte SSL
  10. Krok 9 - Nakonfigurujte Nginx
  11. Krok 10 – Spustenie kontajnera Docker s ovládačom Fluentd Log Driver
  12. Záver

Monitorovanie a analýza protokolov je nevyhnutnou súčasťou serverovej alebo kontajnerovej infraštruktúry a je užitočná pri práci so zložitými aplikáciami. Jedným z populárnych riešení protokolovania je zásobník Elasticsearch, Fluentd a Kibana (EFK). Predtým, ako prejdeme ďalej do tutoriálu, dozvedáme sa o komponentoch zásobníka.

Elasticsearch je distribuovaný a škálovateľný vyhľadávací nástroj v reálnom čase, ktorý umožňuje fulltextové vyhľadávanie a analýzy. Používa sa na indexovanie a prehľadávanie veľkého množstva údajov. Bežne sa používa spolu s Kibana, výkonným panelom vizualizácie údajov pre Elasticsearch. Kibana vám umožňuje skúmať údaje denníka Elasticsearch a vytvárať dashboardy a dotazy, aby ste získali prehľad o vašej aplikácii. Fluentd zhromažďuje, transformuje a odosiela údaje denníka do backendu Elasticsearch.

V tomto návode nainštalujeme zásobník EFK pomocou Docker na počítači Ubuntu 22.04 a po filtrovaní a transformácii pomocou Fluentd odošleme denníky kontajnerov do Kibana.

Predpoklady

    Server so systémom Ubuntu 22.04 s minimálne 6 GB RAM.

    Používateľ bez oprávnenia root s oprávneniami sudo.

    Nekomplikovaný firewall (UFW) je povolený a spustený.

    Plne kvalifikovaný názov domény (FQDN) smerujúci na server, napríklad kibana.example.com.

    Všetko je aktualizované.

    $ sudo apt update && sudo apt upgrade
    

Krok 1 - Nakonfigurujte bránu firewall

Pred inštaláciou akýchkoľvek balíkov je prvým krokom konfigurácia brány firewall tak, aby umožňovala pripojenia HTTP a HTTPS.

Skontrolujte stav brány firewall.

$ sudo ufw status

Mali by ste vidieť niečo ako nasledovné.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Povoliť porty HTTP a HTTPs.

$ sudo ufw allow http
$ sudo ufw allow https

Znova skontrolujte stav a potvrďte.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Krok 2 - Nainštalujte Docker a Docker Compose

Pridajte oficiálny kľúč GPG spoločnosti Docker.

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

Spustite nasledujúci príkaz a pridajte úložisko Docker.

$ 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

Aktualizujte systém tak, aby obsahoval úložisko Docker.

$ sudo apt update

Nainštalujte Docker a doplnok Docker compose.

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

Tento tutoriál bude používať doplnok Docker Compose v2 namiesto staršieho staršieho binárneho programu. Preto sa príkaz na jeho spustenie zmenil z docker-compose na docker compose, čo sa prejavuje aj tu.

Docker beží so zvýšenými oprávneniami, takže na spúšťanie príkazov budete musieť často používať sudo. Lepšou možnosťou je pridať svoj používateľský účet systému Linux do skupiny používateľov docker.

$ sudo usermod -aG docker ${USER}

Premenná $ {USER} vyberie aktuálne prihlásený systémový účet. Ak nie ste prihlásený ako používateľ, ktorému chcete udeliť oprávnenia, nahraďte $ {USER} používateľským menom.

Ak chcete požiadať o nové členstvo v skupine, odhláste sa zo servera a znova sa prihláste alebo použite nasledujúci príkaz. Budete vyzvaní na zadanie hesla používateľa.

$ su - ${USER}

Krok 3 - Vytvorte súbor Docker Compose File

Najprv vytvorte adresár pre projekt EFK.

$ mkdir ~/efk

Prepnite sa do adresára.

$ cd ~/efk

Vytvorte a otvorte súbor docker-compose.yml na úpravu.

$ nano docker-compose.yml

Vložte do nej nasledujúci kód.

services:
  # Deploy using the custom image automatically be created during the build process.
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links: # Sends incoming logs to the elasticsearch container.
      - elasticsearch
    depends_on:
      - elasticsearch
    ports: # Exposes the port 24224 on both TCP and UDP protocol for log aggregation
      - 24224:24224
      - 24224:24224/udp

  elasticsearch:
    image: elasticsearch:8.7.1
    expose:
      - 9200
    environment:
      - discovery.type=single-node # Runs as a single-node
      - xpack.security.enabled=false
    volumes: # Stores elasticsearch data locally on the esdata Docker volume
      - esdata:/usr/share/elasticsearch/data

  kibana:
    image: kibana:8.7.1
    links: # Links kibana service to the elasticsearch container
      - elasticsearch
    depends_on:
      - elasticsearch
    ports:
      - 5601:5601
    environment: # Defined host configuration
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

# Define the Docker volume named esdata for the Elasticsearch container.
volumes:
  esdata:

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y. Nastavili sme spustenie troch služieb, jednej pre každú, Fluentd, Elasticsearch a Kibana.

Pre Fluentd vytvoríme kontajner namiesto hotového obrázka. Súbory zostavy pre Fluentd sa nastavia v ďalšom kroku. Pripojili sme adresár pre jeho zostavovacie súbory a zväzok pre konfiguračné súbory a odkryli sme port 24224 na protokoloch TCP aj UDP na agregáciu protokolov.

Ďalšou službou je Elasticsearch a používame najnovšiu verziu dostupnú v čase písania tohto návodu. Sprístupnili sme ho cez port 9200 a nastavili sme niekoľko premenných prostredia, aby sme ho mohli spustiť ako klaster s jedným uzlom a deaktivovali sme bezpečnostné funkcie. Toto sa zvyčajne neodporúča, ale povolenie zabezpečenia je mimo rozsahu tohto návodu. Namontovali sme aj lokálny zväzok údajov Elasticsearch.

Nakoniec nakonfigurujeme Kibana a sprístupníme ho cez port 5601, ktorý sa použije na prístup k dashboardu. Nastavili sme tiež premennú na konfiguráciu hostiteľa Elasticsearch, aby k nemu mal prístup.

Krok 4 – Nastavte súbory Fluentd Build Files

Vytvorte Fluentd a konfiguračný adresár.

$ mkdir fluentd/conf -p

Spustite príkaz tree na overenie adresárovej štruktúry.

$ tree

Malo by to vyzerať nasledovne.

Prepnite sa do adresára Fluentd.

$ cd fluentd

Vytvorte a otvorte Dockerfile na úpravu.

$ nano Dockerfile

Vložte do nej nasledujúci kód. Tento kód stiahne obraz Fluentd Debian Docker a nainštaluje doplnok Fluentd pre 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

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Prepnite sa do konfiguračného adresára.

$ cd conf

Vytvorte a otvorte súbor fluentd.conf na úpravu.

$ nano fluentd.conf

Vložte do nej nasledujúci kód.

# bind fluentd on IP 0.0.0.0
# port 24224
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

# sendlog to the elasticsearch
# the host must match to the elasticsearch
# container service
<match *.**>
  @type copy
  <store>
    @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
  </store>
  <store>
    @type stdout
  </store>
</match>

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Vyššie uvedená smernica source používa doplnok forward, ktorý premieňa Fluentd na koncový bod TCP na prijímanie paketov TCP.

Direktíva match hľadá udalosti so zodpovedajúcimi značkami, čo v tomto prípade znamená, že zodpovedá všetkým udalostiam. Na ukladanie použijeme doplnok elasticsearch_dynamic, ktorý umožňuje dynamické zadávanie konfiguračných hodnôt. Pole hosts určuje názov hostiteľa pre aplikáciu Elasticsearch, čo je názov služby v súbore zostavy Docker. logstash_format je nastavený na hodnotu true, čo znamená, že Fluentd používa konvenčný formát názvu logstash-%Y.%m.%dlogstash-%Y.%m.%d. Názov predpony na zapisovanie udalostí je nastavený na plynulý. include_tag_key je nastavený na hodnotu true, čím sa pridá značka Fluentd vo formáte JSON. tag_key je názov poľa, ktoré sa má extrahovať pre značku. Nastavením premennej include_timestamp na hodnotu true pridá do denníka pole časovej pečiatky. flush_interval určuje interval medzi vyprázdneniami údajov. Na tlač udalostí/logov na štandardný výstup používame aj doplnok stdout.

Krok 5 - Spustite kontajnery Docker

Prepnite späť do adresára EFK.

$ cd ~/efk

Spustite kontajnery pomocou nasledujúceho príkazu.

$ docker compose up -d

Skontrolujte stav bežiacich kontajnerov.

$ docker ps
b3780c311154   efk-fluentd           "tini -- /bin/entryp…"   9 seconds ago   Up 8 seconds   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…"   9 seconds ago   Up 7 seconds   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                efk-kibana-1
dab3a0ab0312   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   9 seconds ago   Up 8 seconds   9200/tcp, 9300/tcp                                                                                       efk-elasticsearch-1

Môžete na to použiť aj nasledujúci príkaz.

$ docker compose ps
NAME                  IMAGE                 COMMAND                  SERVICE             CREATED             STATUS              PORTS
efk-elasticsearch-1   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   elasticsearch       37 seconds ago      Up 36 seconds       9200/tcp, 9300/tcp
efk-fluentd-1         efk-fluentd           "tini -- /bin/entryp…"   fluentd             37 seconds ago      Up 36 seconds       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              37 seconds ago      Up 36 seconds       0.0.0.0:5601->5601/tcp, :::5601->5601/tcp

Spustite nasledujúce príkazy na kontrolu denníkov procesu zostavovania EFK.

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

Skontrolujte nádobu Elasticsearch. Vytlačí podrobné nastavenia kontajnera.

$ docker inspect efk-elasticsearch-1

Môžete si všimnúť IP adresu pridelenú kontajneru.

[
    {
        "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
                }
            }
        }
    }
]

Ako vidíte, kontajner dostal ako IP adresu 172.23.0.2. Spustite nasledujúci príkaz a overte, či Elasticsearch funguje správne.

$ 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"
}

Krok 6 - Nakonfigurujte Kibana

Teraz, keď je zásobník EFK nasadený, je čas nakonfigurovať Kibana. V prehliadači otvorte adresu URL http://:5601.

Kliknutím na tlačidlo Preskúmať sám prejdite na informačný panel Kibana.

Kliknutím na odkaz Správa zásobníka nastavíte zobrazenie údajov Kibana. Výberom možnosti Kibana >> Zobrazenia údajov na ľavom bočnom paneli otvoríte stránku zobrazenia údajov.

Pokračujte kliknutím na tlačidlo Vytvoriť prehľad údajov.

Zadajte názov zobrazenia údajov a vzor indexu ako fluentd-*. Uistite sa, že pole Timestamp je nastavené na @timestamp. Zdrojové pole sa automaticky aktualizuje. Kliknutím na tlačidlo Uložiť prehľad údajov do Kibana dokončite vytváranie prehľadu údajov.

Potom kliknite na hornú ponuku (elipsa) a kliknutím na možnosť Objaviť zobrazte monitorovanie protokolov.

Zobrazí sa nasledujúca stránka potvrdzujúca, že vaše nastavenie funguje perfektne. Všetky protokoly sú prevzaté z Elasticsearch a odoslané agregáciou protokolov Fluentd.

Krok 7 - Nainštalujte Nginx

Ubuntu 22.04 sa dodáva so staršou verziou Nginx. Ak chcete nainštalovať najnovšiu verziu, musíte si stiahnuť oficiálne úložisko Nginx.

Importujte podpisový kľúč Nginx.

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

Pridajte úložisko pre stabilnú verziu Nginx.

$ 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

Aktualizujte systémové úložiská.

$ sudo apt update

Nainštalujte Nginx.

$ sudo apt install nginx

Overte inštaláciu.

$ nginx -v
nginx version: nginx/1.24.0

Spustite server Nginx.

$ sudo systemctl start nginx

Krok 8 - Nainštalujte SSL

Prvým krokom je inštalácia certifikátu Let's Encrypt SSL. Na vygenerovanie certifikátu SSL musíme nainštalovať Certbot. Certbot môžete nainštalovať pomocou úložiska Ubuntu alebo získať najnovšiu verziu pomocou nástroja Snapd. Budeme používať verziu Snapd.

Ubuntu 22.04 sa štandardne dodáva s nainštalovaným Snapd. Spustite nasledujúce príkazy, aby ste sa uistili, že vaša verzia Snapd je aktuálna.

$ sudo snap install core && sudo snap refresh core

Nainštalujte Certbot.

$ sudo snap install --classic certbot

Pomocou nasledujúceho príkazu zaistite spustenie príkazu Certbot vytvorením symbolického odkazu na adresár /usr/bin.

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

Vygenerujte certifikát SSL pre doménu kibana.example.com.

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

Vyššie uvedený príkaz stiahne certifikát do adresára /etc/letsencrypt/live/kibana.example.com na vašom serveri.

Vygenerujte certifikát Diffie-Hellman group.

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

Skontrolujte službu plánovača obnovy Certbot.

$ sudo systemctl list-timers

Ako jednu zo služieb naplánovaných na spustenie nájdete snap.certbot.renew.service.

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

Vykonajte suchý chod procesu a skontrolujte, či obnovenie SSL funguje správne.

$ sudo certbot renew --dry-run

Ak nevidíte žiadne chyby, všetko je nastavené. Váš certifikát sa automaticky obnoví.

Krok 9 - Nakonfigurujte Nginx

Vytvorte a otvorte konfiguračný súbor Nginx pre Kibana.

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

Vložte do nej nasledujúci kód. Nahraďte IP adresu súkromnou IP adresou vášho servera Elasticsearch.

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;
        }
}

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Otvorte súbor /etc/nginx/nginx.conf na úpravu.

$ sudo nano /etc/nginx/nginx.conf

Pridajte nasledujúci riadok pred riadok include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Overte konfiguráciu.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reštartujte službu Nginx.

$ sudo systemctl restart nginx

Je potrebný ešte jeden krok. Otvorte súbor Docker Compose na úpravu.

$ nano ~/docker-compose.yml

Prilepte riadok SERVER_PUBLICBASEURL=https://kibana.example.com do sekcie prostredia pod službou Kibana nasledovne.

    environment: # Defined host configuration
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - SERVER_PUBLICBASEURL=https://kibana.example.com

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Zastavte a vyberte nádoby.

$ docker compose down --remove-orphans

Spustite kontajnery znova s aktualizovanou konfiguráciou.

$ docker compose up -d

Váš informačný panel Kibana by mal byť dostupný prostredníctvom adresy URL https://kibana.example.com odkiaľkoľvek.

Krok 10 – Spustenie kontajnera Docker s ovládačom Fluentd Log Driver

Teraz spustíme kontajner Docker s jednotkou denníkov Fluentd, ktorá automaticky odosiela denníky do zásobníka. Budeme testovať pomocou kontajnera Nginx.

Vytiahnite obrázok Nginx z registra Docker Hub. Používame alpskú verziu, pretože je to najmenšia verzia obrázka.

$ docker pull nginx:alpine

Spustite nasledujúci príkaz na vytvorenie a spustenie kontajnera Nginx. Nastavili sme ovládač protokolu na Fluentd a port ako 8080, pretože predvolený port 80 už používa server Nginx v režime proxy.

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

Skontrolujte stav kontajnera.

$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                    NAMES
038c43e4e1a3   nginx:alpine          "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp                                                                    nginx-fluentd-test
a94ca706bd0c   efk-fluentd           "tini -- /bin/entryp…"   8 hours ago      Up 8 hours      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…"   8 hours ago      Up 8 hours      0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                efk-kibana-1
7c7ad8f9b123   elasticsearch:8.7.1   "/bin/tini -- /usr/l…"   8 hours ago      Up 8 hours      9200/tcp, 9300/tcp                                                                                       efk-elasticsearch-1

Ak chcete získať prístup k kontajneru Nginx a vygenerovať denníky prístupu, spustite nasledujúci príkaz.

$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Prípadne môžete otvoriť adresu URL http://:8080 vo svojom prehliadači a dostanete nasledujúcu stránku.

Otvorte informačný panel Kibana a kliknite na odkaz Objaviť v ponuke ľavého bočného panela. Kliknutím na znamienko + v hornej ponuke zobrazíte kontextové okno Pridať filter.

Z rozbaľovacej ponuky vyberte pole container_name, ako operátor is a ako hodnotu poľa vyplňte názov kontajnera ( nginx-fluentd-test). .

Kliknutím na tlačidlo Pridať filter zobrazíte údaje z kontajnera Nginx.

Záver

Toto uzatvára náš návod na inštaláciu zásobníka protokolovania Elasticsearch, Fluentd a Kibana (EFK) na počítači Ubuntu 22.04. Ak máte nejaké otázky, napíšte ich do komentárov nižšie.