Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus

2019. aastal ei olnud meil ikka veel standardset lahendust Kuberneteses logide kogumiseks. Selles artiklis tahame jagada oma otsingute tulemusi, kohti, kus kokku puutusime probleemidega, ja nende lahendusi, kasutades tegelikke nÀiteid.

Kuid kÔigepealt tuleb mÀrkida, et erinevad kliendid mÔistavad logide kogumist vÀga erinevalt:

  • mĂ”ni tahab nĂ€ha turbe- ja auditilogisid;
  • teine soovib kogu infrastruktuuri tsentraliseeritud logimist;
  • ja mĂ”nele piisab ainult rakenduse logide kogumisest, jĂ€ttes vĂ€lja nĂ€iteks tasakaalustajad.

Kuidas me rakendasime erinevaid „soove“ ja millega silmitsi seisisime, — loe edasi.

Teooria: tööriistad logide jaoks

Taust teavitussĂŒsteemi komponentidest

Logimine on lĂ€binud pika tee, mille kĂ€igus on vĂ€lja töötatud logide kogumise ja analĂŒĂŒsi metoodikad, mida me tĂ€na rakendame. Juba 1950. aastatel ilmus Fortran'is analoog standardsetest sisend-vĂ€ljundvoogudest, mis aitasid programmeritel oma programme tĂ”rkeotsingul. Need olid esimesed arvuti logid, mis lihtsustasid selle aja programmerite elu. TĂ€naseks nĂ€eme nendes esimese komponendi logimisĂŒsteemist — logide allikas vĂ”i "tootja" (producer).

Arvutiteadus ei seisnud paigal: tekkisid arvutivĂ”rgud, esimesed klastrid... Alustati keerukate sĂŒsteemide tööd, mis koosnesid mitmest arvutist. NĂŒĂŒd pidid sĂŒsteemiadministraatorid koguma logisid mitmelt masinalt ning erijuhtudel vĂ”isid nad lisada ka OS-i tuuma teadete, juhuks kui on vajalik sĂŒsteemi rikkumise uurimine. Et kirjeldada tsentraliseeritud logide kogumise sĂŒsteeme, ilmus 2000-ndate alguses RFC 3164, mis standardiseerib remote_syslog. Nii tekkis veel ĂŒks oluline komponent: logikogujad ja nende ladustamine.

Logide mahu suurenemise ja veebitehnoloogiate laialdase rakendamise tĂ”ttu kerkis kĂŒsimus, kuidas logisid kasutajatele mugavalt esitada. Lihtsatele kĂ€surea tööriistadele (awk/sed/grep) tuli vĂ€lja rohkem arenenud logivaatlejad — kolmas komponent.

Logide mahu suurenemise tĂ”ttu selgus veel ĂŒks asi: logid on vajalikud, kuid mitte kĂ”ik. Erinevad logid nĂ”uavad erinevat sĂ€ilitamise taset: mĂ”ned vĂ”ib kaotada pĂ€eva jooksul, teised tuleb aga hoida 5 aastat. Nii lisandus logimisĂŒsteemi komponent voogude andmete filtreerimiseks ja marsruutimiseks — kutsume seda filtriks.

Ahnus on teinud tĂ”sise hĂŒppe: tavalistest failidest oldi liikunud suhetebaasilistele andmebaasidele ja seejĂ€rel dokumentidepĂ”histele salvestustehnoloogiatele (nĂ€iteks Elasticsearch). Nii eraldus kollektsioonist salvestus.

LĂ”ppude lĂ”puks on logi mĂ”isted laienenud mingiks abstraktseks sĂŒndmuste vooks, mida soovime ajaloo jaoks salvestada. TĂ€psemalt — juhul, kui on vaja teha uurimine vĂ”i koostada analĂŒĂŒtiline aruanne...

