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

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

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 RFC 3164, 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.

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus
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 Loki vĂ”i kasutab Logging operatorit;
  • meid (vĂ”ib-olla mitte ainult meid? ..) paljuski rahuldab oma arendus — loghouse


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

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

„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:

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

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 MergeTree-tabelid 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, tuleb ClickHouse'i kirjutada 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 Merge-tabeliga. 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 18.16).

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:

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

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?

Logid Kuberneteses (ja mitte ainult) tĂ€na: ootused ja reaalsus 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, me ei ole ĂŒksi.). 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 lihtsa chart'i, 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 mainimise dokumentatsioonis.

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.

Logid Kuberneteses (ja mitte ainult) tÀna: ootused ja reaalsus
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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster