Istio och Kubernetes i produktion. Del 2. Tracing

Tidigare artikeln Vi har granskat de grundlÀggande komponenterna i Service Mesh Istio, bekantat oss med systemet och besvarat de viktigaste frÄgor som ofta uppstÄr i början av arbetet med Istio. I den hÀr delen kommer vi att titta pÄ hur man organiserar insamlingen av tracinginformation över nÀtverket.

Istio och Kubernetes i produktion. Del 2. Tracing

Det första som mÄnga utvecklare och systemadministratörer tÀnker pÄ nÀr de hör orden Service Mesh Àr tracing. Och faktum Àr att vi lÀgger till en speciell proxyserver i varje nod i nÀtverket, som all TCP-trafik passerar genom. Det verkar som att det nu blir enkelt att skicka information om alla nÀtverksinteraktioner i nÀtverket. TyvÀrr dyker det upp mÄnga nyanser i verkligheten som mÄste beaktas. LÄt oss ta en titt pÄ dem.

Missuppfattning nummer ett: vi kan gratis fÄ data om nÀtverksanvÀndning.

I verkligheten kan vi bara relativt gratis fÄ de sammanlÀnkade noderna i vÄrt system markerade med pilar och datarate som passerar mellan tjÀnsterna (i huvudsak bara antalet byte per tidsenhet). Men i de flesta fall kommunicerar vÄra tjÀnster över nÄgot applikationsprotokoll, som HTTP, gRPC, Redis och sÄ vidare. Och, naturligtvis, vill vi se tracinginformation just för dessa protokoll, vi vill se rate av förfrÄgningar, snarare Àn rate av data. Vi vill förstÄ latensen av förfrÄgningar enligt vÄrt protokoll. Slutligen vill vi se hela vÀgen som förfrÄgan gÄr frÄn intrÀde i vÄrt system till att anvÀndaren fÄr svar. Denna uppgift Àr inte sÄ enkel att lösa.

Först, lÄt oss titta pÄ hur sÀndningen av tracing spans ser ut ur ett arkitekturperspektiv i Istio. Som vi minns frÄn första delen, har Istio en separat komponent för insamling av telemetry som kallas Mixer. Men i den nuvarande versionen 1.0.* sker sÀndningen direkt frÄn proxyservrar, specifikt frÄn envoy proxy. Envoy proxy stödjer sÀndning av tracing spans via zipkin-protokollet direkt ur lÄdan. Andra protokoll kan anslutas, men endast via ett plugin. Med Istio fÄr vi omedelbart en konfigurerad och sammanstÀlld envoy proxy, dÀr endast zipkin-protokollet stöds. Om vi vill anvÀnda till exempel Jaeger-protokollet och skicka tracing spans via UDP, mÄste vi bygga vÄr egen istio-proxy bild. Stödet för anpassade plugins för istio-proxy finns, men Àr fortfarande i alpha-version. DÀrför, om vi vill undvika ett stort antal anpassade instÀllningar, minskar den teknologiska cirkeln för lagring och mottagning av tracing spans. FrÄn de grundlÀggande systemen kan vi just nu i praktiken anvÀnda antingen Zipkin eller Jaeger, men skicka allt via ett zipkin-kompatibelt protokoll (vilket Àr betydligt mindre effektivt). Zipkin-protokollet innebÀr att all tracinginformation skickas till insamlare via HTTP-protokollet, vilket Àr ganska kostsamt.

Som jag redan nÀmnt, vill vi spÄra applikationsprotokoll. Det innebÀr att proxyservrarna som stÄr bredvid varje tjÀnst mÄste förstÄ vilken interaktion som sker just nu. Som standard konfigurerar Istio alla portar som ren TCP, vilket innebÀr att inga spans kommer att skickas. För att spans ska skickas mÄste vi först aktivera den hÀr funktionen i huvud mesh-config och, vilket Àr mycket viktigt, namnge alla portar i kubernetes service-enheter i enlighet med det protokoll som anvÀnds i tjÀnsten. Det vill sÀga, till exempel sÄ hÀr:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
    name: http
  selector:
    app: nginx

Vi kan ocksÄ anvÀnda sammansatta namn, till exempel http-magic (Istio kommer att se http och kÀnna igen den hÀr porten som en http-endpoint). Formatet Àr: proto-extra.

För att undvika att patcha ett stort antal konfigurationer för att definiera protokoll, kan vi anvÀnda en smutsig workaround: patcha Pilot-komponenten just nÀr den utför logiken för protokollbestÀmning.. I slutÀndan mÄste dessa logik sjÀlvklart justeras till standard och följa namngivningskonventionen för alla portar.

För att verkligen förstÄ om protokollet Àr korrekt definierat mÄste vi gÄ in i en av sidecar-kontainrarna med envoy proxy och göra en begÀran till admin-grÀnssnittets port för envoy med platsen /config_dump. I den resulterande konfigurationen bör vi titta pÄ operation-fÀltet för den nödvÀndiga tjÀnsten. Den anvÀnds i Istio som en identifierare för vart begÀran gÄr. För att anpassa vÀrdet pÄ denna parameter i Istio (vi kommer sedan att se det i vÄrt spÄrningssystem), mÄste vi ange flaggan serviceCluster vid starten av sidecar-kontainern. Till exempel kan den berÀknas pÄ detta sÀtt frÄn variabler som fÄtts frÄn Kubernetes downward API:

--serviceCluster ${POD_NAMESPACE}.$(echo ${POD_NAME} | sed -e 's/-[a-z0-9]*-[a-z0-9]*$//g')

Ett bra exempel för att förstÄ hur spÄrning fungerar i envoy Àr ). Ett typiskt exempel pÄ anvÀndning:.

SjÀlva slutpunkten för att skicka tracing spans mÄste ocksÄ anges i flaggorna vid start av envoy proxy, till exempel: --zipkinAddress tracing-collector.tracing:9411

Missuppfattning nummer tvÄ: vi kan billigt fÄ fullstÀndiga spÄr av begÀrors genomgÄng genom systemet ur lÄdan.

TyvÀrr Àr det inte sÄ. SvÄrighetsgraden av implementeringen beror pÄ hur din nuvarande tjÀnsteinteraktion Àr implementerad. Varför Àr det sÄ?

Tanken Àr att för att istio-proxy ska kunna förstÄ kopplingen mellan inkommande begÀrningar till tjÀnsten och utgÄende frÄn samma tjÀnst Àr det inte tillrÀckligt att bara fÄnga all trafik. NÄgot slags samband-identifierare behövs. I HTTP envoy proxy anvÀnds speciella rubriker, genom vilka envoy förstÄr vilken specifik begÀran till tjÀnsten som genererar specifika begÀrningar till andra tjÀnster. Listan över sÄdana rubriker Àr:

  • x-request-id,
  • x-b3-traceid,
  • x-b3-spanid,
  • x-b3-parentspanid,
  • x-b3-sampled,
  • x-b3-flags,
  • x-ot-span-context.

Om ni har en enhetlig punkt, till exempel en grundlÀggande klient dÀr denna logik kan lÀggas till, sÄ Àr allt bra, ni behöver bara vÀnta pÄ att detta bibliotek uppdateras hos alla kunder. Men om ni har ett mycket heterogent system utan enhetlighet i hur tjÀnsterna interagerar över nÀtverket kommer detta sannolikt att bli ett stort problem. Utan att lÀgga till liknande logik kommer all spÄrningsinformation att vara "endimensionell". Det innebÀr att vi fÄr alla interaktioner mellan tjÀnsterna, men de kommer inte att kopplas ihop till en sammanhÀngande kedja över nÀtverket.

Slutsats

Istio erbjuder ett anvÀndarvÀnligt verktyg för att samla in spÄrningsinformation över nÀtverket, men det Àr viktigt att förstÄ att implementeringen krÀver anpassningar av ditt system och att man beaktar de unika aspekterna av Istios implementation. I slutÀndan behöver man lösa tvÄ huvudfrÄgor: definiera applikationsprotokollet (som mÄste stödjas av envoy proxy) och konfigurera överföringen av information om sammankopplingen av förfrÄgningar till tjÀnsten frÄn förfrÄgningar inom tjÀnsten (genom headers, i fallet med HTTP-protokollet). NÀr dessa frÄgor Àr lösta fÄr vi ett kraftfullt verktyg som gör det möjligt att transparently samla in information frÄn nÀtverket Àven i mycket heterogena system skrivna i mÄnga olika sprÄk och ramverk.

I nĂ€sta artikel om Service Mesh kommer vi att titta pĂ„ ett av de största problemen med Istio – den stora minnesanvĂ€ndningen av varje sidecar proxy-container och diskutera hur man kan hantera detta.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster