
Aasta 2019 oli kÀes ja meil polnud ikka veel standardset lahendust logide kogumiseks Kuberneteses. Selles artiklis soovime, kasutades reaalse praktika nÀiteid, jagada oma otsinguid, kohtatud probleeme ja nende lahendusi.
Siiski soovin alguses mÀrkida, et erinevad kliendid mÔistavad logide kogumist vÀga erinevalt:
- keegi soovib nÀha turbe- ja auditi logisid;
- keegi â kogu infrastruktuuri tsentraliseeritud logimist;
- aga mÔnele piisab vaid rakenduse logide kogumisest, vÀlja arvatud nÀiteks tasakaalustajad.
Kuidas me erinevaid "soove" realiseerisime ja milliste raskustega silmitsi seisime â loe edasi.
Teooria: logide tööriistadest
LogimisĂŒsteemi komponente kĂ€sitlev eelainetus
Logimine on lĂ€binud pika teekonna, mille tulemusena on vĂ€lja töötatud logide kogumise ja analĂŒĂŒsi metoodikad, mida me tĂ€napĂ€eval kasutame. Juba 1950. aastatel ilmus Fortransse sarnane standardne sisendi- ja vĂ€ljundi voog, mis aitas programmeerijatel oma programme tĂ”rgete puhul debugida. Need olid esimesed arvutilogid, mis leevendasid toona programmeerijate elu. TĂ€naseks nĂ€eme meis esimese logimisĂŒsteemi komponenti â logide allikas vĂ”i "tootja" (producer).
Arvutiteadus ei seisa paigal: tekkisid arvutivĂ”rgud, esimesed klastrid... Alguses hakkasid töötama keerukad sĂŒsteemid, mis koosnesid mitmest arvutist. NĂŒĂŒd pidid sĂŒsteemiadministraatorid koguma logisid mitmelt masinalt, ja erijuhtudel vĂ”isid nad lisada ka operatsioonisĂŒsteemi tuuma sĂ”numeid, juhuks kui on vaja uurida sĂŒsteemi tĂ”rget. Tsentraliseeritud logide kogumise sĂŒsteemide kirjeldamiseks ilmus 2000. aastate alguses , mis standardiseerib remote_syslog. Nii ilmus veel ĂŒks oluline komponent: logide koguja ja nende salvestus.
Logide mahu suurenemise ja veebitehnoloogiate laialdise kasutuselevĂ”tu tĂ”ttu tekkis kĂŒsimus, kuidas logisid kasutajatele mugavalt esitada. Lihtsad konsooli tööriistad (awk/sed/grep) asendati arenenumatega logivaaturid â kolmas komponent.
Logide mahu arvestuse suurenemise tĂ”ttu on selge ka midagi muud: logid on vajalikud, kuid mitte kĂ”ik. Erinevad logid nĂ”uavad erinevat taset sĂ€ilitamist: ĂŒhed vĂ”ib kaotada pĂ€evas, teised tuleb hoida 5 aastat. Nii lisandus logimisĂŒsteemi komponent andmevoogude filtreerimiseks ja marsruutimiseks â kutsume seda filtriks.
Ladustamine on samuti mĂ€rkimisvÀÀrselt edasi arenenud: tavalistest failidest on ĂŒle mindud relatsiooniliste andmebaaside ja seejĂ€rel dokumentide pĂ”histe ladustamislahenduste (nĂ€iteks Elasticsearch) poole. Nii eraldus kogumisest ladustamine.
LĂ”ppkokkuvĂ”ttes on logi mĂ”isted laienenud abstraktsesse sĂŒndmuste voogu, mida soovime ajaloos sĂ€ilitada. TĂ€psemalt â juhul, kui on vaja korraldada uurimist vĂ”i koostada analĂŒĂŒtiline aruanneâŠ
LĂ”puks, lĂŒhikese aja jooksul on logide kogumine arenenud oluliseks alamsĂŒsteemiks, mida vĂ”ib Ă”igustatult nimetada Big Data alaseks osaks.