LĂ”ppkokkuvĂ”ttes on suhteliselt lĂŒhikese aja jooksul logide kogumine arenenud oluliseks alamsĂŒsteemiks, mida vĂ”ib Ă”igustatult nimetada ĂŒheks Big Data haruks.

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus
Kui kunagi piisab tavalistest print'idest 'logimisĂŒsteemi' jaoks, siis nĂŒĂŒd on olukord mĂ€rkimisvÀÀrselt muutunud.

Kubernetes ja logid

Kubernetes'i sissetoomisega sĂŒvenes probleem logide kogumisel veelgi. Teatud mĂ”ttes muutus see isegi valusamaks: infrastruktuuri platvormi haldamine lihtsustati, ent samas ka keerulisemaks. Paljud vanad teenused hakkasid ĂŒle minema mikroteenuste iskele. Logide kontekstis vĂ€ljendus see logi allikate arvu kasvus, nende eripĂ€rases elutsĂŒklis ning vajaduses jĂ€lgida sĂŒsteemi komponentide omavahelisi seoseid logide kaudu...

VÔttes arvesse, et hetkel pole kahjuks olemas standardiseeritud logimise varianti Kubernetes'i jaoks, mis eristuks teistest. KÔige populaarsemad kogukonnas skeemid on jÀrgmised:

  • keegi loob stack'i EFK (Elasticsearch, Fluentd, Kibana);
  • keegi - proovib hiljuti vabastatud Loki vĂ”i kasutab Logging operator;
  • meid (vĂ”ib-olla mitte ainult meid?...) paljuski rahuldab meid enda arendus - loghouse


Tavaliselt kasutame K8s-klastrites selliseid kombinatsioone (self-hosted lahendustele):

Kuid ma ei kavatse peatuda nende paigaldamise ja konfigureerimise juhistel. Selle asemel keskendun nende puudustele ja ĂŒldistele jĂ€reldustele logide olukorra kohta.

Logide praktika K8s-is

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus

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

Suure infrastruktuuri tsentraliseeritud logide kogumine nÔuab mÀrkimisvÀÀrseid ressursse, mis lÀhevad logide kogumise, sÀilitamise ja töötlemise peale. Erinevate projektide kÀigus oleme silmitsi seisnud erinevate nÔudmiste ja nende tÔttu tekkivate probleemidega.

Proovime ClickHouse'i

Vaadakem tsentraliseeritud ladustamist projektis, mille rakendus genereerib ĂŒsna aktiivselt logisid: rohkem kui 5000 rida sekundis. Alustame tööga, kogudes neid ClickHouse'i.

Niipea kui on vaja maksimaalset reaalajas kĂ€itlemist, on 4-tuumaline server ClickHouse'iga juba liialdatud diskial sĂŒsteemiga:

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus

Selline laadimine on seotud sellega, et me ĂŒritame kirjutada ClickHouse'i nii kiiresti kui vĂ”imalik. Andmebaas reageerib sellele suurenenud ketaskoormusega, mistĂ”ttu vĂ”ib see anda selliseid vigu:

DB::Exception: Liiga palju osi (300). Ühendused töötlevad oluliselt aeglasemalt kui sisendid.

Asi on selles, et MergeTree-tabelid ClickHouse'is (kus hoitakse logi andmeid) esinevad kirjutamisel oma raskused. Nendesse sisestatud andmed genereerivad ajutise partitsiooni, mis pĂ€rast ĂŒhendatakse pĂ”hitaabliga. Selle tulemusena on kirjutamine vĂ€ga ketasnĂ”udlik ja sellele kehtib piirang, mille teavituse saime ĂŒlal: mitte rohkem kui 300 sub-partitsiooni (tegelikult 300 insert'i sekundis) vĂ”ivad valmistuda ĂŒhe sekundi jooksul.

