Logid Kubernetesis (ja mitte ainult) tÀna: ootused ja tegelikkus

Logid Kubernetesis (ja mitte ainult) tÀna: ootused ja tegelikkus

On aasta 2019 ja meil pole ikka veel Kuberneteses logide liitmiseks standardlahendust. Selles artiklis soovime reaalse praktika nÀidete pÔhjal jagada oma otsinguid, tekkinud probleeme ja nende lahendusi.

Esmalt teen siiski broneeringu, et erinevad kliendid saavad logide kogumise kaudu vÀga erinevalt aru:

  • keegi soovib nĂ€ha turva- ja auditiloge;
  • keegi - kogu infrastruktuuri tsentraliseeritud logimine;
  • ja mĂ”ne jaoks piisab ainult rakenduste logide kogumisest, vĂ€lja arvatud nĂ€iteks tasakaalustajad.

Allpool on vÀljalÔige selle kohta, kuidas me rakendasime erinevaid soovinimekirju ja milliseid raskusi me kokku puutusime.

Teooria: logimistööriistade kohta

LogisĂŒsteemi komponentide taust

Raie on jĂ”udnud kaugele, mille tulemusena on vĂ€lja töötatud metoodikad palkide kogumiseks ja analĂŒĂŒsimiseks, mida me tĂ€na kasutame. 1950. aastatel tutvustas Fortran standardsete sisend-/vĂ€ljundvoogude analoogi, mis aitas programmeerijal oma programmi siluda. Need olid esimesed arvutilogid, mis muutsid tollaste programmeerijate elu lihtsamaks. TĂ€na nĂ€eme neis logisĂŒsteemi esimest komponenti - palkide allikas vĂ”i tootja.

Arvutiteadus ei jÀÀnud seisma: tekkisid arvutivĂ”rgud, esimesed klastrid... Tööle hakkasid mitmest arvutist koosnevad keerulised sĂŒsteemid. NĂŒĂŒd olid sĂŒsteemiadministraatorid sunnitud koguma logisid mitmest masinast ja erijuhtudel said nad lisada OS-i tuuma teateid juhuks, kui neil oli vaja sĂŒsteemitĂ”rget uurida. Tsentraliseeritud logikogumissĂŒsteemide kirjeldamiseks avaldati see 2000. aastate alguses RFC 3164, mis standardiseeris remote_syslogi. Nii ilmus veel ĂŒks oluline komponent: palgikoguja ja nende ladustamine.

Logide mahu suurenemise ja veebitehnoloogiate laialdase kasutuselevĂ”tuga tekkis kĂŒsimus, milliseid logisid on vaja mugavalt kasutajatele nĂ€idata. Lihtsad konsoolitööriistad (awk/sed/grep) on asendatud tĂ€iustatud tööriistadega logi vaatajad - kolmas komponent.

Seoses palgimahu suurenemisega selgus veel midagi: palke on vaja, aga mitte kĂ”iki. Ja erinevad palgid nĂ”uavad erinevat sĂ€ilitusastet: mĂ”ned vĂ”ivad kaduda ĂŒhe pĂ€evaga, teised tuleb sĂ€ilitada 5 aastat. Niisiis lisati logisĂŒsteemile andmevoogude filtreerimise ja marsruutimise komponent - nimetagem seda filter.

Ka salvestus on teinud suure hĂŒppe: tavafailidelt relatsiooniandmebaasidele ja seejĂ€rel dokumendile orienteeritud salvestusele (nĂ€iteks Elasticsearch). Seega eraldati hoidla kollektorist.

LĂ”ppkokkuvĂ”ttes on palgi mĂ”iste laienenud omamoodi abstraktseks sĂŒndmuste vooluks, mida tahame ajaloo jaoks sĂ€ilitada. VĂ”i Ă”igemini juhuks, kui on vaja lĂ€bi viia uurimine vĂ”i koostada analĂŒĂŒtiline aruanne...

Selle tulemusena on logide kogumisest suhteliselt lĂŒhikese aja jooksul kujunenud oluline alamsĂŒsteem, mida vĂ”ib Ă”igustatult nimetada ĂŒheks Big Data alajaotuseks.

Logid Kubernetesis (ja mitte ainult) tÀna: ootused ja tegelikkus
Kui kunagi ammu piisas tavalistest vĂ€ljatrĂŒkkidest “logisĂŒsteemiks”, siis nĂŒĂŒd on olukord palju muutunud.