Kui kunagi olid tavalised print'id piisavad âlogimissĂŒsteemiâ jaoks, siis nĂŒĂŒd on olukord oluliselt muutunud.
Kubernetes ja logid
Kui Kubernetes tuli infrastruktuuri, siis eksisteerinud logide kogumise probleem ei jĂ€tnud teda puutumatuks. Teatud mĂ”ttes muutus see isegi valusamaks: infrastruktuuri platvormi haldamine oli mitte ainult lihtsustatud, vaid samal ajal keerulisem. Paljud vanad teenused alustasid migreerimist mikroteenuste juhtimisele. Logide kontekstis vĂ€ljendus see logide allikate arvu suurenemises, nende erilise elutsĂŒkli ja vajaduses jĂ€lgida kĂ”igi sĂŒsteemi komponentide omavahelisi seoseidâŠ
Eelnevale vaates vÔib öelda, et praegu ei ole kahjuks standardiseeritud logimise varianti Kubernetes'ele, mis eristuks kÔigist teistest. KÔige populaarsemad kogukonnas skeemid on jÀrgmised:
- keegi seadistab stack'i EFK (Elasticsearch, Fluentd, Kibana);
- keegi - proovib hiljuti vÀlja antud vÔi kasutab ;
- meid (vĂ”ib-olla mitte ainult meid? ..) paljuski rahuldab oma arendus â âŠ
Tavaliselt kasutame selliseid kombinatsioone K8s-klastrites (self-hosted lahenduste jaoks):
- ;
- .
Kuid ma ei kavatse peatuda nende installimise ja konfigureerimise juhistel. Selle asemel keskendun nende puudustele ja globaalsematele jĂ€reldustele logide olukorra kohta ĂŒldiselt.
Logide praktika K8s-is

âIgapĂ€evased logidâ, kui palju teid on?..
Keskne logide kogumine piisavalt suure infrastruktuuri puhul nÔuab mÀrkimisvÀÀrseid ressursse, mis lÀhevad logide kogumisele, sÀilitamisele ja töötlemisele. Erinevate projektide kÀigus oleme kokku puutunud erinevate nÔudmiste ning neist tulenevate probleemidega.
Proovime ClickHouse'i
Vaatame keskset salvestust projektil, kus rakendus genereerib aktiivselt logisid: ĂŒle 5000 rida sekundis. Alustame töötamist nende logidega, kogudes need ClickHouse'i.
Niipea, kui on vajalik maksimaalne reaalaja töötlus, on 4-tuuma server ClickHouse'i jaoks juba koormatud diskisĂŒsteemi osas:

Selline laadimise tĂŒĂŒp on seotud sellega, et pĂŒĂŒame maksimaalselt kiiresti kirjutada ClickHouse'i. Ja sellele DB reageerib suurenenud diskikoormusega, mistĂ”ttu vĂ”ib esineda selliseid vigu:
DB::Exception: Liigne partii (300). Ăhendused töötlevad oluliselt aeglasemalt kui sisestamised
Asi on selles, et ClickHouse'is (kus asuvad logide andmed) on kirjutamise toimingutel oma keerukused. Tabelisse sisestatud andmed genereerivad ajutise partii, mis hiljem ĂŒhinenud pĂ”hitĂ€iusega. Tulemuseks on, et kirjutamine on kettale vĂ€ga nĂ”udlik ning sellele kehtib piirang, mille kohta saime eespool teate: 1 sekundi jooksul ei tohi ĂŒhenduda rohkem kui 300 alampartiid (tegelikult 300 sisestamist sekundis).
Et sellist kĂ€itumist vĂ€ltida, nii suurte blokidena kui vĂ”imalik ja mitte sagedamini kui 1 kord 2 sekundi jooksul. Kuid suurte pakettide kirjutamine eeldab, et peame harvemini kirjutama ClickHouse'i. See omakorda vĂ”ib viia puhveri ĂŒletĂ€itumiseni ja logide kadumiseni. Lahendus on suurendada Fluentd puhvrit, kuid siis suureneb ka mĂ€lutarve.
MĂ€rkus: Teine probleemne kĂŒlg meie lahenduses ClickHouse'i kohta oli seotud sellega, et meie puhul (loghouse) on partitsioonimine realiseeritud lĂ€bi vĂ€listabelite, mis on seotud . See on toob kaasa selle, et suurte ajavahemike puhul on vajalik liialt palju mĂ€luruumi, kuna meta tabel lĂ€bib kĂ”ik partitsioonid â isegi need, mis kindlasti ei sisalda vajalikke andmeid. Siiski vĂ”ib sellise lĂ€henemisviisi nĂŒĂŒd julgelt vananenuks kuulutada ClickHouse'i uusimate versioonide jaoks (c ).
SeetĂ”ttu on selge, et ClickHouse'i reaalajas logide kogumiseks ei piisa ressursse kaugel iga projekti jaoks (tĂ€psemalt, nende jaotamine ei oleks otstarbekas). Lisaks on vajalik kasutada akumulaator, mille juurde me veel tagasi tuleme. Ălaltoodud juhtum on tegelik. Ja sel hetkel ei suutnud me pakkuda usaldusvÀÀrset ja stabiilset lahendust, mis rahuldaks kliendi nĂ”udmisi ja vĂ”imaldaks koguda logisid minimaalse viivitusegaâŠ
Aga Elasticsearch?
On teada, et Elasticsearch suudab taluda suuri koormusi. Proovime seda samas projektis. NĂŒĂŒd nĂ€eb koormus vĂ€lja jĂ€rgmiselt:

Elasticsearch suutis andmevoo töödelda, kuid selliste mahtude salvestamine kasutab tugevalt CPU-d. See lahendatakse klastrite korraldamisega. Puht tehniliselt pole see probleem, kuid selgub, et logide kogumise sĂŒsteemi jaoks kasutame juba umbes 8 tuuma ja meil on sĂŒsteemis tĂ€iendav kĂ”rge koormusega komponentâŠ
KokkuvĂ”tlikult: see variant vĂ”ib olla Ă”igustatud, kuid ainult juhul, kui projekt on suur ja selle juhtkond on valmis kulutama mĂ€rkimisvÀÀrseid ressursse keskse logimise sĂŒsteemile.
Siis tekib pĂ”hjendatud kĂŒsimus:
Milliseid logisid on tegelikult vaja?
Proovime muuta lĂ€henemist: logid peavad olema samas informatiivsed ja mitte katma iga sĂŒsteemis
Oletame, et meil on edukas veebipood. Millised logid on olulised? Maksimaalse teabe kogumine, nĂ€iteks maksevĂ€ravast â suurepĂ€rane idee. Kuid tooteartiklite lĂ”ikamise teenusest ei ole meie jaoks kriitilised kĂ”ik logid: piisab ainult vigadest ja laiendatud jĂ€lgimisest (nĂ€iteks 500-se vigade protsendi jĂ€lgimine, mida see komponent genereerib).
Nii oleme jĂ”udnud tĂ”demuseni, et keskne logimine ei ole kaugeltki alati pĂ”hjendatud. VĂ€ga sageli soovib klient koguda kĂ”ik logid ĂŒhte kohta, kuigi tegelikult on kogu logist vajalik vaid tinglikult 5% sĂ”numitest, mis on Ă€riliselt kriitilised:
- MÔnikord piisab nÀiteks ainult konteineri logi suuruse ja veateate kogumise seadistamisest (nt Sentry).
- Juhtumite uurimiseks vĂ”ib sageli piisata veateatest ja ĂŒsna suurest kohalikust logist.
- Meil on olnud projekte, mis piirdusid ainult funktsionaalsete testide ja veakogumise sĂŒsteemidega. Arendaja ei saanud logisid kasutada â nad nĂ€gid kĂ”ike lĂ€bi veateadete jĂ€lgimise.
Illustratsioon elust
Hea nĂ€ite toob esile teine lugu. Meile tuli taotlus ĂŒhe kliendi turvatiimi poolt, kellel oli juba kasutuses kommertslahendus, mis oli vĂ€lja töötatud kaua enne Kubernetes'e kasutuselevĂ”ttu.
TĂ”deti, et oli vaja "sĂ”brustada" tsentraliseeritud logide kogumise sĂŒsteemi ettevĂ”tte probleemide avastamise sensori â QRadariga. See sĂŒsteem suudab logisid vastu vĂ”tta syslog protokolli kaudu ning vĂ”tta FTP kaudu. Aga integreerida seda remote_syslog plugina kasutamisega fluentd'ga ei Ă”nnestunud kohe. (nagu selgus, ). QRadar'i seadistamise probleemid olid kliendi turvatiimi poolel.
SeetĂ”ttu laaditi osa logisid, mis olid Ă€rilisest vaatepunktist kriitilised, FTP QRadar'i, ja teine osa suunati remote syslog'i kaudu otse sĂ”lmedest. Selleks kirjutasime isegi mis vĂ”ib aidata kedagi sarnase ĂŒlesande lahendamisel... Saadud skeemi tulemusena sai klient kriitilisi logisid kĂ€tte ja analĂŒĂŒsis neid oma lemmikriistadega, samas kui meie suutsime vĂ€hendada logimise sĂŒsteemi kulusid, sĂ€ilitades vaid viimase kuu.
Veel ĂŒks nĂ€ide on ĂŒsna Ă”petlik selles, kuidas mitte teha. Ăhel meie kliendil, kes töötles of each kasutajalt saabuvate sĂŒndmuste mitmerealine struktureerimata teave logis. Kuidas kergesti arvata, oli selliseid logisid ÀÀrmiselt ebamugav lugeda ja sĂ€ilitada.
Logide kriteeriumid
Sellised nĂ€ited viivad meid jĂ€reldusele, et lisaks logide kogumise sĂŒsteemi valimisele tuleb disainida ka logid.! Millised on siin nĂ”uded?
- Logid peavad olema masinloetavas vormingus (nt JSON).
- Logid peavad olema kompaktsed ja vĂ”imaldama logimise taseme muutmist, et probleeme lahendada. Samas tuleb tootmiskeskkondades sĂŒsteemid kĂ€ivitada logimise tasemega nagu Hoiatus vĂ”i Error.
- Logid peavad olema normaliseeritud, st logi objektis peavad kĂ”ik read olema sama tĂŒĂŒpi vÀÀrtused.
Struktuurita logid vÔivad pÔhjustada probleeme logide laadimisel salvestusse ning nende töötlemise tÀielik peatamine. NÀiteks toome vÀlja vea 400, 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"
Vea Ă”petus tĂ€hendab, et saadate indeksi, kus on valmis kaardistus, vĂ€lja mingi tipu, mille tĂŒĂŒp on ebastabiilne. KĂ”ige lihtsam nĂ€ide on nginx logis olev vĂ€li muutuja $upstream_status. Selles vĂ”ib olla nii number kui ka string. NĂ€iteks:
{ "ip": "1.2.3.4", "http_user": "-", "request_id": "17ee8a579e833b5ab9843a0aca10b941", "time": "29/Okt/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, nagu 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/Okt/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, nagu 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 vea ja pÀring suunati teise sisuhoidla. Tulemusena muutus logides vÀÀrtus selliseks:
"upstream_response_time": "0.001, 0.007"
See olukord on nii levinud, et see on saanud isegi eraldi .
Aga kuidas on usaldusvÀÀrsusega?
On juhtumeid, kus on hÀdasti vaja kÔiki logisid eranditeta. Ja tavapÀrastes K8s logide kogumise skeemides, nagu eelnimetatud, on probleeme.
NĂ€iteks ei suuda fluentd koguda logisid lĂŒhiajalistest konteineritest. Ăhes meie projektis elab andmebaasi migratsiooni konteiner alla 4 sekundi ja siis kustutatakse â vastavalt vastavale annotatsioonile:
"helm.sh/hook-delete-policy": hook-succeeded
SeetÔttu ei jÔudnud migratsiooni tegevuse logi salvestusse. Sellisel juhul vÔib aidata poliitika before-hook-creation.
Teine nĂ€ide on Docker logide pööramine. Oletame, et on rakendus, mis kirjutab aktiivselt logidesse. Tavalistes tingimustes suudame kĂ”ik logid töödelda, kuid kui ilmneb probleem â nĂ€iteks nagu eespool kirjeldatud vale vorminguga â peatub töötlemine ning Docker pöörab faili. Tulemuseks on, et olulised ettevĂ”tte logid vĂ”ivad kaduma minna.
Just seetÔttu Oluline on jagada logide vooge, integreerides kÔige vÀÀrtuslikumate otse rakendusse saatmise, et tagada nende sÀilimine. Lisaks ei tee paha luua mingit "logide akumulaatorit", mis suudab taluda hetkete ei-toimetamise salvestust, sÀilitades kriitilised sÔnumid.
LĂ”puks ei tohi unustada, et igal sĂŒsteemil on oluline kvaliteetselt jĂ€lgida. Vastasel juhul on lihtne sattuda olukorda, kus fluentd on seisundis CrashLoopBackOff ja ei saatnud midagi, ja see tĂ€histab olulise teabe kaotust.
JĂ€reldused
Selles artiklis me ei kÀsitle selliseid SaaS-lahendusi nagu Datadog. Paljud siin kirjeldatud probleemid on mingil viisil juba lahendatud kommertsfirmade poolt, kes on spetsialiseerunud logide kogumisele, kuid mitte kÔik ei saa erinevatel pÔhjustel kasutada SaaS-i. (peamised - see on hind ja 152-FZ seaduse jÀrgimine).
Keskne logide kogumine nĂ€ib esialgu lihtsa ĂŒlesandena, kuid ei ole sugugi selline. Oluline on meeles pidada, et:
- Detsemberdada pĂ”hjalikult tuleks ainult kriitilisi komponente, samas kui teiste sĂŒsteemide jaoks vĂ”ib seadistada jĂ€lgimise ja vigade kogumise.
- Logid tootmises peaksid olema minimaalsed, et mitte tekitada liigset koormust.
- Logid peavad olema masinloetavad, normaliseeritud ja neil peab olema range formaat.
- TÔeliselt kriitilised logid tuleks saata eraldi vooguna, mis peab olema eraldatud pÔhivoolust.
- VÀÀrt on lĂ€bi mĂ”elda logide akumulaator, mis vĂ”ib pÀÀsta kĂ”rge koormuse puhangute korral ja muudab koormuse salvestusele ĂŒhtlasemaks.

Need lihtsad reeglid, kui neid rakendada igal pool, lubaksid töötada ka eespool kirjeldatud skeemides â isegi kui neis puuduvad olulised komponendid (akumulaator). Kuid kui sellistest pĂ”himĂ”tetest ei pea kinni, vĂ”ib ĂŒlesanne kergesti viia sind ja infrastruktuuri veel ĂŒhe kĂ”rge koormusega (ja samas vĂ€he efektiivse) sĂŒsteemi komponendini.
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «».
Allikas: habr.com