Sellise kĂ€itumise vĂ€ltimiseks tuleb ClickHouse'isse kirjutada nii suurte tĂŒkkide kaupa kui vĂ”imalik ja mitte sagedamini kui 1 kord 2 sekundi jooksul. Ent suurte vahedega kirjutamine eeldab, et peame harvemini kirjutama ClickHouse'i. See omakorda vĂ”ib pĂ”hjustada puhverdamise ĂŒletĂ€itumise ja logide kaotuse. Lahendus on suurendada Fluentd puhvrit, kuid siis suureneb ka mĂ€lutarve.

MĂ€rkus: Teine probleemne aspekt meie lahendusest ClickHouse'ile seondus asjaoluga, et partitsioneering meie puhul (loghouse) on rakendatud vĂ€liste tabelite kaudu, mis on seotud Merge-tabeliga. See toob, et suurte ajavahemike valimise korral on vajalik liiga palju mĂ€luruumi, kuna meta tabel kĂ€ib lĂ€bi kĂ”ik osakonnad — isegi need, mis kindlasti ei sisalda vajalikke andmeid. Hetkel vĂ”ib aga sellist lĂ€henemist julgelt pidada aegunuks aktuaalsete ClickHouse versioonide jaoks (c 18.16).

KokkuvĂ”ttes on selge, et ClickHouse’i reaalajas logide kogumiseks ei piisa kaugeltki iga projekti ressurssidest (tĂ€psemalt, nende jaotamine ei ole mĂ”istlik). Samuti tuleb kasutada aku, mille juurde me veel kord tagasi tuleme. Ülaltoodud juhtum on reaalne. Ja sel ajal ei suutnud me pakkuda usaldusvÀÀrset ja stabiilset lahendust, mis rahuldaks tellijat ja vĂ”imaldaks logisid koguda minimaalse viivitusega


Aga Elasticsearch?

On teada, et Elasticsearch talub suuri koormusi. Proovime seda samas projektis. NĂŒĂŒd nĂ€eb koormus vĂ€lja jĂ€rgmiselt:

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus

Elasticsearch suudab andmepublishingu voogude töötlemisega hakkama saada, kuid selliste mahtude salvestamine kulutab palju CPU ressursse. Seda nimetatakse klastriks korraldamiseks. Puhtalt tehniliselt ei ole see probleem, kuid juhtub, et logide kogumise sĂŒsteemi toimimiseks kasutame juba umbes 8 tuuma ja meil on sĂŒsteemis veel ĂŒks kĂ”rge koormusega komponent...

KokkuvĂ”ttes: selline variant vĂ”ib olla pĂ”hjendatud, kuid ainult juhul, kui projekt on suur ja selle juhtkond on valmis kulutama mĂ€rkimisvÀÀrseid ressursse tsentraliseeritud logimise sĂŒsteemile.

Siis tekib loogiline kĂŒsimus:

Millised logid on tÔeliselt vajalikud?

Logid Kuberneteses (ja mitte ainult) tĂ€na: ootused ja reaalsus Proovime lĂ€henemist muuta: logid peaksid olema samas informatiivsed ja mitte katma iga sĂŒsteemis toimuvat sĂŒndmust.

Oletame, et meil on edukaid internetipoode. Millised logid on olulised? Maksimaalse teabe kogumine, nĂ€iteks makseportaalist — suurepĂ€rane idee. Kuid tooteloendi piltide lĂ”ikamise teenusest ei ole kĂ”ik logid meie jaoks kriitilised: piisab vaid vigadest ja laiendatud jĂ€lgimisest (nĂ€iteks 500. vigade protsendi pĂ”hjal, mida see komponent genereerib).

Nii oleme jĂ”udnud sinnani, et Keskendatud logimine ei ole alati Ă”igustatud. TrĂšs souvent, le client souhaite rassembler tous les journaux au mĂȘme endroit, alors qu'en rĂ©alitĂ©, seuls environ 5 % des messages du journal sont critiques pour l'entreprise :

  • MĂ”nikord piisab sellest, kui seadistada nĂ€iteks ainult konteineri logi suurus ja viga koguv tööriist (nt Sentry).
  • SĂŒndmuste uurimiseks piisab tihti veateatest ja suurest kohalikust logidest.
  • Meil on olnud projekte, kus piirduti puhtalt funktsionaalsete testide ja veakogumise sĂŒsteemidega. Arendajale ei olnud logid vajalikud — nad nĂ€gid kĂ”ike veateadete jĂ€lgimise kaudu.

