Eelmises osas uurisime Service Mesh'i Istio pĂ”hikomponente, tutvustasime sĂŒsteemi ja vastasime pĂ”hilistele kĂŒsimustele, mis tavaliselt tĂ”usevad esile Istio kasutamise alguses. Selles osas vaatame, kuidas korraldada tracing teabe kogumist vĂ”rgus.

Esimene mĂ”te, mis paljudele arendajatele ja sĂŒsteemiadministraatoritele tuleb, kui nad kuulevad sĂ”nu Service Mesh, on tracing. Ja tĂ”epoolest, me paigaldame igasse vĂ”rgu sĂ”lme spetsiaalse pöördproksi, mille kaudu lĂ€bib kogu TCP-liiklus. Tundub, et nĂŒĂŒd on lihtne edastada teavet kĂ”igi vĂ”rgutehingute kohta. Kahjuks ilmnevad reaalsuses palju nĂŒansse, mida tuleb arvesse vĂ”tta. Vaatame neid.
Eksimus number ĂŒks: me saame tasuta andmeid vĂ”rguĂŒlekannete kohta
Tegelikult saame suhteliselt tasuta jĂ€lgida ainult meie sĂŒsteemi ĂŒhendatud sĂ”lmede ja andmete mÀÀra, mis liigub teenuste vahel (sisuliselt - vaid baitide arv ajaĂŒhikus). Enamiku juhtudel suhtlevad meie teenused mĂ”ne rakendusprotokolli kaudu, nĂ€iteks HTTP, gRPC, Redis jne. Ja loomulikult soovime nĂ€ha jĂ€lgimise teavet just nende protokollide osas, soovime nĂ€ha pĂ€ringute mÀÀra, mitte andmete mÀÀra. Soovime mĂ”ista pĂ€ringute latentsust meie protokolli kaudu. LĂ”puks tahame nĂ€ha tĂ€pset teed, mida pĂ€ring lĂ€bib meie sĂŒsteemi sisenemisest kuni vastuse saamiseni kasutaja poolt. See ĂŒlesanne ei ole enam nii lihtne.
Alustamiseks vaatame, kuidas nĂ€eb tracing spanide saatmine vĂ€lja Istio arhitektuuri vaatepunktist. Nagu me mĂ€letame esimesest osast, on Istio'l telemeetria kogumiseks eraldi komponent nimega Mixer. Kuid praeguses versioonis 1.0.* toimub saatmine otse proksi serverite, st envoy proksi kaudu. Envoy proksi toetab tracing spanide saatmist zipkini protokolli kaudu vĂ€lja tootepakendis. Teisi protokolle on vĂ”imalik lisada, kuid ainult plugina kaudu. Istio muretses meile kohe kogutud ja seadistatud envoy proksi, milles toetatakse ainult zipkini protokolli. Kui soovime kasutada nĂ€iteks Jaeger protokolli ja saata tracing spanâe UDP kaudu, peame ise koguma oma istio-proxy pildi. Kohandatud pluginate tugi istio-proxyle on olemas, kuid see on endiselt alfa versioonis. SeetĂ”ttu, kui soovime toime tulla ilma paljude kohandatud seadistusteta, vĂ€heneb tehnoloogiate valik tracing spanide salvestamiseks ja vastuvĂ”tmiseks. Peamisi sĂŒsteeme, mida praegu kasutada, on tegelikult zipkin vĂ”i jaeger, kuid kĂ”ik tuleb saata zipkiniga ĂŒhilduva protokolli kaudu (mis on oluliselt vĂ€hem efektiivne). Ise zipkini protokoll eeldab kogu tracing teabe saatmist kollektoritele HTTP protokolli kaudu, mis on ĂŒsna kulukas.
Nagu juba ĂŒtlesin, tahame jĂ€lgida rakendusprotokolle. See tĂ€hendab, et iga teenuse kĂ”rval olevad proxy-serverid peavad mĂ”istma, milline suhtlus hetkel toimub. Vaikimisi mÀÀrab Istio kĂ”igile portidele plain TCP tĂŒĂŒbi, mis tĂ€hendab, et jĂ€lgimisi ei saadeta. JĂ€lgimiste saatmiseks tuleb kĂ”igepealt see vĂ”imalus peameses mesh konfiguratsioonis aktiveerida ja mis on vĂ€ga oluline, nimetada kĂ”ik portide kubernetes teenuste ĂŒksuste nimed vastavalt teenuses kasutatavatele protokollidele. NĂ€iteks nii:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
targetPort: 80
name: http
selector:
app: nginxSamuti saab kasutada komposiitnimesid, nÀiteks http-magic (Istio nÀeb http ja tuvastab selle pordi http lÔpp-punktina). Formaat on jÀrgmine: proto-extra.
Kuna tohutu hulga seadistuste muutmine protokolli mÀÀramiseks oleks liiga keeruline, saab kasutada mÀÀrdunud lahendust: patchida Pilot komponenti hetkel, kui see . LÔpuks tuleb see loogika loomulikult muuta tavalisele ja liikuda kÔikide portide nimeteemade konventsiooni.
Kuna tahate aru saada, kas protokoll on tĂ”epoolest Ă”igesti mÀÀratletud, peate minema mĂ”nele sidecar konteinerile koos envoy proxy'ga ja tegema pĂ€ringu envoy'i admini liidese pordile aadressil /config_dump. Saadud konfigureerimises tuleb vaadata vajalikus teenuses vĂ€li operation. Seda kasutatakse Istios kui identifikaator, kuhu pĂ€ring suunatakse. Selle parameetri vÀÀrtuse kohandamiseks Istios (mida me siis oma jĂ€lgimissĂŒsteemis nĂ€eme) on vajalik sidecar konteineri kĂ€ivitamisel mÀÀrata lipp serviceCluster. NĂ€iteks vĂ”ib seda arvutada kubernetes'e allapoole suunatud API saadud muutujatest.
--serviceCluster ${POD_NAMESPACE}.$(echo ${POD_NAME} | sed -e 's/-[a-z0-9]*-[a-z0-9]*$//g')
Hea nÀide aru saamiseks, kuidas jÀlgimine envoy's töötab, on .
Endpointhi, kuhu saatmise jÀlgimise span'id tuleb samuti mÀÀratleda envoy proxy kÀivitamise lippudes, nÀiteks: --zipkinAddress tracing-collector.tracing:9411
Teine eksitus: me saame odavalt saada tĂ€is jĂ€lgimisi pĂ€ringute lĂ€bimisest sĂŒsteemis kohe.
Kahjuks ei ole see nii. Rakendamise keerukus sÔltub sellest, kuidas teil on juba teenuste vaheline suhtlus korraldatud. Miks see nii on?
Asi on selles, et istio-proxy jaoks on vajalik, et see mÔistaks sissetulevate pÀringute vastavust teenusest vÀljaminevatele pÀringutele, mitte ei piirduda lihtsalt kogu liikluse haaramisega. Peab olema mingi seose identifikaator. HTTP envoy proxy kasutab spetsiaalseid pÀiseid, mille abil envoy mÔistab, milline pÀring teenusele pÔhjustab konkreetseid pÀringuid teistesse teenustesse. Nende pÀiste nimekiri on jÀrgmine:
- x-request-id,
- x-b3-traceid,
- x-b3-spanid,
- x-b3-parentspanid,
- x-b3-sampled,
- x-b3-flags,
- x-ot-span-context.
Kui teil on ĂŒhtne punkt, nĂ€iteks pĂ”hiklient, kuhu sellist loogikat lisada, siis on kĂ”ik suurepĂ€rane, peate lihtsalt ootama selle raamistiku vĂ€rskendamist kĂ”igis klientides. Kuid kui teil on vĂ€ga heterogeenne sĂŒsteem ja puudub teenuste vahelise suhtluse osas ĂŒhtsus, siis vĂ”ib see tĂ”enĂ€oliselt olla suur probleem. Ilma selle loogika lisamiseta jÀÀb kogu jĂ€lgimisinfo lihtsalt "ĂŒhe taseme". See tĂ€hendab, et saame kĂ”ik teenustevahelised suhtlused, kuid need ei ole seotud ĂŒhte vĂ”rgu kaudu kulgemise ahelasse.
KokkuvÔte
Istio pakub mugavat tööriista tracing teabe kogumiseks vĂ”rgus, kuid tuleb mĂ”ista, et selle rakendamiseks on vajalik oma sĂŒsteemi kohandamine ja Istio rakendamise eripĂ€ra arvestamine. LĂ”puks tuleb lahendada kaks peamist kĂŒsimust: rakendustaseme protokolli mÀÀratlemine (mida peab toetama envoy proxy) ja teabe edastamise seadistamine teenusesse tulevate pĂ€ringute ja teenusevaheliste pĂ€ringute vahel (kasutades pĂ€iseid, juhul kui protokolliks on HTTP). Kui need kĂŒsimused on lahendatud, saame vĂ”imsa tööriista, mis vĂ”imaldab sujuvalt koguda teavet vĂ”rgus isegi vĂ€ga heterogeensetes sĂŒsteemides, kirjutatud mitmesugustes keeltes ja raamistikudes.
JĂ€rgmisel artiklil Service Mesh teemal kĂ€sitleme ĂŒhte suurimat probleemi Istio puhul â iga sidecar proxy konteineri suur mĂ€lu kasutus ja arutame, kuidas sellega vĂ”idelda.
Allikas: habr.com
