Sådan forenkles Docker-containerloganalyse med Elastic Stack

Logning er en væsentlig komponent i enhver applikation. Logfiler giver dig mulighed for at analysere og snige sig ind i, hvad der sker inden for din applikationskode som en historie. Softwareudviklere bruger en stor del af deres daglige liv med at overvåge, fejlfinde og debugge applikationer, hvilket nogle gange kan være et mareridt. Logning giver softwareudviklere mulighed for at gøre denne hektiske proces meget nemmere og glattere.

Hvis du har containeriseret din applikation med en containerplatform som Docker, er du muligvis bekendt med docker-logfilersom giver dig mulighed for at se de logfiler, der er oprettet i din applikation, der kører inde i din dockercontainer. Hvorfor tænke på Elastic Stack for at analysere dine logfiler? Der er hovedsagelig to brændende problemer her:

  • Forestil dig, at du har ti, hundreder eller endda tusinder af containere, der genererer logfiler - SSH-ind på alle disse servere, og udpakning af logfiler fungerer ikke godt.
  • Også containere er uforanderlige og kortvarige, hvilket betyder, at de har en kortere levetid. Så når dine containere er væk og erstattet med nye containere, er alle dine applikationslogfiler relateret til gamle containere væk.

Så den ultimative løsning til dette er at oprette en central logningskomponent til at samle alle dine containerlogfiler på et enkelt sted. Det er her Elastic Stacks kommer ind.

Elastic Stack består hovedsageligt af fire hovedkomponenter:

  • Beats er det nye medlem, der gjorde ELK Stack kendt som Elastic Stack. Beats er lette afsendere af logdata, som kan skubbe logfiler til ELK Stack. Til dette indlæg bruger jeg Filebeats, et medlem af Beats-familien, der tilbyder en let måde at indsamle og videresende og centralisere logfiler og filer.
  • Logstash er en komponent, der samler, ændrer og overfører logfiler fra flere inputplaceringer til Elasticsearch .
  • Elasticsearch eren distribueret, JSON-baseret søge- og analysemaskine, der gemmer og indekserer data (logposter i dette tilfælde) på en skalerbar og håndterbar måde.
  • Kibana er en beriget brugergrænseflade til at analysere og let få adgang til data i Elasticsearch.

I dette indlæg vil vi se på, hvordan man bruger de ovennævnte komponenter og implementerer en central loganalysator til at indsamle og udtrække logfiler fra Docker-containere.

I forbindelse med denne artikel har jeg brugt to t2.small AWS EC2-forekomster, der kører Ubuntu 18.04 installeret med Docker og Docker compose. Instans 1 kører en tomcat-webapp, og instansen 2 kører ELK-stakken (Elasticsearch, Logstash, Kibana).

I Linux findes der som standard docker-logfiler på denne placering:

/ var / lib / docker / containere // gt; -json.log

Alle docker-logfiler indsamles via Filebeat, der kører inde i værtsmaskinen som en container. Filebeat installeres på hver docker-værtsmaskine (vi bruger en brugerdefineret Filebeat docker-fil og systemd enhed til dette, som forklares i afsnittet Konfiguration af Filebeat.)

Vores tomcat webapp skriver logfiler til ovennævnte placering ved hjælp af standarddockerlogdriveren. Filebeat udtrækker derefter logfiler fra denne placering og skubber dem mod Logstash.

En anden vigtig ting at bemærke er, at vi bortset fra applikationsgenererede logfiler også har brug for metadata, der er knyttet til containerne, såsom containernavn, billede, tags, vært osv ... Dette giver os mulighed for specifikt at identificere den nøjagtige vært og container, som loggene genererer . Disse data kan også nemt sendes af Filebeat sammen med posterne i applikationsloggen.

Ved at udføre denne form for implementering behøver de kørende containere ikke at bekymre sig om loggningsdriveren, hvordan logfiler indsamles og skubbes. Filebeat tager sig af dem. Dette er ofte kendt som princip om et enkelt ansvar.

Konfiguration af Filebeat

Til dette afsnit blev filebeat.yml og Dockerfile opnået fra Bruno COSTEs prøve-filbeat-docker-logging github repo. Mange tak til hans fantastiske arbejde. Men da jeg har foretaget flere ændringer i filebeat.yml i henhold til kravene i denne artikel, har jeg været vært for dem med filebeat.service (systemd-fil) separat på min egen repo. Du kan få adgang til repoen her.

