Kā vienkāršot Docker konteinera žurnāla analīzi ar Elastic Stack

Mežizstrāde ir būtiska sastāvdaļa jebkurā lietojumprogrammā. Žurnāli ļauj analizēt un ieskatīties maksimumu tajā, kas notiek jūsu lietojumprogrammas kodā, piemēram, stāsts. Programmatūras izstrādātāji lielu daļu ikdienas pavada lietojumprogrammu uzraudzībā, problēmu novēršanā un atkļūdošanā, kas dažkārt var būt murgs. Mežizstrāde ļauj programmatūras izstrādātājiem padarīt šo drudžaino procesu daudz vieglāku un vienmērīgāku.

Ja esat lietojumprogrammu konteineros ievietojis ar konteineru platformu, piemēram, Docker, iespējams, esat iepazinies ar dokeru žurnāliemkas ļauj jums redzēt jūsu lietojumprogrammā izveidotos žurnālus, kas darbojas jūsu dokstacijas konteinerā. Kāpēc tad domāt par Elastic Stack, lai analizētu savus žurnālus? Nu, šeit galvenokārt ir divas dedzinošas problēmas:

  • Iedomājieties, ka jums ir desmitiem, simtiem vai pat tūkstošiem konteineru, kas ģenerē žurnālus - SSH ievadīšana visos šajos serveros un žurnālu iegūšana nedarbosies labi.
  • Arī konteineri ir nemainīgi un īslaicīgi, kas nozīmē, ka to mūžs ir īsāks. Tātad, kad jūsu konteineri vairs nebūs un tiks aizstāti ar jauniem konteineriem, visi jūsu lietojumprogrammu žurnāli, kas saistīti ar vecajiem konteineriem, vairs nebūs pieejami.

Tāpēc galīgais risinājums tam ir izveidot centralizētu mežizstrādes komponentu visu konteineru žurnālu savākšanai vienā vietā. Šeit ienāk Elastic Stacks.

Elastīgā kaudze galvenokārt sastāv no četrām galvenajām sastāvdaļām:

  • Beats ir jaunais dalībnieks, kurš ELK skursteni padarīja pazīstamu kā Elastic Stack. Beats ir viegla žurnāla datu nosūtītāja, kas var nosūtīt žurnālus uz ELK kaudzi. Šajā ziņojumā es izmantošu Beats ģimenes locekli Filebeats, kas piedāvā vieglu veidu, kā apkopot, pārsūtīt un centralizēt žurnālus un failus.
  • Logstash ir komponents, kas apkopo, pārveido un pārsūta žurnālus no vairākām ievades vietām uz Elasticsearch.
  • Elasticsearch irizplatīts, uz JSON balstīts meklēšanas un analīzes dzinējs, kas datus (šajā gadījumā žurnāla ierakstus) glabā un indeksē mērogojami un pārvaldāmi.
  • Kibana ir bagātināts lietotāja interfeiss, lai analizētu un viegli piekļūtu datiem Elasticsearch.

Šajā amatā mēs izpētīsim, kā izmantot iepriekš minētos komponentus un ieviest centralizētu žurnālu analizatoru, lai savāktu un iegūtu žurnālus no Docker konteineriem.

Šī raksta vajadzībām esmu izmantojis divas t2.small AWS EC2 instances, kurās darbojas Ubuntu 18.04, kas instalēta kopā ar Docker un Docker compose. 1. instancē darbojas runča tīmekļa lietotne, un 2. instancē darbojas ELK kaudze (Elasticsearch, Logstash, Kibana).

Linux pēc noklusējuma docker žurnālus var atrast šajā atrašanās vietā:

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

Visi dokotāju žurnāli tiks apkopoti, izmantojot Filebeat, kas darbojas kā resursdatora resursdators. Filebeat tiks instalēts katrā docker resursdatorā (tam izmantosim pielāgotu Filebeat docker failu un systemd vienību, kas tiks paskaidrota sadaļā Filebeat konfigurēšana).

Mūsu runča tīmekļa lietotne ierakstīs žurnālus iepriekš minētajā vietā, izmantojot noklusējuma dokera reģistrēšanas draiveri. Pēc tam Filebeat no šīs vietas iegūs žurnālus un virzīs tos uz Logstash pusi.

Vēl viena svarīga lieta, kas jāņem vērā, ir tāda, ka mums, izņemot lietojumprogrammu ģenerētos žurnālus, ir nepieciešami arī metadati, kas saistīti ar konteineriem, piemēram, konteinera nosaukums, attēls, tagi, resursdators utt. Tas ļaus mums precīzi noteikt precīzu resursdatoru un konteineru, ko žurnāli ģenerē . Šos datus Filebeat var viegli nosūtīt kopā ar lietojumprogrammu žurnāla ierakstiem.

Veicot šāda veida ieviešanu, skrejošajiem konteineriem nav jāuztraucas par mežizstrādes draiveri, par to, kā tiek apkopoti un virzīti žurnāli. Par tiem rūpēsies Filebeat. To bieži sauc par vienas atbildības principu.

Filebeat konfigurēšana

Šajā sadaļā filebeat.yml un Dockerfile tika iegūti no Bruno COSTE parauga-filebeat-docker-logging github repo. Liels paldies viņa lieliskajam darbam. Bet, tā kā es esmu veicis vairākas izmaiņas failā faila beat.yml atbilstoši šī raksta prasībām, es savā repo esmu atsevišķi viesojis tos, kuriem ir filebeat.service (systemd fails). Repo varat piekļūt šeit.

Sākotnēji jums jāatjaunina fails filebeat.yml, kas satur Filebeat konfigurācijas. Tālāk ir redzams faila faila beat.yml paraugs, kuru varat izmantot. Ievērojiet 21. rindiņu, lauku output.logstash un resursdatoru lauku. Es to konfigurēju tā servera IP adresei, kurā palaidu savu ELK kaudzīti, taču to var modificēt, ja Logstash izmantojat atsevišķā serverī. Pēc noklusējuma Logstash klausās Filebeat portā 5044.

Lai uzzinātu vairāk par Filebeat Docker konfigurācijas parametriem, skatieties šeit.

Pēc tam jūs varat izveidot savu Filebeat Docker attēlu, izmantojot šo Dockerfile.

Kad attēls ir izveidots, varat to ievietot savā dokstacijas repozitorijā. Tā kā jums ir iespēja palaist Filebeat kā dokstacijas konteineru, tas ir tikai Filebeat konteinera palaišana jūsu resursdatora instancēs, kurās darbojas konteineri. Šeit ir docker palaist komandu.

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

Iepriekš minētajā Docker komandā ņemiet vērā divus saistīšanas pievienošanas parametrus: / var / lib / docker / container ir ceļš, kurā resursdatora mašīnā pastāv docker žurnāli, un tas ir saistīts ar / usr / share / dockerlogs / datu ceļu Filebeat konteiners ar piekļuvi tikai lasīšanai. Otrajā saistīšanas argumentā /var/run/docker.sock ir saistīts ar Filebeat konteinera Docker dēmonu. Tā ir unix ligzda, kuru pēc noklusējuma Docker dēmons klausās, un to var izmantot, lai sazinātos ar dēmonu no konteinera. Tas ļauj mūsu Filebeat konteineram iegūt Docker metadatus un bagātināt konteinera žurnāla ierakstus kopā ar metadatiem un virzīt tos uz ELK kaudzīti.

Ja vēlaties automatizēt šo procesu, es esmu uzrakstījis failu Systemd Unit, lai pārvaldītu Filebeat kā pakalpojumu.

ELK kaudzes konfigurēšana

Šim nolūkam es izmantoju savu otro EC2 gadījumu, kur es palaidu ELK kaudzi. To var izdarīt, vienkārši instalējot Docker compose un pārbaudot šo lielisko deviantony / docker-aļņu repo un vienkārši palaidot docker-compose up

Ņemiet vērā, ka visi jūsu ugunsmūra noteikumi atļauj ienākošo datplūsmu Logstash, Elasticsearch un Kibana.

Pirms ELK kaudzes palaišanas jums jāpārliecinās, vai jūsu fails logstash.conf ir pareizi konfigurēts, lai klausītos ienākošos ritmu žurnālus 5044. portā, un žurnāli tiek pareizi pievienoti elasticsearch resursdatorā. Jums arī jāpārliecinās, vai jūsu Elasticsearch ir pievienots indeksa parametrs, lai unikāli identificētu Filbeat ģenerētos žurnālus.

In your docker-elk repo you can find your logstash.conf file by following docker-elk/logstash/pipeline pathname. This is the configuration file for setting up Logstash configurations. You need to update it as follows:

Once you do it, you can access your Kibana dashboard on port 5601 by default as defined on the docker-compose.yml file on deviantony/docker-elk repo.

Under the management tab, you can create an index pattern for Filebeat logs. This has to be done before you can view the logs on Kibana dashboard.

If your containers are pushing logs properly into Elasticsearch via Logstash, and you have successfully created the index pattern, you can go to the Discover tab on the Kibana dashboard and view your Docker container application logs along with Docker metadata under the filebeat* index pattern.

References

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