Teenuste vÔrk, "Andmete tasand" ja "Juhtimis tasand" (Service mesh data plane vs. control plane)

Tere, Habr! Esitlen teile tĂ”lget artiklist „Teenuste vĂ”rkude andmeplaan vs juhtimiplaneer“ autor Matt Klein.

Teenuste vÔrk, "Andmete tasand" ja "Juhtimis tasand" (Service mesh data plane vs. control plane)

Seekord „soovisin ja tĂ”lkisin“ mĂ”lema teenuste vĂ”rgu komponente, andmeplaani ja juhtimiplaneerimist. See kirjeldus tundus mulle kĂ”ige arusaadavam ja huvitavam, ning mis kĂ”ige tĂ€htsam, viib arusaamiseni „Kas see on ĂŒldse vajalik?“

Kuna idee „teenuste vĂ”rgust (service mesh)“ on viimase kahe aasta jooksul ĂŒha populaarsemaks muutunud (originaalartikkel 10. oktoobrist 2017), ja osalejate arv selles valdkonnas on kasvanud, olen mĂ€rganud, et kogu tehnilises kogukonnas on tekkinud rohkem segadust selle ĂŒle, kuidas erinevaid lahendusi vĂ”rrelda ja vastandada.

Oma olukorda on kÔige parem kirjeldada jÀrgmiste tweetide seeriaga, mille kirjutasin juulis:

Teenuste vĂ”rgu (service mesh) segadus nr 1: Linkerd ~ = Nginx ~ = Haproxy ~ = Envoy. Ükski neist ei ole vĂ”rdne Istio'ga. Istio on midagi hoopis muud. 1 /

Esimesed on lihtsalt andmeplaanid (data planes). Üksinda ei tee nad midagi. Need peavad olema konfigureeritud millekski enamaks. 2 /

Istio on nÀide juhtimiplaneerist (control plane), mis seob osad omavahel. See on erinev kiht. /lÔpp

Varasemates tweetides mainitakse mitmeid erinevaid projekte (Linkerd, NGINX, HAProxy, Envoy ja Istio), kuid mis on veel olulisem, tutvustatakse ĂŒldisi mĂ”isteid andmeplaani (data plane), teenuste vĂ”rgu (service mesh) ja juhtimiplaneerimise (control plane) kohta. Selles postituses astun sammu tagasi ja rÀÀgin, mida mĂ”tlen terminite „andmeplaan (data plane)“ ja „juhtimiplaneer (control plane)“ all vĂ€ga kĂ”rgel tasemel, ning seejĂ€rel rÀÀgin, kuidas need terminid seonduvad tweetides mainitud projektidega.

Mis on teenuste vÔrk (What is a service mesh, really)?

Teenuste vÔrk, "Andmete tasand" ja "Juhtimis tasand" (Service mesh data plane vs. control plane)
Joonis 1: Teenuste vĂ”rgu ĂŒlevaade (Service mesh overview)

Joonis 1 illustreerib teenuste vĂ”rgu (service mesh) kontseptsiooni kĂ”ige pĂ”hialustel. On neli teenuste klastrit (A-D). Iga teenuse eksemplar on seotud kohaliku proksiserveriga. Kogu vĂ”rgu liiklus (HTTP, REST, gRPC, Redis jne) eraldi rakenduse eksemplarist suunatakse kohaliku proksiserveri kaudu vastavatesse vĂ€listesse teenuste klastritesse. Seega ei tea rakenduse eksemplar vĂ”rgustiku ĂŒldisest toimimisest, vaid ainult oma kohalikust proksist. Tegelikult on jaotatud sĂŒsteemi vĂ”rk teenusest eemaldatud.

Andmeplaan (Data plane)

Teenuste vĂ”rgus (service mesh) tĂ€idab kohaliku proksiserveri rakenduse jaoks jĂ€rgmisi ĂŒlesandeid:

  • Teenuste avastamine (Service discovery). Millised teenused/teenused/rakendused on teie rakendusele saadaval?
  • Tervise kontrollimine (Health checking). Kas teenuste eksemplarid, mida teenuste avastamine (service discovery) tagastab, on toimivad ja valmis vĂ”rguliiklust vastu vĂ”tma? See vĂ”ib hĂ”lmata nii aktiivset (nt vastuse kontrollimine / healthcheck) kui ka passiivset (nt kolme jĂ€rjestikuse 5xx vea kasutamist teenuse ebatervislikuks seisundiks nĂ€itamiseks) tervise kontrollimist.
  • Suunamine (Routing). Kui REST teenus on saanud pĂ€ringu „/foo”, siis millisesse teenuste klastrisse tuleks pĂ€ring edastada?
  • Koormuse tasakaalustamine (Load balancing). PĂ€rast teenuste klastri valimist suunamise kĂ€igus, millisele teenuse eksemplarile peaks pĂ€ring olema edastatud? Millise ooteajaga? Milliste hĂ€irekatkestuse (circuit breaking) seadistustega? Kui pĂ€ring ebaĂ”nnestub, kas seda tuleks korrata?
  • Ahnitsemine ja autoriseerimine (Authentication and authorization). Kas sissetulevate pĂ€ringute korral saab kutsuv teenus krĂŒptograafiliselt tuvastada/autoriseerida mTLS-i vĂ”i mĂ”ne muu mehhanismi abil? Kui see on tuvastatud/autoriseeritud, kas tal on lubatud teha soovitud toiming (endpoint) teenuses vĂ”i tuleb tagastada mitteautentseeritud vastus?
  • JĂ€lgitavus (Observability). Iga pĂ€ringu puhul peaks olema genereeritud ĂŒksikasjalikud statistikaandmed, logid ja jaotatud jĂ€lgimisandmed, et operaatorid saaksid mĂ”ista jaotatud liiklusvoogu ning tĂ”rkeotsinguprobleeme nende ilmnemisel.

KÔik eelnevad punktid teenuste vÔrgus (service mesh) on seotud andmete tasandi (data plane) funktsioonidega. Sisuliselt on teenusele kohalik (sidecar) proksid andmete tasand. TeisisÔnu, andmete tasand (data plane) vastutab igasuguse kommunikatsiooni, edastamise ja jÀlgimise eest, mis toimub teenusele suunatud vÔi sealt saadetud vÔrgu pakettide osas.

Juhtimis- ja kontrollitase (The control plane)

VĂ”rguekraansus, mille lokaliseeritud proksi pakub andmete plaanis, on maagiline (?). Kuid kuidas proksi-server tegelikult teada saab marsruudi «/foo» suunas teenusele B? Kuidas saab kasutada teenuse avastamise andmeid, mis tĂ€idetakse proksi-pĂ€ringutega? Kuidas on seadistatud koormuse tasakaalustamise, ajaĂŒlempiiri, ahelakatkestuse jne parameetrid? Kuidas rakendatakse jagatud rakenduse juurutamist sinise/rohelise meetodi vĂ”i jĂ€rkjĂ€rgulise liikluse suunamise meetodi kaudu? Kes seadistab kĂ”igisĂŒsteemite autentimise ja autoriseerimise parameetrid?

KĂ”ik ĂŒlalnimetatud punktid kuuluvad teenusevĂ”rgu (service mesh) juhtimistasandi (control plane) alla. Juhtimistasand (control plane) vĂ”tab rikka kogumi isoleeritud proksi-serverid ilma seisundita ja muudab need jaotatud sĂŒsteemiks.

Ma arvan, et pĂ”hjus, miks paljud tehnoloogid leiavad andmete plaani (data plane) ja juhtimistasandi (control plane) kontseptsioonid segadusse puutuvad, on see, et suurusele inimese plaan on tuttav, samas kui juhtimistasand on vÔÔras/raske mĂ”ista. Me oleme juba pikka aega töötanud fĂŒĂŒsiliste vĂ”rgu marsruuteritega ja lĂŒlititega. Me saame aru, et paketid/pĂ€ringud peavad liikuma punktist A punkti B ja mis me vĂ”ime selleks riist- ja tarkvara abil kasutada. Uue pĂ”lvkonna tarkvaraliseks proksiks on lihtsalt moekad versioonid tööriistadest, mida oleme juba pikka aega kasutanud.

Teenuste vÔrk, "Andmete tasand" ja "Juhtimis tasand" (Service mesh data plane vs. control plane)
Joonis 2: Inimese juhtimistasand (Human control plane)

Kuid oleme juba pikka aega kasutanud juhtimistasandeid (control plane), ehkki enamik vĂ”rguoperaatoreid ei pruugi seostada seda sĂŒsteemi osa konkreetse tehnilise komponendiga. Selle pĂ”hjuseks on lihtne:
Enamik tÀna kasutatavaid juhtimistasandeid (control plane) on... me.

Pealehe jooniselt 2 NĂ€idatakse seda, mida ma nimetan „Inimese juhtimispinnaks (Human control plane)“. Selles tĂŒĂŒpi seadistuses, mis on endiselt vĂ€ga levinud, loob inimene-operaator, ilmselt Ă€rritunu, staatilisi konfiguratsioone — potentsiaalselt skriptide kaudu — ja rakendab neid mĂ”ne spetsiaalse protsessi abil kĂ”ikidele vahetusserveritele. SeejĂ€rel hakkavad vahetusserverid kasutama seda konfiguratsiooni ja asuvad töötlema andmepinda (data plane) uuendatud seadistuste abil.

Teenuste vÔrk, "Andmete tasand" ja "Juhtimis tasand" (Service mesh data plane vs. control plane)
Joonis 3: TÀiendav teenuste vÔrgu juhtimispind (Advanced service mesh control plane)

Pealehe joonisel 3 on kujutatud „tĂ€iendav“ juhtimispind (control plane) teenuste vĂ”rgus (service mesh). See koosneb jĂ€rgmistest osadest:

  • Inimene (The human): Kuller on endiselt inimene (loodetavasti vĂ€hem Ă€rritunud), kes teeb kĂ”rgetasemelisi otsuseid kogu sĂŒsteemi kohta.
  • Juhtimispinna kasutajaliides (Control plane UI): Inimene suhtleb mingi kasutajaliidese tĂŒĂŒbiga sĂŒsteemi haldamiseks. See vĂ”ib olla veebipood, kĂ€surea rakendus (CLI) vĂ”i muu liides. Kasutajaliidese kaudu on operaatoril juurdepÀÀs sellistele globaalsetele sĂŒsteemi konfiguratsiooniparametritele nagu:
    • KĂ€ivitamise haldamine, sinine/roheline (blue/green) ja/vĂ”i jĂ€rk-jĂ€rguline liikluse suunamine
    • Autentimise ja volitamise seadistused
    • Rohundustabeli spetsifikatsioonid, nĂ€iteks mis juhtub, kui rakendus A kĂŒsib teavet „/foo“
    • Laie tasakaalustaja seadistused, nĂ€iteks aegumise (timeouts), taasilmimise (retries), ahelakatkestuse (circuit breaking) parameetrid jne.
  • Töökoormuse planeerija (Workload scheduler): Teenused kĂ€ivitatakse infrastruktuuris teatud tĂŒĂŒpi planeerimis-/orkestreerimissĂŒsteemi kaudu, nĂ€iteks Kubernetes vĂ”i Nomad. Planeerija vastutab teenuse koormuse ja kohaliku vahetusserveri koormuse laadimise eest.
  • Teenuse avastamine (Service discovery). Kui planeerija kĂ€ivitab ja peatab teenuse eksemplare, teavitab ta teenuse avastamissĂŒsteemi töökorrasolekust.
  • Kohaliku vahetusserveri konfiguratsioon API-d (Sidecar proxy configuration APIs) : Kohalikud proxiserverid vĂ”tavad sĂŒsteemi erinevate komponentide seisundi dĂŒnaamiliselt, jĂ€rgides mudelit "lĂ”plikult ĂŒhtne" (eventually consistent) ilma operaatori osaluseta. Kogu see sĂŒsteem, mis koosneb hetkel kĂ€ivitatud teenuste ja kohalike proxiserverite instantsidest, jĂ”uab lĂ”puks ĂŒhte ökosĂŒsteemi. Universaalse andmeplaani (data plane) API Envoy's on ĂŒks nĂ€ide, kuidas see praktikas töötab.

Sisuliselt on juhtimistasandi (control plane) eesmĂ€rk kehtestada poliitika, mis lĂ”puks vĂ”etakse vastu andmeplaani (data plane) poolt. TĂ€iustatud juhtimistasandid (control plane) eemaldavad operaatori kĂ€est rohkem ĂŒksikasju teatud sĂŒsteemide kohta ja nĂ”uavad vĂ€hem kĂ€sitsi sekkumist, tingimusel et need töötab Ă”igesti!..

Andmeplaanid ja juhtimistasandid. KokkuvÔte (Data plane vs. control plane summary)

  • Teenuse vĂ”rgu andmeplaan (Service mesh data plane): kĂ€sitleb iga paketti / pĂ€ringut sĂŒsteemis. Vastutab rakenduste/teenuste avastamise, töökindluse kontrollimise, marsruutimise, koormuse tasakaalustamise, autentimise / autoriseerimise ja jĂ€lgimise eest.
  • Teenuse vĂ”rgu juhtimistasand (Service mesh control plane): pakub poliitikat ja konfiguratsiooni kĂ”igile töötavatele andmeplaanidele teenuse vĂ”rgus. Ei puutu mingite pakkide / pĂ€ringutega sĂŒsteemis. Juhtimistasand muudab kĂ”ik andmeplaanid jaotatud sĂŒsteemiks.

Praegune projekti seis (Current project landscape)