Som det første trin skal du opdatere din filebeat.yml-fil, der indeholder Filebeat-konfigurationerne. Nedenfor er en prøve filebeat.yml-fil, du kan bruge. Bemærk linien 21, feltet output.logstash og værtsfeltet. Jeg har konfigureret det til IP-adressen på serveren, jeg kører min ELK-stak, men du kan ændre den, hvis du kører Logstash på en separat server. Som standard lytter Logstash til Filebeat i port 5044.

For at få mere at vide om Filebeat Docker-konfigurationsparametre, se her.

Derefter kan du oprette dit eget Filebeat Docker-billede ved hjælp af følgende Dockerfile.

Når billedet er bygget, kan du skubbe det ind i dit docker-lager. Nu da du har evnen til at køre Filebeat som en dockercontainer, er det bare et spørgsmål om at køre Filebeat-containeren på dine værtsinstanser, der kører containere. Her er docker-run-kommandoen.

docker run -v '/var/lib/docker/containers:/usr/share/dockerlogs/data:ro' -v '/var/run/docker.sock:/var/run/docker.sock' --name filebeat ${YOUR_FILEBEAT_DOCKER_IMAGE}:latest

I ovenstående Docker-kommando skal du bemærke de to bindingsmonteringsparametre: / var / lib / docker / containere er den sti, hvor docker-logfiler findes i værtsmaskinen, og den er bundet til / usr / share / dockerlogs / datasti i Filebeat container med skrivebeskyttet adgang. I det andet bindemonteringsargument er /var/run/docker.sock bundet til Filebeat-containerens Docker-dæmon. Det er unix-stikket, som Docker-dæmonen lytter til som standard, og den kan bruges til at kommunikere med dæmonen fra en container. Dette gør det muligt for vores Filebeat-container at hente Docker-metadata og berige containerlogposter sammen med metadataene og skubbe den til ELK-stakken.

Hvis du vil automatisere denne proces, har jeg skrevet en Systemd Unit-fil til styring af Filebeat som en tjeneste.

Konfiguration af ELK Stack

Til dette bruger jeg min anden EC2-forekomst, hvor jeg kører ELK-stakken. Du kan gøre dette ved blot at installere Docker compose og tjekke denne fantastiske deviantony / docker-elk repo og bare køre docker-compose op -d

Bemærk, at alle dine firewallregler tillader indgående trafik til Logstash, Elasticsearch og Kibana.

Inden du kører ELK-stakken, skal du sørge for, at din logstash.conf-fil er korrekt konfigureret til at lytte til indkommende beats-logfiler på port 5044, og at logfilerne tilføjes korrekt til elasticsearch-værten. Du skal også sørge for at tilføje et indeksparameter til din Elasticsearch for at identificere de logfiler, der genereres af Filbeat entydigt.

I din docker-elk repo kan du finde din logstash.conf-fil ved at følge docker-elk / logstash / pipeline pathname. Dette er konfigurationsfilen til opsætning af Logstash-konfigurationer. Du skal opdatere det som følger:

Når du har gjort det, kan du som standard få adgang til dit Kibana-dashboard på port 5601 som defineret i docker-compose.yml-filen på deviantony / docker-elk repo.

Under ledelsesfanen kan du oprette et indeksmønster til Filebeat-logfiler. Dette skal gøres, før du kan se logfilerne på Kibana-dashboardet.

Hvis dine containere skubber logfiler korrekt ind i Elasticsearch via Logstash, og du har oprettet indeksmønsteret, kan du gå til fanen Opdag på Kibana-instrumentbrættet og se dine Docker-containerapplikationslogfiler sammen med Docker-metadata under filebeat * -indeksmønsteret.

Referencer

  1. //www.elastic.co/guide/da/beats/filebeat/current/filebeat-getting-started.html
  2. //medium.com/@bcoste/powerful-logging-with-docker-filebeat-and-elasticsearch-8ad021aecd87
  3. //www.elastic.co/guide/da/logstash/current/configuration.html
  4. //medium.com/lucjuggery/about-var-run-docker-sock-3bfd276e12fd