Benchmarking av CPU-anvÀndning för Istio och Linkerd

Benchmarking av CPU-anvÀndning för Istio och Linkerd

Introduktion

En kort historia om containrar: frÄn chroot till Kubernetes Shopify Vi har pÄbörjat implementeringen av Istio som en service mesh. I princip Àr allt bra, förutom en sak: det Àr dyrt.

I offentliggjorda benchmarkar för Istio sÀgs det:

Med Istio 1.1 anvÀnder proxyn ungefÀr 0,6 vCPU (virtuella kÀrnor) per 1000 förfrÄgningar per sekund.

För den första regionen i service mesh (med 2 proxys pÄ varje sida av anslutningen) kommer vi att behöva 1200 kÀrnor bara för proxys, baserat pÄ en miljon förfrÄgningar per sekund. Enligt Googles kostnadskalkylator blir det ungefÀr $40/mÄnad/kÀrna för konfigurationen n1-standard-64, vilket betyder att denna region kommer att kosta oss mer Àn 50 000 dollar per mÄnad för 1 miljon förfrÄgningar per sekund.

Ivan Sim (Ivan Sim) illustrerade tydligt fördröjningarna i service mesh förra Äret och lovade samma sak för minne och CPU, men det blev inte sÄ:

Till synes kommer values-istio-test.yaml att kraftigt öka belastningen pÄ processorn. Om jag rÀknat rÀtt, behövs ungefÀr 24 CPU-kÀrnor för kontrollpanelen och 0,5 CPU för varje proxy. Jag har inte sÄ mÄnga. Jag kommer att upprepa testerna nÀr jag fÄr fler resurser.

Jag ville sjÀlv se hur Istios prestanda jÀmförs med en annan open-source service mesh: Linkerd.

Installation av service mesh

Först installerade jag i klustret SuperGloo:

$ supergloo init
installing supergloo version 0.3.12
using chart uri https://storage.googleapis.com/supergloo-helm/charts/supergloo-0.3.12.tgz
configmap/sidecar-injection-resources created
serviceaccount/supergloo created
serviceaccount/discovery created
serviceaccount/mesh-discovery created
clusterrole.rbac.authorization.k8s.io/discovery created
clusterrole.rbac.authorization.k8s.io/mesh-discovery created
clusterrolebinding.rbac.authorization.k8s.io/supergloo-role-binding created
clusterrolebinding.rbac.authorization.k8s.io/discovery-role-binding created
clusterrolebinding.rbac.authorization.k8s.io/mesh-discovery-role-binding created
deployment.extensions/supergloo created
deployment.extensions/discovery created
deployment.extensions/mesh-discovery created
install successful!

Jag anvĂ€nde SuperGloo eftersom det förenklar initialiseringen av service mesh avsevĂ€rt. Jag behövde knappt göra nĂ„gonting. I produktion anvĂ€nder vi inte SuperGloo, men för en sĂ„dan uppgift passar det perfekt. Jag var tvungen att köra bokstavligt talat ett par kommandon för varje service mesh. Jag anvĂ€nde tvĂ„ kluster för isolering – ett för Istio och ett för Linkerd.

Experimentet genomfördes pÄ Google Kubernetes Engine. Jag anvÀnde Kubernetes 1.12.7-gke.7 och en nodpool n1-standard-4 med automatisk skalning av noder (minimum 4, maximum 16).

Sedan installerade jag bÄda service mesh frÄn kommandoraden.

Först Linkerd:

$ supergloo install linkerd --name linkerd
+---------+--------------+---------+---------------------------+
| INSTALL |     TYPE     | STATUS  |          DETAILS          |
+---------+--------------+---------+---------------------------+
| linkerd | Linkerd Mesh | Pending | enabled: true             |
|         |              |         | version: stable-2.3.0     |
|         |              |         | namespace: linkerd        |
|         |              |         | mtls enabled: true        |
|         |              |         | auto inject enabled: true |
+---------+--------------+---------+---------------------------+

Sedan Istio:

$ supergloo install istio --name istio --installation-namespace istio-system --mtls=true --auto-inject=true
+---------+------------+---------+---------------------------+
| INSTALL |    TYPE    | STATUS  |          DETAILS          |
+---------+------------+---------+---------------------------+
| istio   | Istio Mesh | Pending | enabled: true             |
|         |            |         | version: 1.0.6            |
|         |            |         | namespace: istio-system   |
|         |            |         | mtls enabled: true        |
|         |            |         | auto inject enabled: true |
|         |            |         | grafana enabled: true     |
|         |            |         | prometheus enabled: true  |
|         |            |         | jaeger enabled: true      |
+---------+------------+---------+---------------------------+

Crash-loop tog en minut, men kontrolpanelet stabiliserede sig efterfĂžlgende.

(BemÊrk: SuperGloo understÞtter kun Istio 1.0.x i Þjeblikket. Jeg gentog eksperimentet med Istio 1.1.3, men sÄ ingen mÊrkbar forskel.)

Konfiguration af automatisk injektion af Istio

For at fĂ„ Istio til at installere sidecar Envoy bruger vi en sidecar-injektor — MutatingAdmissionWebhook. Vi vil ikke diskutere dette i denne artikel. Jeg vil blot sige, at det er en controller, der overvĂ„ger adgangen for alle nye pod'e og dynamisk tilfĂžjer sidecar og initContainer, der er ansvarlig for opgaverne iptables.

Vi i Shopify har skrevet vores egen adgangscontroller til injektion af sidecar, men i denne benchmark brugte jeg den controller, der fÞlger med Istio. Standardcontrolleren injicerer sidecar, nÄr der er et label i navnerummet istio-injection: enabled:

$ kubectl label namespace irs-client-dev istio-injection=enabled
namespace/irs-client-dev labeled

$ kubectl label namespace irs-server-dev istio-injection=enabled
namespace/irs-server-dev labeled

Konfiguration af automatisk injektion af Linkerd

For at konfigurere injektion af sidecar i Linkerd bruger vi annoteringer (jeg tilfĂžjede dem manuelt via kubectl edit.):

metadata:
  annotations:
    linkerd.io/inject: enabled

$ k edit ns irs-server-dev 
namespace/irs-server-dev edited

$ k get ns irs-server-dev -o yaml
apiVersion: v1
kind: Namespace
metadata:
  annotations:
    linkerd.io/inject: enabled
  name: irs-server-dev
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

Simulator for fejltolerance med Istio

Vi har skapat en simuleringsmodell för tillförlitlighet med Istio för att experimentera med trafik unik för Shopify. Vi behövde ett verktyg för att skapa en godtycklig topologi som skulle representera en viss del av grafen av vÄr tjÀnst med dynamisk konfiguration för att modellera specifika arbetsbelastningar.

Shopifys infrastruktur stÄr inför hög belastning under flash-försÀljningar. Under dessa perioder rekommenderar Shopify att sÀljare ofta genomför sÄdana försÀljningar. Stora kunder informerar ibland i förvÀg om en planerad flash-försÀljning. Andra genomför dem ovÀntat för oss nÀr som helst pÄ dygnet.

Vi ville att vÄr simuleringsmodell för tillförlitlighet skulle modellera arbetsflöden som matchar de topologier och arbetsbelastningar som tidigare lett till överbelastning av Shopifys infrastruktur. Huvudsyftet med att anvÀnda service mesh Àr att vi behöver tillförlitlighet och redundans pÄ nÀtverksnivÄ, och det Àr viktigt för oss att service mesh hanterar belastningar som tidigare har pÄverkat tjÀnsternas drift.

I grunden för simuleringsmodellen för tillförlitlighet finns en arbetsnod som fungerar som en nod i service mesh. Arbetsnoden kan stÀllas in statiskt vid start eller dynamiskt via REST API. Vi anvÀnder dynamisk konfiguration av arbetsnoder för att skapa arbetsflöden i form av regressiva tester.

HÀr Àr ett exempel pÄ en sÄdan process:

  • Vi startar 10 servrar som bar en tjĂ€nst som returnerar svaret 200/OK efter 100 ms.
  • Vi startar 10 klienter — varje skickar 100 förfrĂ„gningar per sekund till bar.
  • Var 10:e sekund tar vi bort 1 server och övervakar fel 5xx pĂ„ klienten.

I slutet av arbetsprocessen granskar vi loggar och metrik och kontrollerar om testet har passerat. PÄ sÄ sÀtt lÀr vi oss om prestandan hos vÄr service mesh och genomför ett regressivt test för att kontrollera vÄra antaganden om tillförlitlighet.

(Observera. Vi övervÀger att öppna kÀllkoden för simuleringsmodellen för tillförlitlighet med Istio, men vi Àr inte redo för det Ànnu.)

Simuleringsmodell för tillförlitlighet med Istio för benchmark av service mesh

Vi konfigurerar flera arbetsnoder för simulatorn:

  • irs-client-loadgen: 3 repliker som skickar 100 förfrĂ„gningar per sekund till irs-client.
  • irs-client: 3 repliker som tar emot förfrĂ„gan, vĂ€ntar 100 ms och vidarebefordrar förfrĂ„gan till irs-server.
  • irs-server: 3 repliker som returnerar 200/OK efter 100 ms.

Med denna konfiguration kan vi mĂ€ta en stabil trafikström mellan 9 slutpunkter. Sidecar:er i irs-client-loadgen och irs-server fĂ„r 100 förfrĂ„gningar per sekund, och irs-client — 200 (in- och utgĂ„ende).

Vi spÄrar resursanvÀndningen genom DataDog, eftersom vi inte har en Prometheus-kluster.

Resultat

Kontrollpaneler

Först tittade vi pÄ CPU-konsumtionen.

Benchmarking av CPU-anvÀndning för Istio och Linkerd
Linkerd kontrollpanel ~22 miljarder

Benchmarking av CPU-anvÀndning för Istio och Linkerd
Istio kontrollpanel: ~750 miljarder

Istio kontrollpanelen anvÀnder ungefÀr 35 gÄnger fler processorresurser, Àn Linkerd. SjÀlvklart Àr allt instÀllt pÄ standard, och mycket av processorresurserna hÀr anvÀnds av istio-telemetry (det kan stÀngas av genom att avstÄ frÄn vissa funktioner). Om man tar bort denna komponent fÄr man fortfarande mer Àn 100 miljarder, dvs 4 gÄnger mer, Àn Linkerd.

Sidecar proxy

Sedan kontrollerade vi proxy-anvÀndningen. HÀr bör det finnas ett linjÀrt beroende av antalet förfrÄgningar, men för varje sidecar finns det vissa overhead-kostnader som pÄverkar kurvan.

Benchmarking av CPU-anvÀndning för Istio och Linkerd
Linkerd: ~100 miljarder för irs-client, ~50 miljarder för irs-client-loadgen

Resultaten verkar logiska, eftersom client-proxyn fÄr dubbel sÄ mycket trafik som loadgen-proxyn: för varje utgÄende begÀran frÄn loadgen finns det en ingÄende och en utgÄende begÀran mot client.

Benchmarking av CPU-anvÀndning för Istio och Linkerd
Istio/Envoy: ~155 miljarder för irs-client, ~75 miljarder för irs-client-loadgen

Vi ser liknande resultat för Istio sidecar:er.

Men generellt sett konsumerar Istio/Envoy-proxyn ungefÀr 50% fler processorresurser, Àn Linkerd.

Samma mönster ser vi pÄ serversidan:

Benchmarking av CPU-anvÀndning för Istio och Linkerd
Linkerd: ~50 miljarder för irs-server

Benchmarking av CPU-anvÀndning för Istio och Linkerd
Istio/Envoy: ~80 miljarder för irs-server

PÄ serversidan konsumerar Istio/Envoy sidecar ungefÀr 60% fler processorresurser, Àn Linkerd.

Slutsats

Istio Envoy-proxyn konsumerar över 50% mer CPU Àn Linkerd, pÄ vÄr simulerade arbetsbelastning. Linkerd kontrollpanelen konsumerar mycket mindre resurser Àn Istio, sÀrskilt nÀr det kommer till kÀrnkomponenterna.

Vi funderar fortfarande pÄ hur vi kan minska dessa kostnader. Har du nÄgra idéer, dela gÀrna med dig!

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