Ako nainštalovať zásobník protokolovania Elasticsearch, Fluentd a Kibana (EFK) na Ubuntu 22.04
Na tejto stránke
- Predpoklady
- Krok 1 - Nakonfigurujte bránu firewall
- Krok 2 - Nainštalujte Docker a Docker Compose
- Krok 3 - Vytvorte súbor Docker Compose File
- Krok 4 – Nastavte súbory Fluentd Build Files
- Krok 5 - Spustite kontajnery Docker
- Krok 6 - Nakonfigurujte Kibana
- Krok 7 - Nainštalujte Nginx
- Krok 8 - Nainštalujte SSL
- Krok 9 - Nakonfigurujte Nginx
- Krok 10 – Spustenie kontajnera Docker s ovládačom Fluentd Log Driver
- 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://
.
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://
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.