MÔistes eelnevat selgitust, vaatame projekti "teenuse vÔrgu (service mesh)" praegust seisu.

  • Andmeplaanid (Data planes): Linkerd, NGINX, HAProxy, Envoy, Traefik
  • Juhtimistasandid (Control planes): Istio, Nelson, SmartStack

Kuna ei ole mĂ”tet sĂŒvitsi analĂŒĂŒsida iga eeltoodud lahendust, tahan lĂŒhidalt peatuda mĂ”ningatel punktidel, mis, minu arvates, tekitavad praegu ökosĂŒsteemis kĂ”ige rohkem segadust.

2016. aasta alguses oli Linkerd ĂŒks esimesi andmeplaani (data plane) vĂ”tmeproksi teenusevĂ”rgus (service mesh) ning tegi fantastilist tööd teenusevĂ”rgu (service mesh) kavandamismudeli teadlikkuse tĂ”stmisel. Umbes kuus kuud hiljem liitus Envoy Linkerdiga (kuigi töötas Lyftis juba 2015. aasta lĂ”pust). Linkerd ja Envoy on need kaks projekti, mida kĂ”ige sagedamini mainitakse teenusevĂ”rkude (service mesh) aruteludes.

Istio kuulutati vĂ€lja 2017. aasta mai. Istio projekti eesmĂ€rgid on vĂ€ga sarnased laiendatud juhtimisplaaniga (control plane), nagu on nĂ€idatud joonisel 3. Envoy on Istio jaoks vaikimisi vĂ”tmeproksi. Seega on Istio juhtimisplaan (control plane) ja Envoy andmeplaan (data plane). LĂŒhikese ajaga tekitas Istio palju elevust ning teised andmeplaanid (data plane) hakkasid integreeruma Envoy asendamiseks (nii Linkerd kui NGINX on demonstreerinud integreerimist Istiosse). See, et ĂŒhes juhtimisplaanis (control plane) saab kasutada erinevaid andmeplaanid (data plane), tĂ€hendas, et juhtimisplaan (control plane) ja andmeplaan (data plane) ei pruugi olla tihedalt seotud. Selline API nagu universaalne andmeplaani (data plane) API Envoy vĂ”ib luua silda kahe sĂŒsteemi osa vahel.

Nelson ja SmartStack aitavad veelgi illustreerida juhtimisplaani (control plane) ja andmeplaani (data plane) eraldatust. Nelson kasutab Envoyd oma proksina ja loob usaldusvÀÀrse teenusevĂ”rgu (service mesh) juhtimisplaani (control plane) HashiCorpi steki baasil, st Nomad jne. SmartStack on tĂ”enĂ€oliselt esimene uus laine teenusevĂ”rkudest (service mesh). SmartStack loob juhtimisplaani (control plane) HAProxy vĂ”i NGINXi ĂŒmber, demonstreerides teenusevĂ”rgu (service mesh) juhtimisplaani (control plane) ja andmeplaani (data plane) eraldamise vĂ”imalust.

Mikroteenuse arhitektuur teenuste vĂ”rgustikuga (service mesh) tĂ”mbab ĂŒha rohkem tĂ€helepanu (Ă”igesti!), ja ĂŒha rohkem projekte ja tarnijaid hakkavad selles suunas töötama. JĂ€rgnevatel aastatel nĂ€eme palju uuendusi nii andmeplaanides (data plane) kui ka juhtimisplaanides (control plane), samuti erinevate komponentide edasist segamist. LĂ”ppkokkuvĂ”ttes peab mikroteenuse arhitektuur saama lĂ€bipaistvamaks ja maagilisemaks (?) operaatori jaoks.
Loodan, et kÔik on jÀrjest vÀhem hÀiritud.

Peamised punktid (Key takeaways)

  • Teenuste vĂ”rgustik (service mesh) koosneb kahest erinevast osast: andmeplaan (data plane) ja juhtimisplaan (control plane). MĂ”lemad komponendid on kohustuslikud, ja ilma nendeta sĂŒsteem ei töötaks.
  • KĂ”ik on tuttavad juhtimisplaaniga (control plane), ja seni vĂ”ib juhtimisplaan olla teie!
  • KĂ”ik andmeplaanid (data plane) konkureerivad omavahel funktsioonide, tootlikkuse, konfigureeritavuse ja skaleeritavuse poolest.
  • KĂ”ik juhtimisplaanid (control plane) konkureerivad omavahel funktsioonide, konfigureeritavuse, skaleeritavuse ja kasutusmugavuse poolest.
  • Üks juhtimisplaan (control plane) vĂ”ib sisaldada Ă”igeid abstraktsioone ja API-sid, et kasutada mitmeid andmeplaane (data plane).

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