Obs. övers.: Service mesh â ett fenomen som Ă€nnu inte har en etablerad översĂ€ttning till svenska (för över 2 Ă„r sedan föreslog vi termen âtjĂ€nstenĂ€tâ, och senare började nĂ„gra kollegor aktivt promota kombinationen âtjĂ€nstfilterâ). De stĂ€ndiga diskussionerna kring denna teknik har lett till en situation dĂ€r marknadsföring och teknisk aspekt har blivit alltför sammanvĂ€vda. Denna fantastiska artikel av en av skaparna av det ursprungliga begreppet syftar till att klargöra för ingenjörer och andra.

Comic by
Introduktion
Om du Ă€r en mjukvaruingenjör som arbetar nĂ„gonstans i nĂ€rheten av backend-system, Ă€r termen âservice meshâ troligtvis redan djupt rotad i ditt medvetande under de senaste Ă„ren. Tack vare en mĂ€rklig slump av omstĂ€ndigheterna fĂ„ngar denna fras alltmer uppmĂ€rksamhet i branschen, och hypen och de tillhörande reklamerna vĂ€xer som en snöboll som rullar nerför en backe och visar inga tecken pĂ„ att sakta ner.
Service mesh föddes i de grumliga, partiska vattnen i cloud native-ekosystemet. TyvĂ€rr innebĂ€r detta att en stor del av den relaterade debatten varierar frĂ„n âlĂ„gkalorisk pratâ till â för att anvĂ€nda en teknisk term â ren galenskap. Men om man filtrerar bort alla buller kan man upptĂ€cka att service mesh har en helt verklig, bestĂ€md och viktig funktion.
I den hĂ€r publikationen kommer jag att försöka göra just det: ge en Ă€rlig, djupgĂ„ende, ingenjörsorienterad vĂ€gledning om service mesh. Jag tĂ€nker svara pĂ„ inte bara frĂ„gan: âVad Ă€r det?â, â utan ocksĂ„ âVarför?â, samt âVarför just nu?â. Slutligen kommer jag att försöka skissa pĂ„ varför (enligt min mening) just denna teknik har orsakat sĂ„dan galen uppstĂ„ndelse, vilket i sig Ă€r en intressant historia.
Vem Àr jag?
Hej allihopa! Jag heter . Jag Ă€r en av skaparna av â det första service mesh-projektet och projektet som ligger bakom att termen kom till service mesh som sĂ„dan (ursĂ€kta, grabbar!). (För övrigt.: För att nĂ€mna, vid tidpunkten för detta termes uppkomst, för över 2,5 Ă„r sedan, översatte vi redan tidigt material av samma författare med titeln â».) Jag leder ocksĂ„ â en startup som skapar sĂ„dana coola service mesh-grejer som Linkerd och .
Du kanske kan gissa att jag har en ganska partisk och subjektiv Ă„sikt i denna frĂ„ga. Men jag ska försöka hĂ„lla tendensen till ett minimum (med undantag för en sektion: âVarför sĂ„ mĂ„nga samtal om service mesh?â, â dĂ€r jag Ă€ndĂ„ kommer att dela med mig av mina partiska idĂ©er). Jag kommer ocksĂ„ att göra mitt bĂ€sta för att göra den hĂ€r guiden sĂ„ objektiv som möjligt. NĂ€r jag ger specifika exempel kommer jag huvudsakligen att förlita mig pĂ„ erfarenheterna frĂ„n Linkerd, samtidigt som jag pekar pĂ„ kĂ€nda skillnader (om sĂ„dana finns) i implementationen av andra typer av service mesh.
Okej, dags att gÄ över till det smakliga.
Vad Àr en service mesh?
Ăven om det finns mycket hype, Ă€r service mesh strukturellt ganska enkelt. Det Ă€r bara en uppsĂ€ttning anvĂ€ndarproxyer som ligger "nĂ€ra" tjĂ€nsterna (vi kommer att diskutera vad "nĂ€ra" betyder lite senare), plus en uppsĂ€ttning hanteringsprocesser. Proxyerna kallas tillsammans för data plane, och hanteringsprocesserna kallas control plane. Data plane fĂ„ngar upp anrop mellan tjĂ€nster och gör "olika saker" med dem; control plane koordinerar beteendet hos proxyerna och ger dig, det vill sĂ€ga operatören, tillgĂ„ng till API:et sĂ„ att du kan manipulera nĂ€tverket och mĂ€ta det som en helhet.