Kubernetes ja palgid

Kui Kubernetes taristu juurde tuli, ei lĂ€inud sellest mööda ka juba eksisteeriv palkide kogumise probleem. MĂ”nes mĂ”ttes lĂ€ks see veelgi valusamaks: taristuplatvormi haldamine ei olnud mitte ainult lihtsustatud, vaid samal ajal ka keeruline. Paljud vanad teenused on hakanud migreeruma mikroteenustele. Logide kontekstis vĂ€ljendub see logiallikate kasvavas arvus, nende erilises elutsĂŒklis ning vajaduses jĂ€lgida logide kaudu kĂ”igi sĂŒsteemikomponentide seoseid...

Tulevikku vaadates vÔin tÔdeda, et praegu pole kahjuks Kubernetese jaoks standardiseeritud logimisvÔimalust, mis oleks kÔigi teistega soodsalt vÔrreldav. KÔige populaarsemad skeemid kogukonnas on jÀrgmised:

  • keegi rullib virna lahti EFK (Elasticsearch, Fluentd, Kibana);
  • keegi proovib hiljuti vĂ€lja antud Loki vĂ”i kasutab Raieoperaator;
  • meie (ja vĂ”ib-olla mitte ainult meie?..) Olen enda arenguga suures osas rahul - palkmaja...

Reeglina kasutame K8s klastrites (isehostitud lahenduste jaoks) jÀrgmisi komplekte:

Kuid ma ei peatu nende paigaldamise ja seadistamise juhistes. Selle asemel keskendun nende puudustele ja globaalsematele jĂ€reldustele palkide olukorra kohta ĂŒldiselt.

Harjutage palkidega K8s

Logid Kubernetesis (ja mitte ainult) tÀna: ootused ja tegelikkus

"IgapÀevased palgid", kui palju teid on?...

Tsentraliseeritud logide kogumine ĂŒsna suurest infrastruktuurist nĂ”uab mĂ€rkimisvÀÀrseid ressursse, mis kulub logide kogumisele, sĂ€ilitamisele ja töötlemisele. Erinevate projektide kĂ€igus puutusime kokku erinevate nĂ”uete ja nendest tulenevate tegevusprobleemidega.

Proovime ClickHouse'i

Vaatame projekti tsentraliseeritud salvestusruumi rakendusega, mis genereerib logisid ĂŒsna aktiivselt: rohkem kui 5000 rida sekundis. Alustame tööd tema logidega, lisades need ClickHouse'i.

Niipea, kui on vaja maksimaalset reaalajas, on ClickHouse'iga 4-tuumaline server ketta alamsĂŒsteemis juba ĂŒlekoormatud:

Logid Kubernetesis (ja mitte ainult) tÀna: ootused ja tegelikkus

Seda tĂŒĂŒpi laadimine on tingitud asjaolust, et proovime ClickHouse'is vĂ”imalikult kiiresti kirjutada. Ja andmebaas reageerib sellele suurenenud kettakoormusega, mis vĂ”ib pĂ”hjustada jĂ€rgmisi vigu:

DB::Exception: Too many parts (300). Merges are processing significantly slower than inserts

Fakt on see, et MergeTree tabelid ClickHouse'is (need sisaldavad logiandmeid) on kirjutamistoimingute ajal oma raskused. Neisse sisestatud andmed loovad ajutise partitsiooni, mis seejĂ€rel liidetakse pĂ”hitabeliga. Selle tulemusena osutub salvestamine kettale vĂ€ga nĂ”udlikuks ja sellele kehtib ka piirang, mille kohta saime ĂŒlaltoodud teate: 1 sekundiga ei saa liita rohkem kui 300 alamsektsiooni (tegelikult on see 300 sisestust sekundis).

Sellise kĂ€itumise vĂ€ltimiseks peaks ClickHouse'ile kirjutama vĂ”imalikult suurte tĂŒkkidena ja mitte rohkem kui 1 kord iga 2 sekundi jĂ€rel. Suurte sarivĂ”tete kirjutamine viitab aga sellele, et peaksime ClickHouse'is harvemini kirjutama. See vĂ”ib omakorda kaasa tuua puhvri ĂŒletĂ€itumise ja logide kadumise. Lahenduseks on Fluentd puhvri suurendamine, kuid siis suureneb ka mĂ€lukulu.

MĂ€rkus: Meie ClickHouse'i lahenduse teine ​​probleemne aspekt oli seotud asjaoluga, et partitsioonid on meie puhul (palkmaja) realiseeritud lĂ€bi ĂŒhendatud vĂ€liste tabelite. Ühenda tabel. See toob kaasa asjaolu, et suurte ajavahemike proovide vĂ”tmisel on vaja liigset RAM-i, kuna metatabel itereerib lĂ€bi kĂ”ik partitsioonid - isegi need, mis ilmselgelt vajalikke andmeid ei sisalda. Kuid nĂŒĂŒd vĂ”ib selle lĂ€henemisviisi ClickHouse'i praeguste versioonide jaoks ohutult aegunuks kuulutada (c 18.16).

Selle tulemusena saab selgeks, et mitte igal projektil pole piisavalt ressursse, et ClickHouse'is reaalajas logisid koguda (tÀpsemalt pole nende levitamine sobiv). Lisaks peate kasutama akumulaator, mille juurde tuleme hiljem tagasi. Eespool kirjeldatud juhtum on tÔeline. Ja toona ei suutnud me pakkuda usaldusvÀÀrset ja stabiilset lahendust, mis kliendile sobiks ja vÔimaldaks minimaalse viivitusega palke kokku koguda...

Aga Elasticsearch?

Elasticsearch talub teadaolevalt suuri töökoormusi. Proovime seda samas projektis. NĂŒĂŒd nĂ€eb koormus vĂ€lja selline:

Logid Kubernetesis (ja mitte ainult) tÀna: ootused ja tegelikkus

Elasticsearch suutis andmevoo seedida, kuid selliste mahtude kirjutamine kasutab palju protsessorit. See otsustatakse klastri korraldamisega. Tehniliselt pole see probleem, kuid selgub, et ainuĂŒksi logide kogumise sĂŒsteemi toimimiseks kasutame juba umbes 8 sĂŒdamikku ja sĂŒsteemis on veel ĂŒks kĂ”rgelt koormatud komponent...

KokkuvĂ”te: see valik vĂ”ib olla Ă”igustatud, kuid ainult siis, kui projekt on mahukas ja selle juhtkond on valmis kulutama mĂ€rkimisvÀÀrseid ressursse tsentraliseeritud logisĂŒsteemile.

Siis tekib loomulik kĂŒsimus:

Milliseid palke on tegelikult vaja?

Logid Kubernetesis (ja mitte ainult) tĂ€na: ootused ja tegelikkus Proovime lĂ€henemist ise muuta: logid peaksid olema samal ajal informatiivsed ja mitte katma igaĂŒks sĂŒndmus sĂŒsteemis.

Oletame, et meil on edukas veebipood. Millised logid on olulised? Koguda vĂ”imalikult palju teavet, nĂ€iteks maksete lĂŒĂŒsist, on suurepĂ€rane idee. Kuid mitte kĂ”ik pildilĂ”iketeenuse logid tootekataloogis pole meie jaoks kriitilised: piisab ainult vigadest ja tĂ€iustatud jĂ€lgimisest (nĂ€iteks 500 vea protsent, mille see komponent genereerib).

Seega oleme jĂ”udnud jĂ€reldusele, et tsentraliseeritud metsaraie ei ole alati Ă”igustatud. VĂ€ga sageli soovib klient koguda kĂ”ik logid ĂŒhte kohta, kuigi tegelikult on kogu logist vaja vaid tingimuslikku 5% ettevĂ”tte jaoks kriitilistest sĂ”numitest:

  • MĂ”nikord piisab, kui konfigureerida nĂ€iteks ainult konteineri logi ja veakoguja suurus (nĂ€iteks Sentry).
  • Juhtumite uurimiseks vĂ”ib sageli piisata veateatisest ja suurest kohalikust logist.
  • Meil oli projekte, mis said hakkama ainult funktsionaalsete testide ja veakogumissĂŒsteemidega. Arendaja ei vajanud logisid kui selliseid - nad nĂ€gid kĂ”ike alates veajĂ€lgedest.

Illustratsioon elust

Teine lugu vĂ”ib olla heaks nĂ€iteks. Saime pĂ€ringu ĂŒhe meie kliendi turvameeskonnalt, kes kasutas juba ammu enne Kubernetese kasutuselevĂ”ttu vĂ€lja töötatud kommertslahendust.

