Monoliitrakenduselt mikroteenuste arhitektuurile ĂŒleminekul seisame silmitsi uute vĂ€ljakutsetega.
Monoliitrakenduses on tavaliselt piisav lihtsalt mÀÀrata, millises sĂŒsteemi osas viga esines. TĂ”enĂ€oliselt on probleem monoliidi enda koodis vĂ”i andmebaasis. Kuid kui hakkame otsima probleemi mikroteenuste arhitektuuris, pole kĂ”ik enam nii selge. Peame leidma terve tee, mille meediasisend lĂ€bis algusest lĂ”puni, eraldama selle sadade mikroteenuste seast. Paljudel neist on ka oma andmehoidlad, kus vĂ”ivad tekkida nii loogilised vead kui ka probleemid jĂ”udluse ja usaldusvÀÀrsusega.

Otsisin pikka aega tööriista, mis aitaks selliste probleemidega toime tulla (kirjutasin sellest Habrisse: , ), kuid lÔpuks tegin oma avatud lÀhtekoodiga lahenduse. Artiklis rÀÀgin teenuste vÔrgustiku lÀhenemise eelistest ja jagan uut tööriista selle rakendamiseks.
Jaotatud jĂ€lgimine on levinud lahendus vigade leidmise probleemile jaotatud sĂŒsteemides. Kuid mida teha, kui sĂŒsteemis ei ole veel sellist lĂ€henemist vĂ”rgusuhete teabe kogumisele rakendatud, vĂ”i veel hullem, kui see töötab osaliselt, aga teistes osades mitte, kuna see ei ole vanades teenustes lisatud? Probleemi tĂ€pse juurpĂ”hjuseni jĂ”udmiseks on oluline omada tĂ€ielikku ĂŒlevaadet sĂŒsteemis toimuva kohta. Eriti oluline on mĂ”ista, millised mikroteenusest osalevad Ă€ri jaoks kriitilistes teeotsades.
Siin vĂ”ib meile abiks tulla teenuse mesh lĂ€henemine, mis tegeleb kogu vĂ”rguteabe kogumise masinavĂ€rgiga madalamal tasemel, kui töötavad ise teenused. See lĂ€henemine vĂ”imaldab meil kogu liiklust salvestada ja reaalajas analĂŒĂŒsida. Lisaks ei pea rakendused selle kohta isegi midagi teadma.
Teenuse mesh lÀhenemine
Service mesh lĂ€henemise pĂ”hijĂ”ud on lisada veel ĂŒks infrastruktuuritase vĂ”rgu kohale, mis vĂ”imaldab meil teha kĂ”ike vaheteenuste suhtluses. Enamik rakendusi töötab jĂ€rgmiselt: iga mikroteenusest lisatakse tĂ€iendav sidecar konteiner lĂ€bipaistva proksiga, mille kaudu suunatakse kogu teenuse sisene ja vĂ€ljuv liiklus. Ja just siin on koht, kus saame teha kliendipoolset tasakaalustamist, rakendada turvapoliitikaid, kehtestada piirangud pĂ€ringute arvu osas ning koguda olulist teavet teenuste vahelisest suhtlusest tootmisreeglites.

