Monitorování a analýza protokolů se v dnešní době staly kritickými, ať už pro aplikace nebo infrastrukturu serverů/kontejnerů. Jeden z nejoblíbenějších softwarových balíků pro analýzu a monitorování protokolů, který si můžete vybrat, je Elasticsearch, Fluentd a Kibana (EFK stack).
EFK stack je distribuovaný a škálovatelný vyhledávač, který umožňuje strukturované vyhledávání a analýzy. A v tomto tutoriálu se dozvíte, jak nastavit monitorování protokolů zásobníku EFK pomocí Dockeru a centralizovat protokoly kontejnerů do zásobníku EFK.
připraveni? Čtěte dále a usnadněte si analýzu protokolů!
Předpoklady
Tento tutoriál obsahuje praktické ukázky. Chcete-li pokračovat, ujistěte se, že máte následující:
- Linuxový hostitel – Tento příklad používá server Debian 11 Bullseye s kapacitou paměti 6 GB.
- Docker CE (Community Edition) a Docker Compose nainstalované na vašem hostiteli Linux.
Nastavení projektu EFK Stack
EFK Stack je rámec pro agregaci protokolů a analýzu protokolů připravený pro podniky pro infrastrukturu holého kovu a kontejnerů. Před nasazením zásobníku EFK však nejprve nastavíte adresář projektu a vytvoříte konfiguraci Dockeru pro nasazení zásobníku EFK na hostiteli Dockeru.
V tomto příkladu použijete obrázky Docker s následujícími specifikacemi:
- Elasticsearch 7.17.0 – Schopnost ukládat data pomocí rychlého vyhledávání založeného na Apache Lucene
- Kibana 7.17.0 – agregace a kolektor dat s otevřeným zdrojovým kódem, který podporuje data JSON, a
- Fluentd Custom image založený na v1.14.1 – software pro vizualizaci dat pro Elasticsearch.
Postup nastavení projektu zásobníku EFK:
1. Otevřete terminál a přihlaste se ke svému serveru.
2. Spusťte níže uvedené příkazy a ověřte, zda jsou ve vašem systému nainstalovány Docker i Docker Compose.
# Checking Docker version
docker --version
# Checking docker-compose version
docker-compose version
Jak vidíte níže, nainstalované verze Docker CE (Community Edition) v20.10.12 a Docker Compose v1.29.2.
3. Spuštěním následujícího příkazu vytvořte nový adresář projektu (mkdir
) a nastavte jej jako pracovní adresář (cd
).
Adresář můžete pojmenovat, jak chcete, ale v tomto tutoriálu se adresář jmenuje efk. Tento adresář bude obsahovat všechny konfigurační soubory EFK Stack v tomto tutoriálu.
mkdir -p ~/efk; cd ~/efk
4. Nyní vytvořte nový konfigurační soubor (docker-compose.yml
) pomocí preferovaného editoru a vyplňte následující konfigurace.
Níže uvedená konfigurace používá skript Docker Compose v3 a definuje všechny zásobníky EFK.
version: "3"
# Define the Docker volume named esdata for the Elasticsearch container.
volumes:
esdata:
# Deploying three container services (fluentd, elasticsearch, and kibana)
services:
# Deploy using the custom image automatically be created during the build process.
fluentd:
build: ./fluentd
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
# Created using the Docker image elasticsearch:7.17.0
elasticsearch:
image: elasticsearch:7.17.0
expose: # Exposes the default port 9200
- 9200
environment:
- discovery.type=single-node # Runs as a single-node
volumes: # Stores elasticsearch data locally on the esdata Docker volume
- esdata:/usr/share/elasticsearch/data
# Created using the Docker image kibana:7.17.0
kibana:
image: kibana:7.17.0
links: # Links kibana service to the elasticsearch container
- elasticsearch
depends_on:
- elasticsearch
ports: # Runs kibana service on default port 5601
- 5601:5601
environment: # Defined host configuration
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
5. Spuštěním níže uvedeného příkazu vytvořte nový adresář fluentd
a přejděte do tohoto adresáře. fluentd
adresář bude ukládat fluentd
konfigurace služeb.
mkdir -p fluentd/; cd fluentd/
6. Uvnitř ~/efk/fluentd adresář, vytvořte nový Dockerfile pomocí preferovaného editoru a vyplňte následující konfiguraci.
Tato konfigurace vytvoří plynulý vlastní obrázek obsahující ovladač klienta elasticsearch a fluentd-plugin-elasticsearch.
Ujistěte se, že používáte stejnou verzi mezi elasticsearch a elasticsearch klientským ovladačem — tento tutoriál používá verzi 7.17.0.
# image based on fluentd v1.14-1
FROM fluentd:v1.14-1
# Use root account to use apk
USER root
# below RUN includes plugin as examples elasticsearch is not required# you may customize including plugins as you wish
RUN apk add --no-cache --update --virtual .build-deps \
sudo build-base ruby-dev \
&& gem uninstall -I elasticsearch \
&& gem install elasticsearch -v 7.17.0 \
&& sudo gem install fluent-plugin-elasticsearch \
&& sudo gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem
# copy fluentd configuration from host image
COPY ./conf/fluent.conf /fluentd/etc/
# copy binary start file
COPY entrypoint.sh /bin/
RUN chmod +x /bin/entrypoint.sh
USER fluent
7. Dále vytvořte další konfigurační soubor (entrypoint.sh
) pomocí preferovaného editoru a vyplňte následující konfiguraci. Tento skript se spustí, když fluentd
kontejnerová služba začíná.
Níže je spouštěcí skript pro kontejnerovou službu fluentd, která spouští základní příkaz fluentd –config /fluentd/etc/fluentd.conf –plugin /etc/fluentd/plugins.
#!/bin/sh
#source vars if file exists
DEFAULT=/etc/default/fluentd
if [ -r $DEFAULT ]; then
set -o allexport
. $DEFAULT
set +o allexport
fi
# If the user has supplied only arguments append them to `fluentd` commandif [ "${1#-}" != "$1" ]; then
set -- fluentd "[email protected]"
fi
# If user does not supply config file or plugins, use the defaultif [ "$1" = "fluentd" ]; then
if ! echo [email protected] | grep -e ' \-c' -e ' \-\-config' ; then
set -- "[email protected]" --config /fluentd/etc/${FLUENTD_CONF}
fi
if ! echo [email protected] | grep -e ' \-p' -e ' \-\-plugin' ; then
set -- "[email protected]" --plugin /fluentd/plugins
fi
fi
8. Spuštěním níže uvedeného příkazu vytvořte nový adresář conf
pod ~/efk/fluentd adresář.
mkdir -p conf
9. Nyní vytvořte plynulou konfiguraci (conf/fluentd.conf ) pomocí preferovaného editoru a vyplňte následující konfiguraci.
Tato konfigurace umožňuje plynulé kontejnerové službě přijímat zprávy protokolu a předávat je kontejnerové službě elasticsearch.
# 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
host elasticsearch
port 9200
logstash_format true
logstash_prefix fluentd
logstash_dateformat %Y%m%d
include_tag_key true
type_name access_log
tag_key @log_name
flush_interval 300s
</store>
<store>
@type stdout
</store>
</match>
10. Nakonec spusťte níže uvedené příkazy a zkontrolujte strukturu adresáře projektu EFK Stack.
Pokud nemáte příkaz tree, nainstalujte jej pomocí následujícího příkazu:apt install tree -y
# Checking list of files and directory
ls
# Checking directory structure
tree
Níže je kompletní struktura adresáře projektu EFK Stack.
Nasazení zásobníku EFK pomocí Dockeru
Nyní jste vytvořili všechny konfigurační soubory pro nasazení EFK Stack pomocí Docker a Docker Compose. Dalším krokem je nasazení EFK Stack pomocí docker-compose
příkaz a nasazení proběhne ve vašem projektovém adresáři (~/efk ).
1. Nejprve spusťte níže uvedený příkaz a změňte pracovní adresář na efk
adresář projektu.
cd ~/efk/
2. Dále spusťte docker-compose
příkaz níže k nasazení (up
) systém analýzy a monitorování protokolů EFK Stack.
Tento příkaz automaticky stáhne obrazy Docker Elasticsearch a Kibana. A obraz Fluentd Docker se automaticky vytvoří pomocí Dockerfile v plynulém adresář.
Nasazení může nějakou dobu trvat v závislosti na specifikacích hostitele Docker.
docker-compose up -d
Níže je snímek obrazovky procesu sestavení obrázku Fluentd Docker.
A níže je snímek obrazovky, který ukazuje, že nasazení je dokončeno a služba kontejneru Kibana je spuštěna.
3. Spusťte každý níže uvedený příkaz a zkontrolujte protokoly procesu sestavení zásobníku EFK. Vždy spusťte tyto příkazy, kdykoli se v procesu nasazení objeví chyba.
# Checking logs for service fluentd
docker-compose logs fluentd
# Checking logs for service kibana
docker-compose logs kibana
Níže je zpráva protokolu, když je spuštěna služba plynulého kontejneru.
A níže je protokol pro kontejner kibany.
4. Nyní spusťte níže uvedený příkaz a zkontrolujte stav všech kontejnerových služeb (ps
).
docker-compose ps
Jak vidíte níže, kontejnerová služba EFK Stack je Up. Poznamenejte si název kontejneru elasticsearch (efk_elasticsearch_1), abyste v dalším kroku ověřili, že kontejner správně běží.
5. Dále spusťte níže uvedený příkaz a ověřte službu kontejneru elasticsearch. Tento příkaz vytiskne podrobné nastavení efk_elasticsearch_1
kontejner.
docker inspect efk_elasticsearch_1
Jak můžete vidět níže, kontejner efk_elasticsearch_1 získá IP adresu 172.18.0.2.
6. Nakonec spusťte níže uvedený příkaz pro přístup a ověření kontejneru elasticsearch podle IP adresy (172.18.0.2
). Port 9200
je výchozí port pro kontejner elasticsearch.
curl 172.18.0.2:9200
Pokud na vašem počítači běží kontejner elasticsearch, uvidíte výstup podobný tomu níže.
Konfigurace vzoru indexu Kibana
Nyní, když jste dokončili nasazení EFK Stack v prostředí Docker, otevřete Kibana z vašeho webového prohlížeče. Nastavíte vzor indexu pro monitorování a analýzu protokolů.
1. Otevřete svůj oblíbený webový prohlížeč a přejděte na IP adresu serveru následovanou servisním portem Kibana 5601 (tj. http://172.16.1.10:5601).
2. Dále klikněte na Prozkoumat sám tlačítko na uvítací stránce níže.
3. Klikněte na Správa zásobníku možnost nastavení vzoru indexu Kibana v sekci Správa.
4. Na Kibaně v levé části nabídky klikněte na nabídku Vzory indexu a klikněte na Vytvořit vzor indexu tlačítko pro vytvoření nového vzoru indexu.
5. Nyní zadejte vzor indexu Název jako plynule- *, nastavte pole Časové razítko na adresu @timestamp a klikněte na Vytvořit vzor indexu tlačítko pro potvrzení nastavení indexového vzoru.
Na pravé straně můžete vidět dostupné vzory indexů od plynule, jako je plynule-%Y%m%d. Formát data %Y%m%d je založen na plynulé konfiguraci (fluentd.conf ).
6. Nakonec klikněte na nabídku vlevo nahoře (elipsa) a poté klikněte na tlačítko Objevit menu pro zobrazení sledování protokolů.
Níže je snímek obrazovky řídicího panelu monitorování a analýzy protokolů Kibana. Všechny uvedené protokoly jsou převzaty z Elasticsearch a odeslány agregací protokolů Fluentd.
Spuštění kontejneru Docker s ovladačem Fluentd Log Driver
Po konfiguraci vzoru indexu Kibana spustíte kontejner Docker s jednotkou protokolů Fluentd, která automaticky odešle protokoly do zásobníku EFK.
1. Spusťte níže uvedený příkaz ke stažení obrazu NGINX. alpine
verze je menší než normální obrázky založené na Ubuntu, CentOS nebo Fedoře.
docker pull nginx:alpine
2. Dále spusťte níže uvedený příkaz a spusťte nový kontejner NGINX (nginx_container
) v odděleném režimu (-d
).
Příkaz také nastaví jednotku protokolu na Fluentd (–log-driver=fluentd) a zpřístupní port 8080 na hostitelském počítači Docker pro kontejner (nginx_container).
docker run --name nginx_container -d --log-driver=fluentd -p 8080:80 nginx:alpine
3. Po spuštění kontejneru spusťte docker
příkaz níže pro kontrolu všech běžících kontejnerů.
docker ps
Měli byste vidět, že nginx_container je v provozu a běží na hostitelském portu 8080.
4. Nyní spusťte níže uvedený příkaz pro přístup k nginx_container
a generovat přístupové protokoly.
curl localhost:8080
Případně otevřete novou kartu ve webovém prohlížeči a zadejte IP adresu serveru následovanou portem 8080 (tj. http://172.168.1.10:8080).
Pokud vše půjde dobře, uvidíte výchozí index.html stránku z nginx_container.
5. Nakonec se přepněte zpět na řídicí panel Kibana a klikněte na tlačítko Objevit menu na levé straně.
Klikněte na dotaz container_name :nginx_container v poli KQL (Kibana Query Language) a uvidíte protokoly z nginx_container, jak je znázorněno níže.
Závěr
V tomto kurzu pro monitorování a analýzu protokolů pomocí Dockeru jste se naučili, jak nasadit EFK Stack (Elasticsearch, Fluentd a Kibana). Také jste se naučili, jak nastavit protokolování pro kontejner Docker pomocí ovladače protokolu Fluentd. A v tomto okamžiku máte nyní plně funkční monitorování protokolů pro aplikace a služby.
V další fázi by vás mohlo zajímat použití KQL (Kibana Query Language) k vizualizaci monitorování a analýzy protokolů.