Vad Ă€r dessa proxyer? Det Ă€r TCP-proxyer av kategorin âLayer 7-awareâ (dvs. som âtar hĂ€nsyn tillâ lager 7 i OSI-modellen) sĂ„som HAProxy och NGINX. Du kan vĂ€lja proxy efter smak; Linkerd anvĂ€nder en proxy i Rust, enkelt kallad . Vi har byggt den speciellt för service mesh. Andra mesh-alternativ föredrar andra proxyer (Envoy Ă€r ett vanligt val). Men valet av proxy Ă€r bara en frĂ„ga om implementering.
Vad gör dessa proxyservrar? SjÀlvklart, de proxyar anrop till och frÄn tjÀnster (strikt taget fungerar de bÄde som proxy och omvÀnd proxy, vilket hanterar bÄde inkommande och utgÄende anrop). Och de implementerar en uppsÀttning funktioner som fokuserar pÄ anrop mellan tjÀnster. Denna fokusering pÄ trafik mellan tjÀnster skiljer service mesh-proxyerna frÄn, sÀg, API-gateways eller ingress-proxyer (de senare fokuserar pÄ anrop som kommer in i klustret frÄn omvÀrlden). (Obs. övers.: för en jÀmförelse av befintliga Ingress-kontrollerare för Kubernetes, mÄnga av vilka anvÀnder den redan nÀmnda Envoy, se .)
SÄ, vi har förstÄtt data plane. Control plane Àr enklare: det Àr en uppsÀttning komponenter som sÀkerstÀller all mekanik som behövs för att data plane ska fungera koordinerat, inklusive tjÀnstupptÀckter, utfÀrdande av TLS-certifikat, aggregering av mÀtvÀrden, osv. Data plane informerar control plane om sitt beteende; i sin tur tillhandahÄller control plane ett API som gör det möjligt att Àndra och övervaka beteendet hos data plane som en enhet.
Nedan visas diagrammet för control plane och data plane i Linkerd. Som man kan se inkluderar control plane flera olika komponenter, inklusive en instans av Prometheus som samlar in mÀtvÀrden frÄn proxyservrar, samt andra komponenter som destination (tjÀnstupptÀckter), identity (certifikatutfÀrdare, CA) och public-api (Àndpunkter för webben och CLI). I motsats till detta Àr data plane en enkel linkerd-proxy bredvid applikationsinstansen. Detta Àr bara ett logiskt diagram; i praktiken, vid distribution kan du ha tre repliker av varje komponent i control plane och hundratals eller tusentals proxies i data plane.
(De blÄ rektanglarna i detta diagram symboliserar grÀnserna för Kubernetes-poddar. Det Àr uppenbart att containrar med linkerd-proxy finns i samma podd som applikationscontainrar. En sÄdan konfiguration kallas för sidecar-container.)

Arkitekturen för service mesh har flera viktiga konsekvenser. För det första, eftersom proxyernas uppgift Àr att fÄnga anrop mellan tjÀnster, Àr service mesh meningsfullt endast om din applikation byggdes pÄ en uppsÀttning tjÀnster. Mesh kan anvÀndas med monoliter, men det Àr uppenbart överflödigt för en enda proxy, och funktionaliteten kommer troligtvis inte att efterfrÄgas.
En annan viktig konsekvens Àr att service mesh krÀver ett stort antal proxies. Faktum Àr att Linkerd kopplar linkerd-proxy till varje instans av varje tjÀnst (andra implementationer lÀgger till proxyer till varje nod/vÀrd/virtuell maskin. I vilket fall som helst, det Àr inte lite). Denna aktiva anvÀndning av proxies i sig medför en rad ytterligare komplikationer:
- Proxyn i data plane mÄste vara snabba, eftersom varje anrop innebÀr ett par anrop till proxyn: ett pÄ klientsidan, ett pÄ serversidan.
- Proxyn mÄste ocksÄ vara smÄ och och lÀttviktiga.. Varje proxy kommer att konsumera minnes- och CPU-resurser, och denna konsumtion kommer att öka linjÀrt med applikationen.
- Du kommer att behöva en mekanism för att distribuera och uppdatera ett stort antal proxyer. Att göra detta manuellt Àr inget alternativ.
Generellt ser en service mesh ut sÄ hÀr (minst sagt uppifrÄn och ned): du distribuerar en massa userspace-proxyer som "gör nÄgot" med intern, interservice trafik och anvÀnder control plane för att övervaka och hantera dem.
Det Àr dags att stÀlla frÄgan "Varför?"
Vad behöver en service mesh egentligen?
För dem som stöter pÄ tanken om service mesh för första gÄngen Àr det förstÄeligt att kÀnna en lÀtt nervositet. Konstruktionen av en service mesh innebÀr att den inte bara kommer att öka fördröjningen i applikationen, utan ocksÄ konsumerar resurser och lÀgger till en massa nya mekanismer i infrastrukturen. Först installerar du service mesh och plötsligt upptÀcker du att du mÄste hantera hundratals (om inte tusentals) proxyer. FrÄgan Àr, vem vill göra det frivilligt?
Svaret pÄ denna frÄga bestÄr av tvÄ delar. För det första kan driftkostnaderna relaterade till distributionen av dessa proxyer avsevÀrt minskas tack vare vissa förÀndringar som sker i ekosystemet (mer om detta senare).
För det andra Àr en sÄdan enhet faktiskt ett utmÀrkt sÀtt att införa ytterligare logik i systemet. Och inte bara för att det gÄr att lÀgga till mÄnga nya funktioner med hjÀlp av service mesh, utan ocksÄ för att detta kan göras utan att störa ekosystemet. Faktum Àr att hela modellen för service mesh bygger pÄ denna postulat: i ett flerservice-system, oavsett vad gör de enskilda tjÀnsterna, Àr trafiken mellan dem en perfekt punkt för att lÀgga till funktionalitet.
Till exempel i Linkerd (liksom i de flesta mesh-system) Àr funktionaliteten frÀmst fokuserad pÄ HTTP-anrop, inklusive HTTP/2 och gRPC*. Funktionaliteten Àr ganska riklig - den kan delas in i tre klasser:
- Funktioner relaterade till tillförlitlighet. à terkoppling, tidsgrÀnser, kanariefÄgelsmetoden (fördelning/omdirigering av trafik) etc.
- Funktioner relaterade till övervakning.Aggregering av framgÄngsmÄtt, fördröjningar och begÀrningsvolymer för varje tjÀnst eller specifika riktningar; byggande av topologiska kartor över tjÀnster etc.
- Funktioner relaterade till sÀkerhet. Mutual TLS, Ätkomstkontroll etc.
* Ur Linkerd-synpunkt skiljer sig gRPC praktiskt taget inte frÄn HTTP/2: det Àr bara i nyttolasten som protobuf anvÀnds. Ur en utvecklares perspektiv skiljer sig dessa tvÄ saker, förstÄs.
MÄnga av dessa mekanismer fungerar pÄ begÀrningsnivÄ (dÀrav "L7-proxy"). Till exempel, om tjÀnsten Foo skickar ett HTTP-anrop till tjÀnsten Bar, kan linkerd-proxy pÄ Foo-sidan utföra intelligent lastbalansering och dirigera anrop frÄn Foo till instanser av Bar beroende pÄ observerad latens; den kan repetera anropet vid behov (och om det Àr idempotent); den kan registrera svarskoden och vÀntetiden, osv. PÄ liknande sÀtt kan linkerd-proxy pÄ Bar-sidan avvisa anropet om det inte Àr tillÄtet eller överskrider begÀrningsgrÀnsen; den kan registrera latens frÄn sin sida, osv.
Proxyn kan "göra nÄgot" Àven pÄ anslutningsnivÄ. Till exempel kan linkerd-proxy pÄ Foo-sidan initiera en TLS-anslutning, medan linkerd-proxy pÄ Bar-sidan kan bryta den, och bÄda sidor kan kontrollera TLS-certifikaten för varandra*. Detta sÀkerstÀller inte bara kryptering mellan tjÀnster, utan Àven ett kryptografiskt sÀkert sÀtt att identifiera tjÀnster: Foo och Bar kan "bevisa" att de Àr de de sÀger sig vara.
* "Varandra" betyder att klientens certifikat ocksÄ kontrolleras (ömsesidig TLS). I "klassisk" TLS, till exempel mellan en webblÀsare och en server, kontrolleras vanligtvis endast certifikatet för den ena sidan (servern).
Oavsett om de arbetar pÄ begÀrnings- eller anslutningsnivÄ Àr det viktigt att understryka att alla funktioner i service mesh Àr operativa i sin natur. Linkerd kan inte transformera semantiken i nyttolasten - till exempel lÀgga till fÀlt i en JSON-fragment eller göra Àndringar i protobuf. Denna viktiga aspekt kommer vi att diskutera senare nÀr vi pratar om ESB och middleware.
Detta Àr funktionen som erbjuds av service mesh. FrÄgan uppstÄr: varför inte implementera dem direkt i applikationen? Och varför ens anvÀnda en proxy?
Varför service mesh Àr en bra idé
Ăven om funktionerna hos service mesh fĂ„ngar fantasin ligger dess verkliga vĂ€rde egentligen inte i funktionerna. I slutĂ€ndan kan vi kan implementera dem direkt i applikationen (senare kommer vi att se att detta var ursprunget till service mesh). Om vi försöker sammanfatta denna tanke i en mening, sĂ„ Ă€r vĂ€rdet av service mesh följande: den tillhandahĂ„ller funktioner som Ă€r kritiskt viktiga för modern serverprogramvaras drift, enhetligt för hela stacken och oberoende av applikationskoden.
LÄt oss analysera denna mening.
«Funktioner som Ă€r kritiskt viktiga för modern serverprogramvaras drift». Om du skapar en transaktionell serverapplikation som Ă€r kopplad till det offentliga internet, som tar emot begĂ€rningar frĂ„n omvĂ€rlden och svarar pĂ„ dem inom en kort tidsram â till exempel en webbapplikation, en API-server, eller faktiskt de flesta andra moderna applikationer â och om du implementerar den som en uppsĂ€ttning tjĂ€nster som interagerar med varandra synkront, och om du stĂ€ndigt uppgraderar denna programvara genom att lĂ€gga till nya funktioner, och om du tvingas hĂ„lla detta system fungerande under modifieringarna â dĂ„ gratulerar jag dig, du sysslar med att skapa modern serverprogramvara. Och alla dessa fantastiska funktioner som nĂ€mns ovan visar sig faktiskt vara kritiskt viktiga för dig. Applikationen mĂ„ste vara pĂ„litlig, sĂ€ker och du mĂ„ste kunna övervaka vad den gör. Just dessa frĂ„gor hjĂ€lper service mesh att lösa.
(Okej, i den föregĂ„ende stycket smög sig min övertygelse in om att detta tillvĂ€gagĂ„ngssĂ€tt Ă€r ett modernt sĂ€tt att skapa serverprogramvara. Andra föredrar att utveckla monoliter, 'reaktiva mikrotjĂ€nster' och andra saker som inte faller under definitionen ovan. Dessa mĂ€nniskor har förmodligen en Ă„sikt som skiljer sig frĂ„n min. Ă sin sida anser jag att de 'har fel' â Ă€ven om service mesh kanske inte Ă€r sĂ€rskilt anvĂ€ndbart för dem).
«Enhetligt för hela stacken». Funktioner som tillhandahÄlls av service mesh Àr inte bara kritiskt viktiga. De tillÀmpas pÄ alla tjÀnster i applikationen oavsett vilket sprÄk de Àr skrivna i, vilket ramverk som anvÀnds, vem som har skrivit dem, hur de har distribuerats och av alla de andra nyanser i deras utveckling och anvÀndning.
«Oberoende av applikationskodenTill slut ger en service mesh inte bara enhetliga funktioner för hela stacken â den gör detta pĂ„ ett sĂ€tt som inte krĂ€ver Ă€ndringar i applikationen. Den grundlĂ€ggande funktionen hos en service mesh, inklusive uppgifter som konfiguration, uppdatering, drift, underhĂ„ll, etc., Ă€r helt och hĂ„llet pĂ„ plattformsnivĂ„ och oberoende av applikationen. Applikationen kan förĂ€ndras utan att pĂ„verka service meshen. Ă sin sida kan service meshen förĂ€ndras utan att applikationen behöver delta.
För att sammanfatta, service mesh ger inte bara livsviktiga funktioner, utan gör det pÄ ett globalt, enhetligt och applikationsoberoende sÀtt. Och dÀrför, Àven om funktionaliteten hos en service mesh kan implementeras i servicekoden (t.ex. som ett bibliotek som ingÄr i varje service), kommer den hÀr metoden inte att ge den enhetlighet och oberoende som Àr sÄ vÀrdefulla i en service mesh.
Och allt som behövs för detta Àr att lÀgga till en massa proxys! Jag lovar, mycket snart kommer vi att granska de driftskostnader som Àr kopplade till att lÀgga till dessa proxys. Men först, lÄt oss stanna upp och se pÄ denna idé om oberoende ur olika perspektiv. mÀnniskor.
Vem drar nytta av service mesh?
Hur obekvÀmt det Àn mÄ vara, för att en viss teknik ska bli en viktig del av ekosystemet, mÄste den antas av mÀnniskor. SÄ vem Àr intresserad av service mesh? Vem vinner pÄ att anvÀnda den?
Om du utvecklar modern serverprogramvara kan du förestÀlla dig ditt team som en grupp tjÀnsteÀgare, som tillsammans utvecklar och implementerar affÀrslogik, och plattformÀgare, som sysslar med att utveckla den interna plattformen pÄ vilken dessa tjÀnster körs. I mindre organisationer kan det vara samma personer, men i takt med att företaget vÀxer tenderar dessa roller att bli mer distinkta och delas till och med upp i underroller⊠(Det finns mycket att sÀga om den förÀnderliga naturen av DevOps, den organisatoriska pÄverkan av mikrotjÀnster, osv. Men lÄt oss för tillfÀllet acceptera dessa beskrivningar som en givenhet.)
FrÄn den hÀr synvinkeln Àr plattformsÀgare de uppenbara vinnarna av service mesh. I slutÀndan Àr plattformsteamets mÄl att skapa en intern plattform dÀr tjÀnsteÀgare kan implementera affÀrslogik pÄ ett sÀtt som sÀkerstÀller deras maximal oberoende frÄn de trÄkiga detaljerna i driften. Service mesh erbjuder inte bara möjligheter som Àr kritiskt viktiga för att uppnÄ detta mÄl: den gör det pÄ ett sÀtt som i sin tur inte ÄlÀgger nÄgra beroenden pÄ tjÀnsteÀgarna.
TjÀnsteÀgarna drar ocksÄ nytta, om Àn pÄ ett mer indirekt sÀtt. MÄlet för en tjÀnsteÀgare Àr att vara sÄ produktiv som möjligt i implementeringen av affÀrsprocessens logik, och ju mindre de behöver oroa sig för driftsfrÄgor, desto bÀttre. IstÀllet för att behöva hantera implementeringen av till exempel omfrÄgepolicyer eller TLS kan de fokusera helt och hÄllet pÄ affÀrsuppgifterna och hoppas att plattformen tar hand om allt annat. För dem Àr detta en stor fördel.
Det organisatoriska vÀrdet av en sÄdan uppdelning mellan plattforms- och tjÀnsteÀgare Àr svÄrt att överskatta. Jag anser att det bidrar huvud till vÀrdet av service mesh.
Vi lÀrde oss denna lÀxa nÀr en av de första anhÀngarna av Linkerd berÀttade för oss varför de valde service mesh: för att den gjorde att de kunde "minimera pratandet". HÀr Àr lite mer information: killarna frÄn ett stort företag migrerade sin plattform till Kubernetes. Eftersom applikationen hanterade kÀnslig information ville de kryptera all kommunikation i kluster. Men situationen försvÄrades av att det fanns hundratals tjÀnster och hundratals utvecklarteam. Utsikten att behöva kontakta alla och övertyga dem att inkludera stöd för TLS i sina planer gladde dem inte alls. Genom att installera Linkerd flyttade de ansvaret frÄn utvecklarna (som tyckte att det var onödigt krÄngel) till plattformsÀgarna, för vilka detta var en högsta prioritet. Med andra ord löste Linkerd för dem inte bara en teknisk, utan Àven en organisatorisk utmaning.
Kort sagt Àr service mesh i högre grad en lösning pÄ en icke-teknisk socioteknisk utmaning. (Tack för att introducera detta begrepp.)
Kommer service mesh att lösa alla mina problem?
Ja. AlltsÄ, nej!
NĂ€r man tittar pĂ„ de tre funktionernas klasser som nĂ€mnts ovan: tillförlitlighet, sĂ€kerhet och övervakning, blir det tydligt att service mesh inte Ă€r en fullstĂ€ndig lösning för nĂ„got av dessa problem. Ăven om Linkerd kan skicka om förfrĂ„gningar (om den vet att de Ă€r idempotenta), kan den inte fatta beslut om vad som ska returneras till anvĂ€ndaren om tjĂ€nsten har kraschat helt â sĂ„dana beslut mĂ„ste applikationen fatta. Linkerd kan hĂ„lla statistik över framgĂ„ngsrika förfrĂ„gningar, men den kan inte kika in i tjĂ€nsten och ge dess interna mĂ„tt â sĂ„dana verktyg mĂ„ste finnas i applikationen. Ăven om Linkerd kan organisera mTLS krĂ€ver verkliga lösningar inom sĂ€kerhet mycket mer.
DelmÀngden av funktioner inom dessa omrÄden som erbjuds av service mesh tillhör plattformens funktioner. Med detta menar jag funktioner som:
- Ăr oberoende av affĂ€rslogik. SĂ€ttet som histogram över anrop mellan Foo och Bar byggs upp pĂ„, beror helt och hĂ„llet inte pĂ„ om varför Foo anropar Bar.
- Det Àr svÄrt att implementera korrekt. I Linkerd parameteriseras omförsök med alla möjliga avancerade saker som ÄterhÀmtningsbudgetar (retry budgets), eftersom en enkel rak metod för att implementera sÄdana saker sÀkerligen skulle leda till vad som kallas en "förfrÄgningslavin" (retry storm) och andra problem som Àr typiska för distribuerade system.
- Ăr mest effektiva nĂ€r de tillĂ€mpas enhetligt. TLS-mekanismen Ă€r meningsfull endast nĂ€r den tillĂ€mpas överallt.
Eftersom dessa funktioner implementeras pÄ proxy-nivÄ (och inte pÄ applikationsnivÄ) tillhandahÄller service mesh dem pÄ plattformsnivÄ , och inte applikationsnivÄ. SÄledes spelar det ingen roll vilket sprÄk tjÀnsterna Àr skrivna i, vilket ramverk de anvÀnder, vem som har skrivit dem och varför. Proxyn fungerar bortom alla dessa detaljer, och den grundlÀggande grunden för denna funktionalitet, inklusive uppgifter kring konfiguration, uppdatering, drift, underhÄll osv., ligger helt pÄ plattformsnivÄ.Exempel pÄ funktioner i service mesh
Exempel pÄ funktioner för service mesh

Sammanfattningsvis vill jag sÀga att en service mesh inte Àr en komplett lösning för att sÀkerstÀlla tillförlitlighet, övervakning eller sÀkerhet. OmfÄnget av dessa omrÄden krÀver nödvÀndig medverkan frÄn tjÀnsteÀgare, Ops/SRE-team och andra aktörer inom företaget. Service mesh erbjuder endast ett "snitt" pÄ plattformsnivÄ för var och en av dessa omrÄden.
Varför har service mesh blivit populÀrt just nu?
Förmodligen undrar du just nu: okej, om service mesh Àr sÄ bra, varför började vi inte rulla ut miljontals proxies i stacken för tio Är sedan?
Det finns ett banalt svar pÄ denna frÄga: för tio Är sedan byggde alla monoliter, och ingen behövde en service mesh. Det Àr sant, men enligt min mening gÄr poÀngen förlorad i ett sÄdant svar. Redan för tio Är sedan diskuterades och tillÀmpades konceptet med mikrotjÀnster som en lovande metod för att bygga stora system brett inom företag som Twitter, Facebook, Google och Netflix. Den allmÀnna uppfattningen - Ätminstone inom de delar av branschen som jag haft kontakt med - var att mikrotjÀnster var det "rÀtta sÀttet" att skapa stora system, Àven om det var riktigt svÄrt.
SjÀlvklart, Àven om det för tio Är sedan fanns företag som anvÀnde mikrotjÀnster, stoppade de inte in proxies överallt för att skapa en service mesh. Men om man ser noga pÄ det, gjorde de nÄgot liknande: i mÄnga av dessa företag var det obligatoriskt att anvÀnda ett speciellt internt bibliotek för nÀtverkskommunikation (ibland kallat tjockklientbibliotek, fat client library).
Netflix hade Hysterix, Google hade Stubby, Twitter hade biblioteket Finagle. Finagle var till exempel obligatoriskt för varje ny tjÀnst pÄ Twitter. Det hanterade bÄde klient- och serverdelen av anslutningarna, tillÀt försök pÄ nytt, stödde förfrÄgans routning, belastningsbalansering och mÀtning. Det erbjöd ett konsekvent lager av tillförlitlighet och övervakning för hela Twitter-stacken, oavsett vad tjÀnsten sysslade med. SjÀlvklart fungerade det bara för JVM-sprÄk och byggde pÄ den programmeringsmodell som var tvungen att anvÀndas för hela applikationen. Men dess funktionalitet var nÀstan densamma som för en service mesh. (Den första versionen av Linkerd var faktiskt bara Finagle, inpackad i en proxyform.)
SÄ för tio Är sedan fanns det inte bara mikrotjÀnster, utan Àven speciella proto-service-mesh-bibliotek som löste samma problem som service mesh löser idag. Men det fanns ingen riktig service mesh dÄ. En ytterligare förÀndring mÄste ske innan den kom till existens.
Och hĂ€r ligger det djupare svaret, dolt i en annan förĂ€ndring som intrĂ€ffat under de senaste 10 Ă„ren: kostnaden för att deployera mikrotjĂ€nster har minskat dramatiskt. Företagen som nĂ€mndes tidigare, Twitter, Netflix, Facebook, Google, var enorma företag med stora resurser. De hade bĂ„de behovet och möjligheten att skapa, deployera och driva stora applikationer baserade pĂ„ mikrotjĂ€nster. Energin och anstrĂ€ngningen som Twitter-ingenjörerna lade ner för att gĂ„ frĂ„n monolitisk till mikrotjĂ€nstarkitektur Ă€r verkligen anmĂ€rkningsvĂ€rd. (Ărligt talat, precis som faktumet att det lyckades.) Den typen av infrastrukturella manövrar var dĂ„ omöjliga för mindre företag.
LÄt oss ta steget in i nutiden. Idag finns det startups dÀr förhÄllandet mellan mikrotjÀnster och utvecklare Àr 5:1 (eller till och med ), och dessutom klarar de sig bra med dem! Om en startup med 5 personer utan problem kan hantera 50 mikrotjÀnster, sÄ mÄste nÄgot ha sÀnkt kostnaden för deras implementering.
1500 mikrotjÀnster i Monzo; varje rad Àr en angiven nÀtverksregel som tillÄter trafik
Den dramatiska kostnadsminskningen för drift av mikrotjÀnster Àr resultatet av en process: ökad popularitet av containrar och orkestratorer. Det Àr i detta som det djupa svaret pÄ frÄgan om vad som har bidragit till framvÀxten av service mesh ligger. Samma teknologi har gjort bÄde service mesh och mikrotjÀnster attraktiva: Kubernetes och Docker.
Varför? Jo, Docker löser ett stort problem - paketproblemet. Genom att paketera applikationen och dess (icke-nÀtverks) runtime-beroenden i en container gör Docker applikationen till en utbytbar enhet som kan placeras och köras var som helst. Samtidigt förenklar det driften av flersprÄkiga Stack: Eftersom containern Àr en atomÀr enhet för utförande, spelar det ingen roll vad som finns inuti för distributions- och driftsÀttningssyften, vare sig det Àr en applikation pÄ JVM, Node, Go, Python eller Ruby. Du kör helt enkelt den, och det Àr allt.
Kubernetes tar allt till en ny nivÄ. Nu nÀr det finns en massa "exekverbara saker" och flera maskiner dÀr de kan köras, uppstÄr behovet av ett verktyg som kan matcha dem med varandra. I bred bemÀrkelse ger du Kubernetes mÄnga containrar och mÄnga maskiner, och den matchar dem (sjÀlvklart Àr det en dynamisk och stÀndigt förÀndrande process: nya containrar rör sig genom systemet, maskiner startas och stÀngs av osv. Men Kubernetes tar hÀnsyn till allt detta).
Efter att ha konfigurerat Kubernetes skiljer tidskostnaderna för distribution och drift av en tjÀnst knappt frÄn kostnaderna för distribution och drift av tio tjÀnster (egentligen Àr de praktiskt taget lika Àven för 100 tjÀnster). LÀgg dÀrtill containrar som en förpackningsmekanism som uppmuntrar flersprÄkig implementering, sÄ fÄr du massor av nya applikationer som implementeras i form av mikrotjÀnster skrivna pÄ olika sprÄk - just den miljö som service mesh Àr sÄ vÀl anpassad för.
SÄ vi har kommit till svaret pÄ frÄgan om varför idén med service mesh blivit populÀr just nu: den enhetlighet som Kubernetes möjliggör för tjÀnster Àr direkt tillÀmplig pÄ de driftsÀttningsuppgifter som stÄr inför service mesh. Du paketerar proxy i containrar, ger Kubernetes uppgiften att fÀsta dem var som helst, och voila! Resultatet Àr en service mesh, dÀr hela mekaniken för dess distribution drivs av Kubernetes. (à tminstone frÄn fÄgelperspektiv. SjÀlvklart finns det mÄnga nyanser i denna process.)
Sammanfattningsvis: orsaken till att service mesh blivit populÀr just nu snarare Àn för tio Är sedan, Àr att Kubernetes och Docker inte bara har ökat behovet av det genom att förenkla implementeringen av applikationer som samlingar av flersprÄkiga mikrotjÀnster, utan Àven avsevÀrt minskat kostnaderna för dess drift genom att erbjuda mekanismer för distribution och stöd för sidecar-proxyparker.
Varför talas det sÄ mycket om service mesh?
Varning: i detta avsnitt lutar jag mig mot alla möjliga antaganden, tankar, spekulationer och intern information.
Genom att söka pÄ frasen "service mesh" kommer du att stöta pÄ en massa omarbetat lÄgkalorinnehÄll, konstiga projekt och ett kalejdoskop av förvrÀngningar vÀrdiga en ekokammare. Detta Àr typiskt för alla trendiga nya teknologier, men i fallet med service mesh Àr problemet sÀrskilt uttalat. Varför?
Tja, delvis Ă€r det mitt fel. Jag har gjort allt jag kan för att frĂ€mja Linkerd och service mesh vid varje tillfĂ€lle genom otaliga bloggposter och artiklar som denna. Men jag Ă€r inte sĂ„ mĂ€ktig. För att faktiskt kunna svara pĂ„ denna frĂ„ga Ă€r det nödvĂ€ndigt att prata lite om den allmĂ€nna situationen. Och att prata om det gĂ„r inte utan att nĂ€mna ett projekt: â en öppen kĂ€llkods service mesh, utvecklad av Google, IBM och Lyft tillsammans.
(Dessa tre företag har helt olika roller: Lyft's deltagande verkar mest vara ett namn; de Àr skaparna av Envoy, men anvÀnder varken Istio eller deltar i dess utveckling. IBM deltar i utvecklingen av Istio och anvÀnder det. Google Àr aktivt involverat i utvecklingen av Istio, men sÄvitt jag kan bedöma, faktiskt inte anvÀnder det.)
Projektet Istio Ă€r anmĂ€rkningsvĂ€rt av tvĂ„ anledningar. För det första Ă€r det de enorma marknadsföringsinsatserna som Google, i synnerhet, lĂ€gger ner pĂ„ dess frĂ€mjande. Enligt mina uppskattningar Ă€r majoriteten av de personer som idag kĂ€nner till begreppet service mesh först medvetna om det tack vare Istio. Den andra anledningen Ă€r hur dĂ„ligt Istio har accepterats. I denna frĂ„ga Ă€r jag uppenbarligen partisk, men i mitt försök att förbli sĂ„ objektiv som möjligt kan jag Ă€ndĂ„ inte , inte sĂ€rskilt typisk (Ă€ven om det inte Ă€r unikt: jag tĂ€nker pĂ„ systemd, âŠ) för ett Open Source-projekt.
(I praktiken verkar Istio ha problem inte bara med komplexitet och anvÀndarupplevelse, utan ocksÄ med prestanda. Till exempel under , genomförd av en tredje part, upptÀckte experter situationer dÀr Istios svanslatens var 100 gÄnger högre Àn motsvarande siffra för Linkerd, samt situationer med resursbrist dÀr Linkerd fortsatte att fungera framgÄngsrikt medan Istio helt slutade fungera.)
LÄt mig lÀmna mina teorier om varför detta har hÀnt Ät sidan; jag tror att det överdrivna intresset för service mesh förklaras av Googles involvering. Specifikt en kombination av följande tre faktorer:
- den pÄtrÀngande marknadsföringen av Istio frÄn Google;
- den negativa och kritiska instÀllningen till projektet;
- den senaste snabba ökningen i popularitet för Kubernetes, vars minnen fortfarande Àr fÀrska.
Tillsammans förenas dessa faktorer i en sorts bedövande, syrefattig miljö dÀr förmÄgan till rationellt tÀnkande försvagas, och det kvarstÄr endast en underlig variation av .
FrĂ„n Linkerds perspektiv skulle jag beskriva detta som en tvetydig vĂ€lsignelse. Jag menar, det Ă€r fantastiskt att service mesh har blivit mainstream â vilket inte var fallet 2016, nĂ€r Linkerd just hade dök upp och det verkligen var svĂ„rt att fĂ„ omvĂ€rldens uppmĂ€rksamhet för projektet. Nu finns det inte det problemet! Men det negativa Ă€r att situationen kring service mesh idag Ă€r sĂ„ förvirrande att det Ă€r praktiskt taget omöjligt att förstĂ„ vilka projekt som verkligen hör till kategorin service mesh (för att inte tala om att förstĂ„ vilket av dem som passar bĂ€st för ett specifikt anvĂ€ndningsfall). Detta hindrar definitivt alla (och i vissa fall passar Istio eller ett annat projekt bĂ€ttre Ă€n Linkerd, eftersom det sistnĂ€mnda fortfarande inte Ă€r en universallösning).
FrÄn Linkerds sida har vÄr strategi varit att ignorera ljudet, fortsÀtta fokusera pÄ att lösa verkliga problem i samhÀllet och i princip vÀnta pÄ att hypen ska lÀgga sig. I slutÀndan kommer hajpen att avta, och vi kan fortsÀtta arbeta i lugn och ro.
Under tiden fÄr vi alla uthÀrda en stund.
Kommer service mesh vara anvÀndbart för mig, en blygsam mjukvaruingenjör?
Svaret pÄ denna frÄga kan hjÀlpa till att avgöras av följande enkÀt:
Arbetar du enbart med implementering av affÀrslogik? I sÄ fall kommer service mesh inte att vara till nytta för dig. Det vill sÀga, sjÀlvklart kan du bli intresserad av det, men i idealfallet bör service mesh inte direkt pÄverka nÄgot i din miljö. FortsÀtt arbeta med det du fÄr betalt för.
UnderhĂ„ller du en plattform inom ett företag som anvĂ€nder Kubernetes? Ja, i sĂ„ fall behöver du service mesh (sĂ„vida du inte anvĂ€nder K8s bara för att köra en monolit eller för batchbearbetning â men dĂ„ skulle jag vilja frĂ„ga varför du ens anvĂ€nder K8s). Det Ă€r troligt att du hamnar i en situation med mĂ„nga mikrotjĂ€nster skrivna av olika personer. Dessa interagerar med varandra och Ă€r sammanlĂ€nkade i ett knippe av runtime-beroenden, och du mĂ„ste hitta ett sĂ€tt att hantera allt detta. Att anvĂ€nda Kubernetes gör att du kan vĂ€lja en service mesh som passar dig. För att göra detta, bekanta dig med deras möjligheter och egenskaper och avgör om nĂ„got av de befintliga projekten passar dig (jag rekommenderar att börja med Linkerd).
Arbetar du med en plattform i ett företag som INTE anvÀnder Kubernetes, men anvÀnder mikrotjÀnster? I sÄ fall kommer service mesh att vara nyttig för dig, men att anvÀnda den kommer att vara en utmaning. Naturligtvis kan du imitera funktionen av service mesh genom att lÀgga upp en massa proxies, men en viktig fördel med Kubernetes Àr just distributionsmodellen: att underhÄlla dessa proxies manuellt kommer att krÀva betydligt mer tid, anstrÀngning och kostnad.
Ăr du ansvarig för plattformen i ett företag som arbetar med monoliter? I sĂ„ fall behöver du förmodligen inte nĂ„gon service mesh. Om du arbetar med monoliter (eller till och med med uppsĂ€ttningar av monoliter) som har vĂ€l definierade och sĂ€llan förĂ€ndrade interaktionsmönster, kommer service mesh inte att kunna erbjuda dig mycket. SĂ„ du kan helt enkelt ignorera den och hoppas att den ska försvinna som en mardröm...
Slutsats
Kanske Ă€r det Ă€ndĂ„ inte rĂ€tt att kalla service mesh för "den mest hype-teknologin i vĂ€rlden" â den tveksamma hederstjĂ€nsten tillhör troligtvis bitcoin eller AI. Kanske Ă€r den bland de fem bĂ€sta. Men om man lyckas trĂ€nga igenom lagren av brus och oljud, blir det tydligt att service mesh faktiskt tillför verkligt vĂ€rde för dem som bygger applikationer i Kubernetes.
Jag skulle vilja att du provade Linkerd â dess installation i en Kubernetes-kluster (eller till och med i Minikube pĂ„ din bĂ€rbara dator) , och du kommer sjĂ€lv att fĂ„ se vad jag pratar om.
FAQ
â Om jag ignorerar service mesh, försvinner den?
â Jag mĂ„ste uppröra dig: service mesh Ă€r hĂ€r för att stanna.
â Men jag VILL INTE anvĂ€nda service mesh!
â DĂ„ behöver du inte! LĂ€s bara min enkĂ€t ovan för att avgöra om du bör bekanta dig med Ă„tminstone grunderna.
â Ăr inte detta den gamla goda ESB/middleware i ny förpackning?
â Service mesh hanterar driftslogik, inte semantik. med företagsservicenĂ€tet (). Att bevara denna uppdelning hjĂ€lper service mesh att undvika samma öde.
â Hur skiljer sig service mesh frĂ„n API-gateways?
â Det finns en miljon artiklar om detta. Bara googla.
â Ăr Envoy ett service mesh?
â Nej, Envoy Ă€r inte ett service mesh, det Ă€r en proxyserver. Den kan anvĂ€ndas för att organisera service mesh (och mycket annat â det Ă€r en allroundproxy). Men i sig sjĂ€lv Ă€r den inte ett service mesh.
â Ăr Network Service Mesh ett service mesh?
â Nej. Trots namnet Ă€r det inte ett service mesh (hur kan marknadsföring lura oss?).
â Kommer service mesh hjĂ€lpa min reaktiva asynkrona system baserat pĂ„ meddelandeköer?
â Nej, service mesh kommer inte att hjĂ€lpa.
â Vilket service mesh ska jag anvĂ€nda?
â , det Ă€r uppenbart.
â Artikeln Ă€r skrĂ€p! / Författaren kan dra Ă„t skogen!
â Var snĂ€ll och dela lĂ€nken till den hĂ€r med alla vĂ€nner sĂ„ att de kan se det sjĂ€lva!
Tack.
Som du kanske har gissat frÄn titeln, blev den hÀr artikeln inspirerad av Jay Kreps fantastiska avhandling "". Jag trÀffade Jay för tio Är sedan nÀr jag intervjuade pÄ LinkedIn, och sedan dess har han varit en inspiration för mig.
Ăven om jag Ă€lskar att kalla mig sjĂ€lv "Linkerd-utvecklare", Ă€r verkligheten den att jag snarare Ă€r en underhĂ„llare av README.md-filen i projektet. MĂ„nga , , , arbetar med Linkerd idag, och detta projekt skulle inte ha lyckats utan det fantastiska bidragande och anvĂ€ndarsamhĂ€llet.
Och till sist ett stort tack till skaparen av Linkerd, (primus inter pares), som för mÄnga Är sedan dykt ner i denna service mesh-hysteri tillsammans med mig.
P.S. frÄn översÀttaren
LÀs Àven i vÄr blogg:
- «»;
- «»;
- «»;
- «»;
- «».
KĂ€lla: habr.com