Tsentraliseeritud logide kogumise sĂŒsteemiga oli vaja "sĂ”braks saada" ettevĂ”tte probleemide tuvastamise anduriga - QRadar. See sĂŒsteem saab logisid vastu vĂ”tta syslogi protokolli kaudu ja hankida need FTP-st. Siiski ei olnud seda kohe vĂ”imalik integreerida fluentd-i remote_syslog pluginaga (nagu selgus, me ei ole ĂŒksi). Probleemid QRadari seadistamisega osutusid kliendi turvameeskonna pooleks.

Selle tulemusena laaditi osa Ă€rikriitilistest logidest ĂŒles FTP QRadarisse ja teine ​​osa suunati kaugsĂŒslogi kaudu otse sĂ”lmedest. Selle jaoks me isegi kirjutasime lihtne diagramm - ehk aitab see kellelgi sarnast probleemi lahendada... TĂ€nu tekkinud skeemile sai klient ise (oma lemmiktööriistade abil) kriitilisi logisid vastu ja analĂŒĂŒsis ning saime logimissĂŒsteemi maksumust vĂ€hendada, sÀÀstes vaid Eelmine kuu.

Teine nĂ€ide nĂ€itab, mida mitte teha. Üks meie klientidest töötlemiseks iga kasutajalt tulevad sĂŒndmused, tehtud mitmerealine struktureerimata vĂ€ljund info logis. Nagu arvata vĂ”is, oli selliseid logisid nii lugeda kui ka salvestada ÀÀrmiselt ebamugav.

Palkide kriteeriumid

Sellised nĂ€ited viivad jĂ€reldusele, et lisaks palgikogumissĂŒsteemi valimisele peate seda tegema kujundada ka palgid ise! Millised on siin nĂ”uded?

  • Logid peavad olema masinloetavas vormingus (nt JSON).
  • Logid peaksid olema kompaktsed ja logimisastet muutma, et vĂ”imalikke probleeme siluda. Samal ajal peaksite tootmiskeskkondades kĂ€ivitama sĂŒsteeme logimistasemega nagu Hoiatus vĂ”i viga.
  • Logid peavad olema normaliseeritud, st logiobjektis peavad kĂ”ik read olema sama vĂ€ljatĂŒĂŒbiga.

Struktureerimata palgid vÔivad pÔhjustada probleeme palkide lattu laadimisel ja nende töötlemise tÀieliku peatamise. NÀitena on siin nÀide veaga 400, mida paljud on Fluentd logides kindlasti kohanud:

2019-10-29 13:10:43 +0000 [warn]: dump an error event: error_class=Fluent::Plugin::ElasticsearchErrorHandler::ElasticsearchError error="400 - Rejected by Elasticsearch"

Viga tĂ€hendab, et saadate valmis vastendusega indeksisse vĂ€lja, mille tĂŒĂŒp on ebastabiilne. Lihtsaim nĂ€ide on muutujaga vĂ€li nginxi logis $upstream_status. See vĂ”ib sisaldada kas numbrit vĂ”i stringi. NĂ€iteks:

{ "ip": "1.2.3.4", "http_user": "-", "request_id": "17ee8a579e833b5ab9843a0aca10b941", "time": "29/Oct/2019:16:18:57 +0300", "method": "GET", "uri": "/staffs/265.png", "protocol": "HTTP/1.1", "status": "200", "body_size": "906", "referrer": "https://example.com/staff", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", "request_time": "0.001", "cache_status": "-", "upstream_response_time": "0.001, 0.007", "upstream_addr": "127.0.0.1:9000", "upstream_status": "200", "upstream_response_length": "906", "location": "staff"}
{ "ip": "1.2.3.4", "http_user": "-", "request_id": "47fe42807f2a7d8d5467511d7d553a1b", "time": "29/Oct/2019:16:18:57 +0300", "method": "GET", "uri": "/staff", "protocol": "HTTP/1.1", "status": "200", "body_size": "2984", "referrer": "-", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", "request_time": "0.010", "cache_status": "-", "upstream_response_time": "0.001, 0.007", "upstream_addr": "10.100.0.10:9000, 10.100.0.11:9000", "upstream_status": "404, 200", "upstream_response_length": "0, 2984", "location": "staff"}

Logid nÀitavad, et server 10.100.0.10 vastas tÔrkega 404 ja pÀring saadeti teise sisumÀlu. Selle tulemusena muutus logide vÀÀrtus jÀrgmiseks:

"upstream_response_time": "0.001, 0.007"

See olukord on nii tavaline, et vÀÀrib isegi eraldi viited dokumentatsioonis.

Aga usaldusvÀÀrsus?

MĂ”nikord on kĂ”ik logid ilma eranditeta elutĂ€htsad. Ja sellega on ĂŒlal pakutud/arutatud tĂŒĂŒpilistel K8-de logikogumisskeemidel probleeme.

NĂ€iteks fluentd ei saa koguda palke lĂŒhiealistest konteineritest. Ühes meie projektis elas andmebaasi migratsiooni konteiner vĂ€hem kui 4 sekundit ja seejĂ€rel kustutati - vastavalt vastavale mĂ€rkusele:

"helm.sh/hook-delete-policy": hook-succeeded

SeetÔttu ei kaasatud salvestusruumi migratsiooni kÀivituslogi. Sel juhul saab poliitikast abi. before-hook-creation.

Teine nĂ€ide on Dockeri logi pööramine. Oletame, et on olemas rakendus, mis kirjutab aktiivselt logidesse. Tavatingimustes Ă”nnestub meil kĂ”iki logisid töödelda, kuid niipea, kui ilmneb probleem – nĂ€iteks nagu eespool kirjeldatud vale vormingu puhul – töötlemine peatub ja Docker pöörab faili. Tulemuseks on see, et Ă€rikriitilised logid vĂ”ivad kaduda.

SellepĂ€rast oluline on logivoogude eraldamine, manustades kĂ”ige vÀÀrtuslikumad otse rakendusse, et tagada nende ohutus. Lisaks poleks ĂŒleliigne mĂ”ne loomine palkide “akumulaator”., mis vĂ”ib kriitilisi sĂ”numeid salvestades ĂŒle elada lĂŒhiajalise salvestusruumi puudumise.

LĂ”puks ei tohi me seda unustada Oluline on mis tahes alamsĂŒsteemi korralikult jĂ€lgida. Vastasel juhul on lihtne sattuda olukorda, kus fluentd on olekus CrashLoopBackOff ja ei saada midagi ning see tĂ”otab olulise teabe kadumist.

JĂ€reldused

Selles artiklis me ei kĂ€sitle SaaS-i lahendusi, nagu Datadog. Paljud siin kirjeldatud probleemid on logide kogumisele spetsialiseerunud Ă€riettevĂ”tete poolt ĂŒhel vĂ”i teisel viisil juba lahendatud, kuid kĂ”ik ei saa erinevatel pĂ”hjustel SaaS-i kasutada (peamised on maksumus ja vastavus standardile 152-FZ).

Tsentraliseeritud logikogumine nĂ€ib esmapilgul lihtne ĂŒlesanne, kuid see pole sugugi nii. Oluline on meeles pidada, et:

  • Üksikasjalikult tuleb logida ainult kriitilised komponendid, samas kui jĂ€lgimist ja vigade kogumist saab konfigureerida teiste sĂŒsteemide jaoks.
  • Tootmises tuleks palke hoida minimaalsena, et mitte lisada tarbetut koormust.
  • Logid peavad olema masinloetavad, normaliseeritud ja range vorminguga.
  • TĂ”eliselt kriitilised logid tuleks saata eraldi voos, mis tuleks peamistest eraldada.
  • Tasub kaaluda palgiakumulaatorit, mis vĂ”ib sÀÀsta suure koormuse purunemisest ja muuta lao koormuse ĂŒhtlasemaks.

Logid Kubernetesis (ja mitte ainult) tÀna: ootused ja tegelikkus
Need lihtsad reeglid, kui neid kĂ”ikjal rakendada, vĂ”imaldaksid ĂŒlalkirjeldatud ahelatel töötada – kuigi neil puuduvad olulised komponendid (aku). Kui te sellistest pĂ”himĂ”tetest kinni ei pea, juhatab ĂŒlesanne teid ja taristut kergesti mĂ”ne teise suure koormusega (ja samal ajal ebatĂ”husa) sĂŒsteemi komponendi juurde.

PS

Loe ka meie blogist:

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster