Alustame logimise pÔhitÔdedest Dockeris ja Kubernetesis ning seejÀrel vaatame kahte tööriista, mida saab usaldusvÀÀrselt kasutada tootmisosas: Grafana Loki ja EFK (Elasticsearch + Fluent Bit + Kibana) virna.
Artikli materjal on vĂ€ljavĂ”te . Kui on soov ja eriti tootmisvajadus, on vĂ”imalik lĂ€bida pĂ”hjalik koolitus â registreeruge kursusele .

Logimine Dockeris
Kubernetesi tasandil kÀivitatakse rakendused podides, kuid madalamal tasandil töötavad nad siiski tavaliselt Dockeris. SeetÔttu peab logimise seadistama nii, et koguda logisid konteineritest. Kuna konteinerid kÀivitab Docker, tuleb mÔista, kuidas logimine toimub Dockeris.
Loodan, et iga lugeja teab: rakenduse logid tuleb kirjutada stdout/stderr'i, mitte konteineri sisse. Logisid kogub Docker Daemon, ja see töötab just nende logidega, mis saadetakse stdout/stderr'i. Lisaks toob logide salvestamine konteineri sisse kaasa probleeme: konteiner paisub kasvava logi tÔttu (kuna konteineris pole tÔenÀoliselt Logrotate'i), ja Docker Daemon ei tea sellest logist midagi.
Dockeril on mitmeid logi draivereid vÔi pistikprogramme konteinerite logide kogumiseks. Tasuta versioonis Docker Community Edition (CE) on logi draivereid vÀhem kui kaubanduslikus Docker Enterprise Editionis (EE).

Ma ei ole kunagi praktikas kasutanud Docker EE-d: Southbridge'is pĂŒĂŒame kinni pidada avatud lĂ€htekoodiga lahendustest ning enamikule klientidest ei ole Docker EE lisafunktsioonid vajalikud.
Logi draiverid Docker CE-s:
local â logide salvestamine Docker Daemoni sisemistesse failidesse;
json-file â json-logi loomine iga konteineri kausta;
journald â logide saatmine journald'ile.
Dockeris logimise seaded asuvad failis daemon.json.
VĂ€ljas "log-driver" mÀÀratakse pistikprogramm ja vĂ€ljas "log-opts" â selle seaded. Ălaltoodud nĂ€ites on mÀÀratud pistikprogramm "json-file", logi suuruse piirang - "max-size": "10m"; failide arvu piirang (pöörlemise seaded) - "max-file": "3"; ning vÀÀrtused, mis lisatakse logidele.

MÔningaid logi draiveri seadeid saab mÀÀrata kÀsurea utiliidi kaudu. See on mugav, kui eraldi konteiner tuleb kÀivitada teise logi draiveriga.
Nii nÀeb logimise skeem Dockeris vÀlja:

Kuidas sĂŒsteem töötab: logidraiver, nĂ€iteks json-file, loob faile. Logikogujaid (Rsyslog, Fluentd, Logagent ja teised) koguvad need failid ja edastavad need salvestamiseks Elasticusse, Sematexti vĂ”i teistele salvestuskohtadele.
Logimise eritiused Kuberneteses
Lihtsustatud kujul nÀeb logimine Kuberneteses vÀlja nii: on pod, milles töötab konteiner, ja konteiner saadab logid stdout'i/stderr'i. SeejÀrel loob Docker faili ja salvestab logid, mida saab hiljem keerata.

Vaadake lÀhemalt, millised on logimise eripÀrad Kuberneteses.
SĂ€ilitada logid deploide vahel. See on hĂ€davajalik tingimus logimise Ă”igeks seadistamiseks. Kui logisid deploide vahel ei sĂ€ilitata, siis uue rakenduse versiooni vĂ€ljatöötamisel kustutatakse varasemate logid, konteineri taaskĂ€ivitamine toob samuti kaasa logide kadumise. Kubernetesel on lipp âprevious, mis vĂ”imaldab nĂ€ha rakenduse logisid enne viimast Pod'i taaskĂ€ivitamist, kuid mitte sĂŒgavamale.
Agregeerida logid kĂ”ikidest instantsidest. Kui mikroteenuseid majutatakse pilves, siis vastutab sĂŒsteemi jĂ€relevalve eest pilveteenuse pakkuja. Kui mikroteenuseid töötab oma riistvara peal, tuleb konteinerite logide kĂ”rval koguda ka sĂŒsteemi logisid.
Varem ei olnud mugavaid tööriistu logide kogumiseks nii sĂŒsteemist kui ka mikroteenustest. Ăks tööriist kogus tavaliselt sĂŒsteemi logisid (nĂ€iteks Rsyslog), teine logisid Dockerilt (nĂ€iteks journal-bit koos Docker logi draiveri seadistamisega journaldile). Proovisime kasutada journal-bit'it, et koguda logisid konteineritest (Docker logi draiveri seadistamine, et logid kirjutataks journaldile) ja sĂŒsteemist (CentOS 7-l on juba systemd ja journald). Lahendus töötab, aga ei ole ideaalne. Kui logisid on palju, hakkab journal-bit lagima ja teated kaovad.
Eksperimendid kestsid ja leiti teine lahendus. CentOS 7-s dubleeritakse pĂ”hised sĂŒsteemi logid (messages, audit, secure) var-logis failidena. Dockeris saab samuti seadistada logide salvestamist json failidesse. Seega saab neid faile CentOS 7-st ja Dockerist koos koguda.
Aja jooksul muutus ELK Stack lahendus populaarseks. See on kombinatsioon mitmest tööriistast: Elasticsearch, Logstash ja Kibana.
Elasticsearch salvestab konteineritest logisid, Logstash kogub instantsidelt logisid, Kibana vÔimaldab saadud logisid töödelda ja nende pÔhjal graafikuid koostada. MÔnda aega kasutati ELK Stack'i aktiivselt, aga minu arvates on selle aeg möödas. Hiljem rÀÀgin, miks.
Lisage metaandmed. Podid, rakendused ja konteinerid vĂ”ivad töötada igal pool. Veelgi enam, ĂŒhel rakendusel vĂ”ib olla mitu instantsi. Logid on salvestatud ĂŒhte vormingusse, kuid me peame mĂ”istma, milline tĂ€pselt see replika on, milline Pod seda kirjutab ja millisest nimede ruumist see pĂ€rineb. SeepĂ€rast on logidele vaja lisada metaandmed.
Parsi logid. Naljakas, kuid logimise ja jĂ€lgimise sĂŒsteemi toetamise kulud vĂ”ivad ĂŒletada pĂ”hirakenduse kulud. Kui teil voolab kĂŒmneid ja sadu tuhandeid logisid sekundis, tundub see loomulik, kuid siiski tuleb tunda piiri. Ăks viis selle piiri leidmiseks on logide parsimine.
Ăldiselt ei ole vaja koguda ja salvestada kĂ”iki logisid, vaid saadetakse salvestamiseks ainult osa â nĂ€iteks logid staatusega âwarningâ vĂ”i âerrorâ. Kui rÀÀkida nginx-i vĂ”i ingress-kontrollerite logidest, siis vĂ”ib salvestada vaid need, mille staatus erineb 200-st. Kuid see ei ole universaalne nĂ”uanne: kui te vĂ”tate logidest mingil moel analĂŒĂŒse, siis on loogiline neid koguda.
MĂ”tlematult logide filtreerimist ei soovitata, kuna filtreeritud andmed ei pruugi olla piisavad normaalseks analĂŒĂŒsiks. Teisest kĂŒljest, vĂ”ib-olla peaks analĂŒĂŒsi lĂ€bi viima mitte logimistaseme, vaid metrite kogumise tasemel. Siis ei ole vaja sĂ€ilitada sadu tuhandeid 200 koodiga ridu. Ăks lĂ€henemisviis on saada teavet liiklusest ja vigadest ingress-kontrollerite mÔÔtmistest.
Ăldiselt tuleb siin korralikult mĂ”elda: mida soovite sĂ€ilitada ja kui kaua, sest vastasel juhul tekib olukord, kus logimissĂŒsteem vĂ”tab rohkem ressursse kui peamine projekt.
Praegu ei ole standardset lahendust logimiseks.Erinevalt jĂ€lgimisest, kus on ĂŒks kĂ”ige levinum lahendus Prometheus, puudub logimisel standard.
Selles loengus vaatleme kahte tööriista: ĂŒhte populaarsest ja teist â jĂ€rjest populaarsemat. Peale nende on olemas ka teisi, kuid selles artiklis me neid ei kĂ€sitle.
Kuna arvesse on vĂ”etud kĂ”ik ĂŒlaltoodud omadused, saab logimist Kuberneteses nĂŒĂŒd kujutada sellise skeemi kaudu:

Konteinerilogide jÀÀb alles, rotatsioon on olemas, kuid ilmub kogumise agent, mis valib logid ja saadab need salvestamiseks (skeemil â Logging Backend). Agent töötab igas sĂ”lmes ja tavaliselt on see kĂ€ivitatud Kuberneteses.
NĂŒĂŒd vaatame logimise tööriistu.
Grafana Loki
ilmus hiljuti, kuid on juba ĂŒsna tuntud. Selle eelised: kergesti paigaldatav, tarbib vĂ€he ressursse, ei vaja Elasticsearchi paigaldamist, kuna salvestab andmed TSDB-sse (ajareĂ€kitud andmebaas). Eelmisel artiklis kirjutasin, et sellises andmebaasis hoiab andmeid Prometheus, ja see on ĂŒks paljusid sarnasusi kahe toote vahel. Arendajad isegi vĂ€idavad, et Loki on "Prometheus logimise maailmas".
PĂ€evakorda TSDB kohta neile, kes ei ole lugenud : TSDB tĂ€idab suure hulga ajareadade andmete sĂ€ilitamise ĂŒlesande suurepĂ€raselt, kuid ei ole mĂ”eldud pikaajaliseks sĂ€ilitamiseks. Kui mingil pĂ”hjusel peate logisid sĂ€ilitama kauem kui kaks nĂ€dalat, siis on parem seadistada nende edastamine teise andmebaasi.
Veel ĂŒks Loki eelis on see, et andmete visualiseerimiseks kasutatakse Grafanat. See on vĂ€ga mugav: Grafanas vaatame jĂ€lgimisandmeid ja seal samas, ĂŒhendades Loki, vaatame logisid. Logide pĂ”hjal saab ehitada diagramme.
Loki arhitektuur nÀeb vÀlja umbes selline:

DaemonSet'i abil kĂ€itatakse klastris kĂ”igil serveritel agendi â Promtail vĂ”i Fluent Bit. Agent kogub logisid. Loki vĂ”tab need ja salvestab oma TSDB-sse. Logidele lisatakse kohe metainformatsioon, mis on mugav: saab filtreerida Pods'i, namespace'ide, konteinerite nimede ja isegi siltide jĂ€rgi.
Loki töötab tuttavas Grafana liideses. Loki'l on isegi oma pĂ€ringute keel, mida nimetatakse LogQL-iks â nime ja sĂŒntaksi poolest meenutab see PromQL-i Prometheuses. Loki liideses on pĂ€ringute vihjed, seega ei pea neid sĂŒdameiselt teadma.

Loki liidese Grafanas
Filtreid kasutades saab Lokis leida koode ("400", "404" ja igasuguseid muid); vaadata logisid kogu sĂ”lmel; filtreerida vĂ€lja kĂ”ik logid, kus esineb sĂ”na "error". Kui logile vajutada, avaneb kaart, kus on kogu teave sĂŒndmuse kohta.
Loki pakub mitmeid tööriistu, mis vÔimaldavad vajalikest logidest andmeid vÀlja tÔmmata, kuigi ausalt öeldes vÔiks neid tehniliselt rohkem olla. Praegu arendatakse Lokit aktiivselt ja see kogub populaarsust.
Elastic + Fluent Bit + Kibana (EFK virn)
EFK virn on klassikalisem ja samas mitte vÀhem populaarne logimisvahend.
Artikli alguses mainiti ELK-d (Elasticsearch + Logstash + Kibana), kuid see virn on vananenud, kuna Logstash ei ole kuigi efektiivne ja nĂ”uab palju ressursse. Selle asemel on hakanud kasutama kergekaalulisemat ja efektiivsemat Fluentd-d, ning pĂ€rast seda tuli sellele appi â veelgi kergekaalulisem ja veelgi efektiivsem logikoguja agent.
Arendajate vĂ€itel on Fluent Bit rohkem kui 100 korda efektiivsem kui Fluentd: «Seal, kus Fluentd tarbib 20 MB RAM-i, tarbib Fluent Bit 150 KB» â otse tsitaat dokumentatsioonist. Selle pĂ”hjal on Fluent Bit-d hakanud sagedamini kasutama.
Fluent Bit-l on vÀhem vÔimalusi kui Fluentd-l, kuid see katab peamised vajadused, mistÔttu kasutame peamiselt Fluent Bit-i.
EFK steki tööpĂ”himĂ”te: agent kogub logisid kĂ”igilt podidelt (tavaliselt on see DaemonSet, mis on kĂ€ivitatud kĂ”igil klastriserveritel) ja saadab need salvestusse (Elasticsearch, PostgreSQL vĂ”i Kafka). Kibana ĂŒhendub salvestusega ja toob sealt vĂ€lja kogu vajaliku teabe.

esitleb teavet kasutajasÔbralikus veebiliideses. Seal on graafikud, filtrid ja palju muud.

Logide pĂ”hjal saab luua terveid infosĂŒsteeme.

Fluent Biti vÔimalused
Kuna Fluent Bitist on tavaliselt rÀÀgitud vÀhem kui Logstashist, vaatame seda veidi lÀhemalt. Fluent Biti vÔib loogiliselt jagada kuue mooduli peale, millele saab lisada pistikprogramme, mis laiendavad Fluent Biti vÔimalusi.

Sisendi moodul kogub logisid failidest, systemd teenustest ja isegi tcp-socketist (piisab, kui nĂ€idata endpoint'i, ja Fluent Bit hakkab sinna ĂŒhenduma). Need vĂ”imalused on piisavad, et koguda logisid nii sĂŒsteemist kui konteineritest.
Tootmisperioodil kasutame kÔige sagedamini pistikprogramme (seda saab suunata logifailidega kausta) ja (sellele saab öelda, millistest teenustest logisid koguda).
Parsimise moodul toob logid ĂŒhtsesse vormi. Vaikimisi on Nginx'i logid stringid. Plugina abil saab selle stringi teisendada JSON-ks: mÀÀrata vĂ€lja ja nende vÀÀrtused. JSON-iga on palju lihtsam töötada kui tekstilogi puhul, kuna see pakub paindlikumaid sorteerimisvĂ”imalusi.
Filtri moodul. Sel tasemel eraldatakse soovimatud logid. NÀiteks saadetakse salvestamiseks ainult logid, mille vÀÀrtus on "warning" vÔi kindlatele mÀrgistele vastavad logid. Valitud logid jÔuavad puhvrisse.
Puhvri moodul. Fluent Bit'il on kaks tĂŒĂŒpi puhvrit: mĂ€lupuhver ja kettapuhver. Puhver on ajutine logide salvestus, mis on vajalik vigade vĂ”i rikke korral. KĂ”ik tahavad RAM-i pealt kokku hoida, seetĂ”ttu valitakse tavaliselt kettapuhver. Kuid tuleb arvestada, et enne kettale minekut laaditakse logid ikkagi mĂ€llu.
Suunamise/VÀljundi moodul sisaldab reegleid ja logide saatmise aadresse. Nagu juba mainitud, saab logisid saata Elasticsearch'i, PostgreSQL'i vÔi nÀiteks Kafka'sse.
Huvitav on see, et Fluent Bit logisid saab saata Fluentd-sse. Kuna esimene on kergem ja vÀhem funktsionaalne, saab selle kaudu logisid koguda ja edastada Fluentd-sse, kus neid tÀiendavate plugin'ite abil töötelda ja salvestustesse saata.
Kui plaanite kasutada ElasticsearchiâŠ
LÔpetuseks kaks nÀpunÀidet neile, kes plaanivad kasutada Elasticsearchi tootmisandmetena logide salvestamiseks.
- Seadistage teavitused kasutades . See rakendus eraldab ĂŒldisest logivoolust olulisi sĂ”numeid ja saadab nende kohta teavitusi e-postile vĂ”i teistele kanalitele. Kahjuks tuli hiljuti kurb uudis, et projekt vĂ”ib peagi lĂ”petada oma eksisteerimise. .
- Rottige logisid rakenduse vĂ”i Elasticsearchi API kĂ”nesid. Elastic teeb sisuliselt praegu olulisi samme indeksite elutsĂŒkli haldamiseks ilma kolmandate osapoolte tööriistadeta. Ăldiselt pole mĂ”tet logisid pikalt hoida: tĂ”enĂ€oliselt pole mingit logi vajalik kaks nĂ€dalat hiljem â kui see on tĂ”eliselt kriitiline, on see kindlasti juba kahe nĂ€dala jooksul kĂ€sitletud. ĂĂ€rmisel juhul saab vanad logid arhiveerida ja saata pikaajalisse sĂ€ilitamisse. Olen kuulnud erilistest logidest, mida seaduse kohaselt peab sĂ€ilitama kuni 5 aastat. Isiklikult ma sellise olukorraga kokku ei ole puutunud, kuid ma ei seondaks sellist teavet tavalogidega ning tĂ”enĂ€oliselt hoiaksin neid isegi eraldi.
JĂ€tkubâŠ
Autor: Marcell Ibraev, sertifitseeritud Kubernetes administraator, praktikainsener , esineja ja koolituste arendaja .
Allikas: habr.com
