Netramesh – kergekaaluline teenuste mesh lahendus

Monoliitrakenduselt mikroteenuste arhitektuurile ĂŒleminekul seisame silmitsi uute probleemidega.

Monoliitrakenduses on tavaliselt piisav, et lihtsalt mÀÀrata, kus sĂŒsteemis probleem tekkis. TĂ”enĂ€oliselt on probleem ise monoliidi koodis vĂ”i andmebaasis. Kuid kui hakkame probleemi otsima mikroteenuste arhitektuuris, ei ole enam nii selge. Peame leidma kogu tee, mida pĂ€ring lĂ€bis algusest lĂ”puni, eristades seda sadadest mikroteenustest. Paljudel neist on ka oma andmehoidlad, kus vĂ”ivad esineda nii loogilised vead kui ka jĂ”udlus- ja talitlushĂ€ired.

Netramesh – kergekaaluline teenuste mesh lahendus

Otsisin pikka aega tööriista, mis aitaks selliste probleemidega tegeleda (kirjutasin sellest Habrisse: 1, 2), kuid lÔppkokkuvÔttes tegin oma avatud lÀhtekoodiga lahenduse. Artiklis rÀÀgin teenuste mesh'i lÀhenemisviisi eelistest ja jagan uut tööriista selle rakendamiseks.

Jaotatud jĂ€lgimine on levinud lahendus probleemide leidmiseks jaotatud sĂŒsteemides. Kuid mis siis, kui sĂŒsteemis ei ole sellist lĂ€henemist veel sisse viidud vĂ”i, mis on veel halvem, toimib see sĂŒsteemi osas korralikult, kuid teises osas ei ole see olemas, kuna see ei ole vanadesse teenustesse lisatud? Probleemi tĂ€pse juurpĂ”hjuse mÀÀramiseks on oluline omada tĂ€ielikku ĂŒlevaadet sellest, mis sĂŒsteemis toimub. Eriti tĂ€htis on mĂ”ista, millised mikroteenused osalevad peamistes Ă€ri jaoks kriitilistes teedes.

Siin saab meile appi tulla teenuste mesh'i lĂ€henemine, mis tegeleb kogu vĂ”rguinfo kogumise alustegevustega, mis toimib madalamal tasemel kui teenused ise. See lĂ€henemine vĂ”imaldab meil kogu liiklust pealt kuulata ja seda reaalajas analĂŒĂŒsida. Ja veel, rakendused ei pea sellest isegi midagi teadma.

Teenuste mesh'i lÀhenemine

Service mesh lĂ€henemise peamine idee on lisada vĂ”rgu kohal veel ĂŒks infrastruktuuri kiht, mis vĂ”imaldab meil teha kĂ”ikvĂ”imalikke asju teenustevahelise suhtluse osas. Enamik teostusi töötab jĂ€rgmiselt: iga mikroteenusele lisatakse tĂ€iendav sidecar konteiner koos lĂ€bipaistva proksiga, mille kaudu suunatakse kogu teenuse sisenev ja vĂ€ljuv liiklus. Ja siin saame me teha kliendipoolset koormuse tasakaalustamist, rakendada turvapoliitikaid, seada piiranguid pĂ€ringute arvule ning koguda olulist teavet teenustevahelise suhtluse kohta tootmises.

Netramesh – kergekaaluline teenuste mesh lahendus

Lahendused

Juba on olemas mitu selle lĂ€henemise teostust: Istio ja linkerd2. Need pakuvad palju funktsioone kohe vĂ€lja pakkudes. Kuid koos sellega tuleb ka suur ressursi ĂŒletĂ€itus. Mida suurem on klaster, milles selline sĂŒsteem töötab, seda rohkem ressursse on vaja uue infrastruktuuri toetamiseks. Avitos kasutame Kubernetes klastreid, milles on tuhandeid teenuse eksemplare (ja nende arv kasvab kiiresti). Praeguses teostuses tarvitab Istio ~300Mb RAM-i igas teenuse eksemplaris. Suure hulga vĂ”imaluste tĂ”ttu mĂ”jutab lĂ€bipaistev koormuse tasakaalustamine ka teenuste koguaega (kuni 10ms).

KokkuvĂ”ttes vaatasime, milliseid vĂ”imalusi me just nĂŒĂŒd vajame, ja otsustasime, et peamine pĂ”hjus, miks alustasime selliste lahenduste rakendamist, oli vĂ”imalus koguda jĂ€lgimisteavet kogu sĂŒsteemist lĂ€bipaistvalt. Samuti soovisime omada kontrolli teenustevahelise suhtluse ĂŒle ja teha erinevaid manipulatsioone teenuste vahel edastatavate pealkirjadega.

LĂ”ppkokkuvĂ”ttes jĂ”udsime oma lahenduseni:  Netramesh.

Netramesh

Netramesh on kerge service mesh lahendus, mis vĂ”imaldab piiramatu skaleerimist sĂ”ltumata teenuste arvust sĂŒsteemis.

Uue lahenduse peamised eesmĂ€rgid olid vĂ€ike ressursi ĂŒletĂ€ide ja kĂ”rge jĂ”udlus. Peamistest funktsioonidest soovisime kohe vĂ”imalust saadetada jĂ€lgimisseadet meie Jaeger sĂŒsteemi lĂ€bipaistvalt.

TĂ€napĂ€eval pĂ”hinevad enamik pilve lahendusi Golangil. Ja sellel on oma pĂ”hjused. Golangis vĂ”rgu rakenduste kirjutamine, mis töötavad asĂŒnkroonselt sisendi-vĂ€ljundi ja skaleeruvad vajadusel tuumadele, on mugav ja piisavalt lihtne. Ja mis veelgi olulisem, jĂ”udlus on piisav sellise ĂŒlesande lahendamiseks. SeetĂ”ttu valisime ka meie Golangi.

TÔhusus

Keskendusime oma pingutustes maksimaalse jÔudluse saavutamisele. Lahenduse puhul, mida kasutatakse iga teenuse eksemplari kÔrval, on oluline vÀike mÀlu ja protsessori kasutus. Ja loomulikult peab vastuse hilinemine olema samuti minimaalne.

Vaatame, millised tulemused saime.

RAM

Netramesh tarbib ~10Mb ilma liikluseta ja 50Mb maksimaalselt koormuse korral kuni 10000 RPS ĂŒhe eksemplari kohta.

Istio envoy proxy tarbib alati ~300Mb meie klastrites tuhandete eksemplaridega. See ei vÔimalda skaleerida seda kogu klastrile.

Netramesh – kergekaaluline teenuste mesh lahendus

Netramesh – kergekaaluline teenuste mesh lahendus

Netrameshiga saime mÀlu tarbimist vÀhendada ~10 korda.

CPU

CPU kasutus on koormuse all suhteliselt ĂŒhtlane. See sĂ”ltub soovide hulgast ajaĂŒhikus sidecarile. 3000 soovi sekundis tipptasemel vÀÀrtused:

Netramesh – kergekaaluline teenuste mesh lahendus

Netramesh – kergekaaluline teenuste mesh lahendus

On veel ĂŒks oluline aspekt: Netramesh on lahendus ilma kontrollplaanita ja ilma koormuseta ei tarbi see protsessori aega. Istio sidecarid uuendavad alati teenuste lĂ”pp-punkte. LĂ”ppkokkuvĂ”ttes saame sellise pildi ilma koormuseta:

Netramesh – kergekaaluline teenuste mesh lahendus

Kasutame teenuste vahel suhtlemiseks HTTP/1. Istio vastuse hilinemine envoy kaudu proksitamisel oli kuni 5-10ms, mis on piisavalt palju teenuste jaoks, mis on valmis vastama millisekundi jooksul. Netrameshiga vÀhenes see aeg 0.5-2ms.

Skaleeritavus

Iga proxy vÀhene ressursside kasutamine vÔimaldab seda paigutada igasse teenusesse lÀhemale. Netramesh loodi sihilikult ilma kontrollplaani komponendita, et sÀilitada iga sidecar'i kerge kaal. Tihti teenuse masinas lahendustes jagab kontrollplaan teenuse avastamise teavet igasse sidecar'i. Koos sellega tuleb ka teave ajutiste piirangute ja tasakaalustamiseseadete kohta. KÔik see vÔimaldab palju kasulikke asju, kuid kahjuks paisutab see sidecar'e suuruses.

Teenuse avastamine

Netramesh – kergekaaluline teenuste mesh lahendus

Netramesh ei lisa teenuse avastamiseks mingeid tÀiendavaid mehhanisme. Kogu liiklus proksitakse lÀbipaistvalt netra sidecar'i kaudu.

Netramesh toetab HTTP/1 rakendusprotokolli. Selle mÀÀramiseks kasutatakse konfigureeritavat sadamate loendit. TĂŒĂŒpiliselt on sĂŒsteemis mitu porti, mille kaudu toimub HTTP suhtlemine. NĂ€iteks meie sĂŒsteemis kasutame teenuste ja vĂ€liste pĂ€ringute vahel 80, 8890, 8080. Sel juhul saab neid mÀÀrata keskkonnamuutujaga. NETRA_HTTP_PORTS.

Kui kasutate Kubernetes'i orkestratsioonina ja selle Service mehhanismi siseklastri teenuste vaheliseks suhtlemiseks, jÀÀb mehhanism samaks. Esiteks saab mikroteenus service IP-aadressi kube-dns-i kaudu ja avab sellele uue ĂŒhenduse. See ĂŒhendus luuakse esmalt kohaliku netra-sidecariga ja kĂ”ik TCP paketid jĂ”uavad esmalt netra juurde. Edasi loob netra-sidecar ĂŒhenduse algse sihtkoha juurde. NAT pod IP-l sĂ”lmes jÀÀb samaks nagu ka ilma netra'ita.

Jaotatud jÀlgimine ja konteksti edastamine

Netramesh pakub funktsionaalsust, mis on vajalik HTTP suhtlemise jĂ€lgimisfuuside saatmiseks. Netra-sidecar analĂŒĂŒsib HTTP protokolli, mÔÔdab pĂ€ringute viivitusi ja toob vajalikku teavet HTTP pĂ€istest. LĂ”ppkokkuvĂ”ttes saame kĂ”ik jĂ€lgimised ĂŒhes Jaeger'i sĂŒsteemis. Peene konfigureerimise jaoks saab kasutada ka keskkonnamuutujaid, mida pakub ametlik raamatukogu. jaeger go library.

Netramesh – kergekaaluline teenuste mesh lahendus

Netramesh – kergekaaluline teenuste mesh lahendus

Kuid on probleem. Kuni teenused ei genereeri ja edasta spetsiaalset uber pĂ€ist, ei nĂ€e me ĂŒhendatud jĂ€lgimisfuuse sĂŒsteemis. Ja see on see, mida meil on vaja probleemide kiireks tuvastamiseks. Siin on Netramesh'il taas lahendus. Proksid loevad HTTP pĂ€iseid ja kui neis ei ole uber jĂ€lgimise ID'd, genereerivad nad selle. Netramesh sĂ€ilitab ka teavet sissetulevate ja vĂ€ljaminevate pĂ€ringute kohta sidecar'is ning seostab need vajalike pĂ€iste rikastamise teel vĂ€ljaminevates pĂ€ringutes. KĂ”ik, mida on vaja teenustes teha, on edastada vaid ĂŒks pĂ€is. X-Request-Id, mida saab konfigureerida keskkonnamuutujaga. NETRA_HTTP_REQUEST_ID_HEADER_NAME. Netramesh'is konteksti suuruse juhtimiseks saab mÀÀrata jĂ€rgmised keskkonnamuutujad: NETRA_TRACING_CONTEXT_EXPIRATION_MILLISECONDS (aeg, mille jooksul konteksti hoitakse) ja NETRA_TRACING_CONTEXT_CLEANUP_INTERVAL (konteksti puhastamise sagedus).

Samuti on vĂ”imalik kombineerida mitu teed teie sĂŒsteemis, tĂ€histades neid erilise sessioonimarkeriga. Netra vĂ”imaldab seadistada HTTP_HEADER_TAG_MAP HTTP pĂ€iste muutmiseks vastavateks jĂ€lgimise span siltideks. See vĂ”ib olla eriti kasulik testimise jaoks. PĂ€rast funktsionaalset testi saab vaadata, milline osa sĂŒsteemist oli mĂ”jutatud, filtreerides sobiva sessiooni vĂ”tme jĂ€rgi.

PÀringu allika mÀÀramine

