Wat zijn microservices?
Met de opkomst van microservices heeft het concept van een service mesh veel aandacht gekregen. In dit artikel bespreken we een overzicht van wat een service mesh is en hoe het voordelen biedt voor een microservices-architectuur.
Microservices zijn een softwareontwikkelingsparadigma waarbij software wordt ontwikkeld en geïmplementeerd als onafhankelijke applicatie-eenheden die via goed gedefinieerde interfaces met andere applicaties communiceren om een specifieke taak uit te voeren. Hierdoor kan elke microservice afzonderlijk worden geschaald, bijgewerkt en beheerd.
Microservices zijn sterk afhankelijk van communicatie met andere microservices. Daardoor kan de netwerktopologie in een microservice-architectuur behoorlijk complex worden. Dit brengt vaak uitdagingen met zich mee op het gebied van beveiliging, betrouwbaarheid en verkeersbeheer.
Om deze problemen op te lossen, is het belangrijk dat de implementatie observability ondersteunt om de mogelijkheid te achterhalen waar een fout daadwerkelijk optreedt en hoe de netwerkverzoeken zich gedragen. Daarnaast is het wenselijk om functies voor reliability (betrouwbaarheid) te hebben, zodat de implementatie stabieler wordt.
Om beveiliging op transportniveau te waarborgen, is het essentieel om SSL-communicatie tussen microservices af te dwingen. Bij het uitrollen van nieuwe versies van microservices kan het nodig zijn om technieken zoals canary releases of A/B-testing toe te passen om mogelijke problemen te voorkomen. Mocht er tijdens een uitrol toch een probleem optreden, dan is een soepele overgang en een rollbackplan cruciaal.
Hoewel het mogelijk is om bovengenoemde functies zoals observability, beveiliging, betrouwbaarheid en verkeersbeheer rechtstreeks in de microservice applicaties zelf te implementeren, brengt dit een aanzienlijke extra last met zich mee voor zowel de ontwikkeling als het onderhoud van deze functionaliteiten binnen de microservices.
Wat is een service mesh?
Een service mesh is een infrastructuur niveau component die kan worden toegevoegd aan een microservice-gebaseerde omgeving om de kwaliteit van de communicatie tussen microservices te verbeteren. Het maakt het mogelijk om netwerkproxy’s naast de microservices te implementeren. Deze proxy’s, bekend als sidecar-proxy’s, brengen de hierboven genoemde functionaliteiten aan in de microservice-omgeving, zonder dat deze in de applicatie laag zelf hoeven te worden geïmplementeerd. Enkele bekende service meshes zijn Istio en Linkerd.
Een service mesh bestaat doorgaans uit een control plane en een data plane.
De control plane is de laag waarin configuraties worden vastgelegd. Deze configuraties worden vervolgens door de control plane doorgestuurd naar de sidecar-proxy’s in de data plane. Daarnaast verzamelt de control plane ook metrische gegevens van de sidecar-proxy’s en zorgt deze voor het injecteren van de proxy’s in de microservices.
De data plane is het gedeelte waar de communicatie tussen microservices daadwerkelijk plaatsvindt. De sidecar-proxy maakt deel uit van deze data plane. Deze proxy onderschept zowel het inkomende als uitgaande verkeer van de microservice en voert de beheerfuncties uit die nodig zijn voor observatie, beveiliging, betrouwbaarheid en verkeersbeheer. Die zijn geconfigureerd door de control plane. De data plane stuurt vervolgens de verzamelde telemetriegegevens en metrische data door naar de control plane voor verdere verwerking en analyse


Hoe werkt de communicatie binnen een service mesh?
Het bovenstaande diagram laat zien hoe de netwerkcommunicatie binnen een service mesh verloopt. We kunnen zien dat al het inkomende verkeer naar service A eerst wordt onderschept door de sidecar-proxy en vervolgens wordt doorgestuurd naar microservice A.
Wanneer microservice A een andere microservice aanroept (in dit voorbeeld microservice B), wordt ook het uitgaande verkeer onderschept door de sidecar-proxy. Vervolgens routeert de sidecar-proxy het verkeer naar service B, waar de sidecar-proxy van service B het verkeer opnieuw onderschept en doorstuurt naar microservice B.
Mogelijkheden van een Service Mesh
Geavanceerd Verkeersbeheer
Load balancing is een belangrijk onderdeel in een gedistribueerde omgeving. Een service mesh biedt verschillende methoden voor load balancing, zoals weighted load balancing, round-robin, least connections en random.
Service meshes zijn geavanceerd genoeg om te voorkomen dat één enkele instantie een knelpunt wordt. Dit zorgt voor een optimale benutting van resources en verbetert de stabiliteit en beschikbaarheid van de omgeving.
Daarnaast bieden service meshes geavanceerde mogelijkheden voor verkeersroutering. Hierdoor kunnen verzoeken worden doorgestuurd op basis van specifieke regels of beleidsinstellingen, zoals path-based routing, header-based routing en content-based routing. Dit verbetert de implementatiestrategieën doordat teams eenvoudig technieken kunnen toepassen zoals blue/green deployment, canary releases of A/B-testing. Op deze manier verloopt het uitrolproces soepel en wordt de impact bij eventuele problemen met een nieuwe release tot een minimum beperkt.
In een gedistribueerd netwerk kunnen tijdelijke of intermitterende netwerkproblemen leiden tot onnodige fouten die de veerkracht van het systeem verminderen. Een service mesh biedt hiervoor een oplossing door getroffen verzoeken automatisch opnieuw te proberen uit te voeren. Het aantal pogingen, de tussenliggende intervallen en de duur hiervan kunnen worden geconfigureerd binnen de service mesh-instellingen.
Aangezien microservices met andere microservices communiceren, kan een probleem in één enkele microservice leiden tot cascading failures (kettingreacties van fouten). Service meshes bieden hiervoor de functie circuit breaking, waarmee wordt voorkomen dat een probleem zich verder verspreidt. Dit gebeurt door verzoeken te blokkeren zodra een vooraf ingestelde foutendrempel is bereikt. Na een bepaalde tijdsperiode worden de verzoeken weer toegelaten zodra de service hersteld is.
Om de beschikbaarheid van de omgeving te waarborgen, is het belangrijk alleen die verzoeken toe te staan die de infrastructuur daadwerkelijk kan verwerken. Daarnaast kan het op basis van bepaalde criteria noodzakelijk zijn om het aantal verzoeken binnen een bepaalde tijdsperiode te beperken bijvoorbeeld om overbelasting, misbruik of aanvallen op een service te voorkomen. Met de rate limiting-functie van een service mesh kan dit worden gerealiseerd door de tijdsperiode, het toegestane aantal verzoeken en de limietcriteria te configureren.
Beveiliging
Beveiliging is een van de belangrijkste aspecten binnen een microservices-architectuur. Omdat microservices voortdurend met elkaar communiceren, zijn ze kwetsbaar voor man-in-the-middle-aanvallen. Service meshes handhaven Mutual TLS (mTLS) voor netwerkcommunicatie tussen microservices. Dit garandeert dat alle gegevens tijdens transport worden versleuteld. Bovendien zorgen service meshes automatisch voor certificaatrotatie, waardoor ontwikkelaars en DevOps-teams zich niet hoeven bezig te houden met het complexe beheer van certificaten.
Daarnaast ondersteunen service meshes ook authenticatie en autorisatie van verzoeken. Dit zorgt ervoor dat alleen legitiem en beveiligd verkeer de services kan bereiken. Service meshes bieden hiervoor Custom Resource Definitions (CRD’s) waarmee authenticatie- en autorisatiebeleid kan worden gedefinieerd. Deze beleidsregels kunnen eenvoudig in de omgeving worden uitgerold en worden direct toegepast op de betreffende services.
Observability
In een microservices-architectuur communiceren services voortdurend met elkaar, wat kan leiden tot een complexe netwerktopologie. Daarom is het essentieel om inzicht te hebben in de netwerkcommunicatie om knelpunten te identificeren, statistieken te verzamelen en problemen te kunnen oplossen.
Distributed tracing is een belangrijke functie binnen microservicesystemen om gegevens te verzamelen over hoe netwerkverzoeken door het systeem stromen. De gegevens die via tracing worden verkregen, geven ontwikkelaars een duidelijk beeld van de communicatiepaden en helpen bij het identificeren van prestatieknelpunten. Daarnaast maakt het tracing het mogelijk om complexe problemen te analyseren en foutieve services te isoleren.
Populaire tools zoals Jaeger en Zipkin zijn standaard geïntegreerd met service meshes, waardoor ontwikkelaars deze functionaliteit eenvoudig kunnen gebruiken zonder extra configuratie.
Daarnaast zijn metrische gegevens zoals verkeersinformatie (verzoekfrequentie), latenties en foutstatistieken van groot belang om een stabiel systeem te behouden. Door deze gegevens te analyseren, kunnen mogelijke problemen vroegtijdig worden opgespoord en opgelost voordat ze de werking van het systeem beïnvloeden. Service meshes bieden de mogelijkheid om de omgeving te integreren met monitoringtools zoals Prometheus, zodat deze functionaliteit optimaal kan worden benut.
Verder bieden service meshes HTTP-toegangslogboeken die metadata van verzoeken vastleggen. Deze informatie is bijzonder waardevol bij het oplossen van problemen binnen microservice-omgevingen, omdat ze inzicht geeft in het gedrag van verkeer en de herkomst van specifieke fouten.
Conclusie
In een microservices-architectuur kan de netwerktopologie complex zijn, wat kan leiden tot onverwachte uitdagingen en beperkingen. Om deze uitdagingen en beperkingen op een efficiënte manier te verhelpen, zijn service meshes geïntroduceerd.
Een service mesh is een netwerklaag-infrastructuur die naast microservices kan worden geïmplementeerd.
Service meshes bieden geavanceerde mogelijkheden op het gebied van verkeersbeheer, beveiliging en observability via sidecar-proxy’s die samen met de microservices worden uitgerold. Hierdoor worden veel beheertaken van de microservice- of applicatielaag overgenomen, wat de ontwikkel- en beheerslast aanzienlijk vermindert.
Bekende service meshes zoals Istio, Linkerd en Consul worden steeds vaker toegepast binnen microservice-omgevingen.
Wil je meer weten over de mogelijkheden van service meshes en hoe deze jouw organisatie kunnen versterken? Neem dan contact op met onze experts bij Yenlo.