Lahendused
Selle lÀhenemise mitmed rakendused on juba olemas: ja . Need to adjust the balance between functionality and resource consumption. While the extensive features provide great value out of the box, they also bring significant resource overhead. The larger the cluster running this system, the more resources you need to maintain the new infrastructure. At Avito, we operate Kubernetes clusters housing thousands of service instances, and this number is rapidly growing. In the current implementation, Istio consumes approximately 300MB of RAM per service instance. Due to the wide range of functionalities, transparent load balancing also impacts the overall response time of services, reaching up to 10ms.
As a result, we assessed our immediate needs and concluded that the primary reason for implementing such solutions was the ability to gather tracing information transparently across the entire system. We also wanted control over the interactions between services and the ability to manipulate headers transmitted between them.
Ultimately, we arrived at our solution:â .
Netramesh
â see on kerge service mesh lahendus, mis vĂ”imaldab piiramatu skaleerimist sĂ”ltumata sĂŒsteemis olevate teenuste arvust.
Uue lahenduse peamisteks eesmĂ€rkideks olid madal ressursi ĂŒlejÀÀnud ja kĂ”rge jĂ”udlus. Peamistest omadustest soovisime kohe vĂ”imalust lĂ€bipaistvalt edastada tracing span'e meie Jaeger sĂŒsteemi.
TĂ€na rakendatakse enamik pilvelahendusi Golangis. Ja loomulikult on sellel omad pĂ”hjused. Golangis vĂ”rguĂŒhendusi kirjutamine, mis töötavad asĂŒnkroonselt sisendi-tingimusena ja skaleeruvad vastavalt vajadusele tuumadele, on mugav ja piisavalt lihtne. Ja mis samuti vĂ€ga oluline, jĂ”udlus on piisav selle ĂŒlesande tĂ€itmiseks. SeetĂ”ttu valisime ka Golangi.
Tootlikkus
Keskendume oma jÔudlustega maksimaalse jÔudluse saavutamisele. Lahendusele, mis paigaldatakse igas teenuse eksemplaris, on vajalik vÀike mÀlu ja protsessorite aeg. Ja loomulikult peab ka vastuse viivitus olema vÀike.
Vaatame, millised on tulemused.
RAM
Netramesh tarbib ~10Mb ilma liikluseta ja kuni 50Mb maksimaalselt 10000 RPS koormusel ĂŒhe instantsi kohta.
Istio envoy proxy tarbib alati ~300Mb meie klastrites, kus on tuhandeid instantsse. See ei vÔimalda sellel skaleeruda kogu klastrile.


Netrameshiga oleme saavutanud mÀlu tarbimise vÀhenemise umbes 10 korda.
CPU
CPU kasutamine on koormuse korral suures osas ĂŒhtlane. See sĂ”ltub sidecarile suunatud pĂ€ringute arvust ajas. Arvud 3000 pĂ€ringu sekundi tipul:


On veel ĂŒks oluline aspekt: Netramesh on lahendus ilma control plane'ita ja ilma koormuseta ei tarbi see protsessoriaega. Istio sidecar'id uuendavad alati teenuste lĂ”pp-punkte. Tulemusena nĂ€eme sellist pilti ilma koormuseta:

Kasutame teenuste vahel suhtlemiseks HTTP/1. Istio vastuse aeg envoy kaudu edasi suunamisel kasvas kuni 5-10ms, mis on piisavalt palju teenuste jaoks, mis on valmis vastama millisekundi jooksul. Netrameshiga vÀhendati seda aega 0.5-2ms.
Skaleeritavus
VÀike ressursside kogus, mida iga proxie kasutab, vÔimaldab seda paigutada iga teenuse lÀhedale. Netramesh on loodud ilma control plane komponendita, et hoida iga sidecar'i kerge. Tihti teenuse mesh'i lahendustes jagab control plane teenuse avastamise teavet igasse sidecar'i. Koos sellega tuleb ka teave timeout'ide ja koormuse tasakaalustamise seadete kohta. KÔik see vÔimaldab teha palju kasulikke asju, kuid kahjuks paisutab see sidecar'e suuruses.
Teenuse avastamine

Netramesh ei lisa mingeid tÀiendavaid mehhanisme teenuse avastamiseks. Kogu liiklus suunatakse lÀbipaistvalt netra sidecar'i kaudu.
Netramesh toetab HTTP/1 rakendusprotokolli. Selle mÀÀratlemiseks kasutatakse konfigureeritavat portide nimekirja. Tavaliselt on sĂŒsteemis mitu porti, mille kaudu toimub HTTP suhtlemine. NĂ€iteks meie sĂŒsteemis kasutame teenuste ja vĂ€liste pĂ€ringute suhtlemiseks 80, 8890 ja 8080. Sellisel juhul saab neid mÀÀrata keskkonna muutujaga. NETRA_HTTP_PORTS.
Kui kasutate Kubernetes't orkestreerijana ja tema Service mehhanismi teenustevaheliseks suhtlemiseks klastris, siis mehhanism jÀÀb tĂ€pselt samaks. Esiteks saab mikroteenus teenuse IP-aadressi kube-dns'i kaudu ja avab sellele uue ĂŒhenduse. See ĂŒhendus luuakse kĂ”igepealt kohaliku netra-sidecar'iga ja kĂ”ik TCP paketid jĂ”uavad algselt just netrasse. JĂ€rgmiseks loob netra-sidecar ĂŒhenduse algse sihtkohaga. NAT pod IP-l sĂ”lmes jÀÀb samaks nagu netra puudumisel.
Jaotatud jÀlgimine ja konteksti edastamine
Netramesh pakub funktsionaalsust, mis on vajalik jĂ€lgimise span'ide saatmiseks HTTP suhtlemise kohta. Netra-sidecar parsink HTTP protokolli, mÔÔdab pĂ€ringute latentsust, saadab vajalikku teavet HTTP pĂ€istest. LĂ”ppkokkuvĂ”ttes saame kĂ”ik jĂ€lgimised ĂŒhte Jaegeri sĂŒsteemi. TĂ€iendava seadistuse jaoks saab kasutada ka keskkonnamuutujaid, mida pakub ametlik teek. .


Aga probleem on. Kuni teenused ei genereeri ja edasta spetsiaalset uber pĂ€ist, ei nĂ€e me ĂŒhendatud jĂ€lgimis span'e sĂŒsteemis. See on see, mida vajame probleemide kiireks leidmiseks. Siin pakub Netramesh jĂ€lle lahenduse. Proxy loevad HTTP pĂ€iseid ning kui seal pole uber trace id, genereerivad nad selle. Netramesh salvestab ka teabe sissetulevate ja vĂ€ljaminevate pĂ€ringute kohta sidecar'is ning seob need koos vajalike pĂ€iste rikastamise teel vĂ€ljaminevatele pĂ€ringutele. KĂ”ik, mida teenustes teha tuleb, on edastada ĂŒks pĂ€is X-Request-Id, mida saab konfigureerida keskkonnamuutuja abil NETRA_HTTP_REQUEST_ID_HEADER_NAME. Netrameshi konteksti suuruse haldamiseks saab mÀÀrata jĂ€rgmised keskkonnamuutujad: NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS (aeg, mille jooksul konteksti sĂ€ilitatakse) ja NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL (konteksti puhastamise sagedus).
Samuti on vĂ”imalik kombineerida mitmeid teid teie sĂŒsteemis, mĂ€rgistades need spetsiaalse seansimarkeriga. Netra vĂ”imaldab seada HTTP_HEADER_TAG_MAP HTTP-pealkirjade teisendamine vastavatesse jĂ€lgimisĂŒkste tagideks. See vĂ”ib olla eriti kasulik testimiseks. PĂ€rast funktsionaalsuse testi lĂ€bimist on vĂ”imalik vaadata, milline osa sĂŒsteemist oli mĂ”jutatud, filtreerides vastava session vĂ”tme jĂ€rgi.
PÀringu allika mÀÀratlemine
PÀringu pÀritolu mÀÀramiseks saab kasutada automaatse pÀise lisamise funktsionaalsust. Keskkonnamuutuja abil NETRA_HTTP_X_SOURCE_HEADER_NAME on vÔimalik mÀÀrata pÀise nimi, mis seatakse automaatselt. Kasutades NETRA_HTTP_X_SOURCE_VALUE saab mÀÀrata vÀÀrtuse, millega X-Source pÀis seatakse kÔigile vÀljaminevatele pÀringutele.
See vĂ”imaldab ĂŒhtlaselt kogu vĂ”rgus selle kasuliku pĂ€ise levitamist. Edasi saab seda kasutada teenustes ja lisada logidesse, metrikatesse.
Liikluse juhtimine ja Netrameshi sisemused
Netramesh koosneb kahest peamisest komponendist. Esimene, netra-init, seadistab vĂ”rgureeglid liikluse pĂŒĂŒdmiseks. See kasutab Kogu vĂ”i osa liikluse pĂŒĂŒdmiseks sidecar'is, mis on Netrameshi teine peamine komponent. Saate seadistada, milliseid portte soovite pĂŒĂŒda sissetulevatesse ja vĂ€ljuvatesse TCP sessioonidesse: SISSETULEVAD_PĂĂDURI_PORTID, VĂLJUTELEVAD_PĂĂDURI_PORTID.
Samuti on tööriistas huvitav vĂ”imalus - tĂ”enĂ€osuspĂ”hine marsruutimine. Kui kasutada Netrameshi ainult jĂ€lgimisandmete kogumiseks, saab tootmisikeskkonnas ressursse kokku hoida ja lubada tĂ”enĂ€osuspĂ”hise marsruutimise abil muutujaid NETRA_SISSEST_PROBABILITEET ja NETRA_VĂLJUTELEV_PROBABILITEET (0 kuni 1). Vaikimisi vÀÀrtus on 1 (pĂŒĂŒab kogu liikluse).
PĂ€rast edukat pĂŒĂŒdmist vĂ”tab netra sidecar uue ĂŒhenduse ja kasutab SO_ORIGINAL_DST socketi valikut, et saada algne sihtkoht. SeejĂ€rel avab Netra uue ĂŒhenduse algse IP-aadressiga ja loob kahepoolse TCP-ĂŒhenduse osaliste vahel, kuulates kogu lĂ€biva liikluse. Kui port on mÀÀratud kui HTTP, pĂŒĂŒab Netra seda analĂŒĂŒsida ja jĂ€lgida. Kui HTTP analĂŒĂŒs ebaĂ”nnestub, jĂ€rgneb Netra TCP-le ja sujuvalt edastab baite.
SÔltuvuste graafi koostamine
PĂ€rast suurt hulka jĂ€lgimisteabe saamist Jaegeris, tahaks saada tĂ€ielikku sĂŒsteemi suhtlemise graafikut. Kuid kui teie sĂŒsteem on piisavalt koormatud ja pĂ€eva jooksul koguneb miljardeid jĂ€lgimise spanne, muutub nende kogumine mitte nii lihtsaks ĂŒlesandeks. On ametlik viis selleks: . Sellegipoolest vĂ”tab see tunde, et koostada tĂ€ielik graaf ja sunnib alla laadima Jaegerist kogu andmestiku viimase 24 tunni jooksul.
Kui kasutate jÀlgimispannide salvestamiseks Elasticsearchi, saate kasutada , mis koostab sarnase graafi minutitega, kasutades Elasticsearchi omadusi ja vÔimalusi.

Kuidas kasutada Netrameshi
Netrat saab lihtsalt lisada igale teenusele, mis töötab mis tahes orkestreerija all. Saate vaadata nÀidet .
Praegu ei ole Netratel automaatset sidecar'i teenustele integreerimise vÔimalust, kuid see on plaanis.
Netrameshi tulevik
Peamine eesmÀrk on saavutada madalad ressursikulud ja kÔrge jÔudlus, pakkudes pÔhivÔimalusi jÀlgimise ja teenustevahelise suhtluse kontrollimise jaoks.
Tulevikus saab Netramesh toetada ka muid rakendustasandi protokolle peale HTTP. Peagi lisandub L7 suunamine.
Kasutage Netramesh'i, kui olete sarnaste probleemidega silmitsi, ning saatke meile oma kĂŒsimused ja ettepanekud.
Allikas: habr.com