Kuna mÀÀrata, kust pÀring tuli, saab kasutada automaatse pealkirja lisamise funktsiooni. Keskkonnamuutuja NETRA_HTTP_X_SOURCE_HEADER_NAME vÔimaldab mÀÀrata pealkirja nime, mis lisatakse automaatselt. Muutuja NETRA_HTTP_X_SOURCE_VALUE lubab mÀÀrata vÀÀrtuse, millega X-Source pealkiri seotakse kÔikide vÀljuvate pÀringute puhul.

See vĂ”imaldab ĂŒhtselt kogu vĂ”rgus sĂ€ilitada seda kasulikku pealkirja. Edasi on vĂ”imalik seda kasutada teenustes ja lisada logidesse, mÔÔtmistesse.

Liikluse suunamine ja Netrameshi sisemus

Netramesh koosneb kahest peamisest komponendist. Esimene, netra-init, seadistab vĂ”rgu reeglid liikluse pĂŒĂŒdmiseks. See kasutab iptables redirect reegleid kogu vĂ”i osa liikluse pĂŒĂŒdmiseks sidecari, mis on Netrameshi teine peamine komponent. Saate seadistada, milliseid porte tuleb pĂŒĂŒda sissetulevates ja vĂ€ljaminevates TCP sessioonides: INBOUND_INTERCEPT_PORTS, OUTBOUND_INTERCEPT_PORTS.

Samuti on tööriistal huvitav vĂ”imalus — tĂ”enĂ€osuslik suunamine. Kui kasutada Netrameshi ainult jĂ€lgimise span'ide kogumiseks, siis vĂ”ib tootmisolukorras ressursse kokku hoida ja lubada tĂ”enĂ€osuslikku suunamist muutuja abil NETRA_INBOUND_PROBABILITY ja NETRA_OUTBOUND_PROBABILITY (0 kuni 1). Vaikimisi on vÀÀrtus 1 (kogu liiklus on pĂŒĂŒtud).

PĂ€rast eduka pĂŒĂŒdmist vĂ”tab netra sidecar uue ĂŒhenduse ja kasutab SO_ORIGINAL_DST soketi valikut, et saada algne sihtpunkt. SeejĂ€rel avab Netra uue ĂŒhenduse algse IP-aadressiga ja loob kahepoolse TCP suhtluse osapoolte vahel, kuulates kogu liikumat liiklust. Kui port on mÀÀratud kui HTTP, proovib Netra seda analĂŒĂŒsida ja jĂ€lgida. Kui HTTP analĂŒĂŒs ebaĂ”nnestub, teeb Netra tagasiulatuva TCP ja lĂ€bipaistvalt proksib byte.

SÔltuvuste graafi koostamine

PĂ€rast suuri tracing teabe kogumise sessioone Jaegeris tahaksin saada sĂŒsteemis tĂ€ielikku suhtlemisgraafi. Kuid kui teie sĂŒsteem on piisavalt koormatud ja ĂŒhe pĂ€eva jooksul koguneb miljardite tracing span'ide arv, siis nende agregatsioon ei ole enam lihtne ĂŒlesanne. Selleks on ametlik viis: spark-dependencies. Siiski vĂ”ib selle tĂ€ieliku graafi koostamine vĂ”tta tunde ja sunnib teid alla laadima kogu jaotuse Jaegerist viimase 24 tunni kohta.

Kui kasutate tracing span'ide salvestamiseks Elasticsearch'i, siis saate kasutada lihtsat utiliiti Golang'is, mis koostab sarnase graafi minutitega, kasutades Elasticsearch'i omadusi ja vÔimalusi.

Netramesh – kergekaaluline teenuste mesh lahendus

Kuidas kasutada Netrameshi

Netra saab lihtsalt lisada igale teenusele, mis töötab mis tahes orkestratori haldusel. VÔite vaadata nÀidet siit.

Hetkel ei pakku Netra automaatset sidumise vÔimalust teenustele, kuid plaanid selle rakendamiseks on olemas.

Netrameshi tulevik

Peamine eesmÀrk Netramesh on saavutada minimaalne ressursikasutus ja kÔrge sooritusvÔime, pakkudes pÔhifunktsioone observability ja teenustevahelise suhtlemise kontrollimiseks.

Tulevikus toetab Netramesh lisaks HTTP-le ka teisi rakendusprotokolle. Varsti tuleb vÀlja L7 suunamine.

Kasutage Netrameshi, kui seisate silmitsi sarnaste probleemidega, ja saatke meile oma kĂŒsimused ja ettepanekud.

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