Illustratsioon elust

Heaks nĂ€iteks vĂ”ib olla teine lugu. Meile tuli pĂ€ring ĂŒhe kliendi turvameeskonnalt, kellel oli juba kasutusel kommertslahendus, mis oli vĂ€lja töötatud kaua enne Kubernetes'e rakendamist.

Tuli vajadus „sĂŒmbioosida“ tsentraliseeritud logide kogumise sĂŒsteemi ettevĂ”tte probleemi avastamise sensoriga — QRadariga. See sĂŒsteem suudab vastu vĂ”tta logisid syslog protokolli kaudu ja FTP-st ĂŒles laadida. Siiski ei Ă”nnestunud selle integreerimine remote_syslog pluginaga fluentd kohe. (kui selgus, me ei ole ainsad). QRadara seadistamise probleemid tulid kliendi tur teams poolelt.

Kuna tulemusena laaditi osa Ă€ri jaoks kriitilisi logisid FTP-le QRadarisse, suunati teine osa otse sĂ”lmedelt remote syslog kaudu. Selleks kirjutatud lihtne chart — vĂ”ib-olla aitab see kellelgi sarnast ĂŒlesannet lahendada... TĂ€nu saadud skeemile sai klient kriitilisi logisid analĂŒĂŒsida (oma lemmiktööriistadega), samal ajal kui suudame vĂ€hendada logimise sĂŒsteemi kulusid, sĂ€ilitades vaid viimase kuu.

Veel ĂŒks nĂ€ide on ĂŒsna nĂ€itlik, kuidas asju ei tohiks teha. Üks meie klientidest töötles peamise domeeni kohta loendis. kasutajalt saabuvaid sĂŒndmusi, tehes mitmerealist strukturimata vĂ€ljundit. logides olevate andmete lugemine ja sĂ€ilitamine oli ÀÀrmiselt ebamugav.

Logide kriteeriumid

Sarnased nĂ€ited viivad jĂ€reldusele, et peale logide kogumise sĂŒsteemi valimise tuleb projekti veel ka logid ise! Millised on siinsed nĂ”uded?

  • Logid peavad olema masinloetavas formaadis (nt JSON).
  • Logid peavad olema kompaktsed ja vĂ”imaldama logimise taset muuta, et lahendada vĂ”imalikke probleeme. Samas tuleks tootmiskeskkondades kĂ€ivitada sĂŒsteemid logimise tasemega nagu Hoiatus vĂ”i Error.
  • Logid peavad olema normaliseeritud, see tĂ€hendab, et logi objekte sisaldavad kĂ”ik stringid peavad olema sama tĂŒĂŒpi vĂ€ljadega.

Struktureerimata logid vÔivad pÔhjustada probleeme logide laadimisel salvestusse ja nende töötlemise tÀieliku seiskumise. NÀiteks, 400 vea nÀide, millega paljud on kindlasti fluentd logides kokku puutunud:

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 indeksi, millel on valmis mapping, vĂ€lja, mille tĂŒĂŒp on ebastabiilne. Lihtsaim nĂ€ide on nginx logi vĂ€li, kus on muutuja $upstream_status. Seda vĂ”ib olla kas number vĂ”i string. 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"}

Logides on nÀha, et server 10.100.0.10 vastas 404-iga ja pÀring suunati teise sisuhoidlasse. Tulemusena muutus logis vÀÀrtus selliseks:

"upstream_response_time": "0.001, 0.007"

See olukord on nii levinud, et on saanud eraldi mainimise dokumentatsioonis.

Aga kuidas on usaldusvÀÀrsusega?

On juhtumeid, kus kĂ”ik logid on hĂ€davajalikud ilma eranditeta. TĂŒĂŒpilistel K8s logide kogumise skeemidel, nagu ĂŒlalpool arutatud, on sellega siiski probleeme.

NĂ€iteks ei saa fluentd koguda logisid lĂŒhiajalistest konteineritest. Ühes meie projektis elas andmebaasi migratsiooniga konteiner vĂ€hem kui 4 sekundit ning kustutati seejĂ€rel — vastavalt vastavale annotatsioonile:

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

Selle tÔttu ei jÔudnud migratsiooni tÀitmise logi hoidlasse. Antud juhul vÔib aidata before-hook-creation poliitika.

Teine nĂ€ide on Dockeri logide rotatsioon. Oletame, et on rakendus, mis kirjutab aktiivselt logidesse. Tavalistes tingimustes suudame kĂ”ik logid Ă”igel ajal töödelda, kuid kui probleem tekkib — nĂ€iteks nagu ĂŒlalpool kirjeldatud vale formaadi tĂ”ttu — peatused töötlemine ja Docker rotatsioonib faili. Tulemuseks on see, et kriitilised logid vĂ”ivad kaduda.

Just seetĂ”ttu Oluline on eristada logivoo, integreerides kĂ”ige vÀÀrtuslikumate edastamise otse rakendusse, et tagada nende sĂ€ilimine. Samuti ei tee paha luua mingisugust „logide akumulaatorit“, mis suudab ĂŒleelada lĂŒhiajalise salvestusruumi kadu, sĂ€ilitades samas kriitilised sĂ”numid.

LĂ”puks Ă€rge unustage, et iga alam sĂŒsteemi on oluline kvaliteetselt monitoorida. Vastasel juhul on lihtne sattuda olukorda, kus fluentd on seisundis CrashLoopBackOff ja ei edasta midagi, mis vĂ”ib tĂ€hendada olulise teabe kaotamist.

JĂ€reldused

KĂ€esolevas artiklis ei kĂ€sitle me SaaS-lahendusi nagu Datadog. Palju sellest töötlusest on juba lahendatud kaubanduslike ettevĂ”tete poolt, mis on spetsialiseerunud logide kogumisele, kuid mitte kĂ”ik ei saa erinevatel pĂ”hjustel SaaS-i kasutada. (peamised — need on 152-FZ tĂ€itmine ja maksumus).

Keskne logide kogumine nĂ€ib esialgu lihtsa ĂŒlesandena, kuid see pole sugugi nii. Oluline on meeles pidada, et:

  • Detailne logimine on vajalik vaid kriitiliste komponentide jaoks, samas kui teiste sĂŒsteemide jaoks saab seadistada jĂ€lgimise ja vigade kogumise.
  • Productions logid peaksid olema vĂ”imalikult minimaalsed, et vĂ€ltida liigset koormust.
  • Logid peavad olema masinloetavad, normaliseeritud ja jĂ€rgima ranget formaati.
  • TĂ”eliselt kriitilised logid tuleks edastada eraldi voos, mis on eraldatud peamistest.
  • Oluline on planeerida logide akumulaator, mis vĂ”ib pÀÀsta kĂ”rge koormuse puhangute eest ja tasandada salvestust koormust.

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus
Need lihtsad reeglid, kui neid rakendada igal pool, vĂ”imaldaksid töötada ja ĂŒlaltoodud skeemide kaudu — isegi hoolimata sellest, et neil puuduvad olulised komponendid (akumulaator). Kui aga neid pĂ”himĂ”tteid ei jĂ€rgita, vĂ”ib ĂŒlesanne viia teid ja infrastruktuuri veel ĂŒhe kĂ”rge koormusega (ja samas madala efektiivsusega) sĂŒsteemi komponendini.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster