CPU tarbimise benchmark Istio ja Linkerd jaoks

CPU tarbimise benchmark Istio ja Linkerd jaoks

Sissejuhatus

Meie Shopify tegelevad Istio kĂ€itamisega teenuste vĂ”rku. Üldiselt on kĂ”ik okei, vĂ€lja arvatud ĂŒks asi: see on kallis.

Uues avalikustatud bÀnkmÀrgid Istio kohta öeldakse:

Istio 1.1 puhul tarbib vaheproksi umbes 0,6 vCPU (virtuaalset tuuma) 1000 pÀringu kohta sekundis.

Esimeses piirkonnas teenuste vĂ”rgus (iga ĂŒhenduse poole jaoks 2 vaheproksi) vajame 1200 tuuma ainult vaheproksi jaoks, tuginedes miljoni pĂ€ringu kohta sekundis. Google'i hinnakalkulaatori kohaselt maksab see umbes 40 dollarit / kuu / tuum konfiguratsioonile n1-standard-64, see tĂ€hendab, et see piirkond maksab meile ĂŒle 50 000 dollari kuus miljoni pĂ€ringu kohta sekundis.

Ivan Sim (Ivan Sim) visualiseeris teenuste vÔrgu latentsust eelmisel aastal ja lubas sarnast hinnangut mÀlu ja protsessori kohta, kuid ei saanud sellega hakkama:

Tundub, et values-istio-test.yaml suurendab protsessori pÀringute arvu mÀrk significantly. Kui ma Ôigesti arvasin, on vaja umbes 24 protsessorituuma juhtpaneeli ja 0,5 CPU iga vaheproksi jaoks. Mul ei ole nii palju. Kordan teste, kui saan rohkem ressursse.

Soovisin ise kontrollida, kui sarnased on Istio nÀitajad teiste avatud lÀhtekoodiga teenuste vÔrgu lahendustega: Linkerd.

Teenuste vÔrgu paigaldamine

Esmalt paigaldasin klastrisse 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!

Kasutasin SuperGloo, kuna see lihtsustab teenuste vĂ”rgu alglaadimist oluliselt. Mul ei olnud peaaegu midagi teha. Tootmises me SuperGloo ei kasuta, kuid sellise ĂŒlesande jaoks sobib see suurepĂ€raselt. pidin rakendama vaid paar kĂ€sku iga teenuste vĂ”rgu jaoks. Kasutasin kahte klastri eraldamiseks — ĂŒhe Istio ja Linkerd jaoks.

Eksperimenti viidi lÀbi Google Kubernetes Engine'is. Kasutasin Kubernetesit 1.12.7-gke.7 ja sÔlmede pinda n1-standard-4 automaatse sÔlmede skaleerimisega (miinimum 4, maksimum 16).

Siis paigaldasin mÔlemad teenuste vÔrgud kÀsurealt.

Esmalt 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 |
+---------+--------------+---------+---------------------------+

JĂ€rgneb 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 kestis mitu minutit ja seejÀrel juhtpaneel stabiliseerus.

(MÀrkus. SuperGloo toetab praegu ainult Istio 1.0.x. Kordasin katset Istio 1.1.3-ga, kuid mingit mÀrkimisvÀÀrset erinevust ei mÀrganud.)

Istio automaatse sisestamise seadistamine

Kuna Istio seadistab sidecar Envoy, kasutame sidecar-injektorit — MutatingAdmissionWebhook. Me ei rÀÀgi sellest artiklis. Ütlen vaid, et see on kontroller, mis jĂ€lgib kĂ”igi uute pod'ide juurdepÀÀsu ja dĂŒnaamiliselt lisab sidecar ja initContainer, mis vastutab ĂŒlesannete eest iptables.

Me Shopify's kirjutasime oma ligipÀÀsukontrolleri sidecar'ide sisestamiseks, kuid selles benchmark'is kasutasin Istio kaasasolevat kontrollerit. Vaikimisi kontroller sisestab sidecar'id, kui nimeses on silt 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

Linkerd automaatse sisestamise seadistamine

Linkerdi sidecar'ide sisestamise seadmiseks kasutame annotatsioone (lisasin need kÀsitsi kaudu 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

Istio talitlusekatsetaja

Oleme loonud Istio tipptasemel simulaatori, et katsetada Shopify'le spetsiifilist liiklust. Me vajame tööriista, mis vĂ”imaldab luua suvalisi topoloogiaid, mis esindavad meie teenuse graafi teatud osa koos dĂŒnaamilise seadistusega konkreetsete koormuste modelleerimiseks.

Shopify infrastruktuur kogeb flash-mĂŒĂŒkide ajal suurt koormust. Samuti soovitab Shopify mĂŒĂŒjatel selliseid mĂŒĂŒke sagedamini korraldada. Suuremad kliendid teavitavad mĂ”nikord ette planeeritud flash-mĂŒĂŒgist. Teised korraldavad neid ootamatult igal kellaajal.

Soovisime, et meie tipptasemel simulaator modelleeriks tööprotsesse, mis vastavad topoloogiatele ja koormustele, mis on varasemalt pĂ”hjustanud Shopify infrastruktuuri ĂŒlekoormust. Service mesh'i kasutamise peamine eesmĂ€rk – me vajame usaldusvÀÀrsust ja tĂ”rketaluvust vĂ”rgu tasandil ning on oluline, et service mesh suudaks tĂ”husalt hakkama saada koormustega, mis on varem teenuste tööd hĂ€irinud.

Tipptasemel simulaatori aluseks on töönĂ”lv, mis toimib service mesh'i sĂ”lmena. TöönĂ”lva saab seadistada staatiliselt kĂ€ivitamise hetkel vĂ”i dĂŒnaamiliselt REST API kaudu. Kasutame töötavate nodede dĂŒnaamilist seadistust, et luua tööprotsesse regressioonitestide vormis.

Siin on sellise protsessi nÀide:

  • KĂ€ivitame 10 serverit kui bar teenust, mis tagastab vastuse 200/OK 100 ms pĂ€rast.
  • KĂ€ivitame 10 klienti – igaĂŒks saadab 100 pĂ€ringut sekundis bar.
  • Iga 10 sekundi jĂ€rel eemaldame 1 serveri, jĂ€lgime vigu 5xx kliendi peal.

Protsessi lÔpus uurime logisid ja mÔÔtmeid ning kontrollime, kas test on lÀbitud. Nii saame teada meie service mesh'i tulemuslikkusest ja teostame regressioonitesti, et kontrollida meie oletusi tÔrketaluvuse kohta.

(MÀrkus. MÔtleme, et avame Istio tipptasemel simulaatori lÀhtekoodi, kuid hetkel pole me sellega veel valmis.)

Istio tipptasemel simulaator service mesh'i testimiseks

Seadistame mitmeid simulaatori töötavaid sÔlmi:

  • irs-client-loadgen: 3 koopiat, mis saadavad 100 pĂ€ringut sekundis irs-client.
  • irs-client: 3 koopiat, mis saavad pĂ€ringu, ootavad 100 ms ja suunavad pĂ€ringu edasi irs-server.
  • irs-server: 3 koopiat, mis tagastavad 200/OK 100 ms pĂ€rast.

Sellise konfiguratsiooniga saame mÔÔta stabiilset liiklust 9 lĂ”pppunkti vahel. Sidecar'id irs-client-loadgen ja irs-server saavad 100 pĂ€ringut sekundis, ja irs-client — 200 (sisse- ja vĂ€ljaminevad).

Kasutame ressursside jÀlgimiseks DataDog, kuna meil ei ole Prometheuse klastrit.

tulemused nÀitasid ainult nelja ebaolulise koodibloki kattuvust, mis olid tingitud POSIX ja ANSI C nÔuetest.

Juhtpaneelid

Esmalt uurisime CPU tarbimist.

CPU tarbimise benchmark Istio ja Linkerd jaoks
Linkerdi armatuurlaud ~22 millijÀrku

CPU tarbimise benchmark Istio ja Linkerd jaoks
Istio armatuurlaud: ~750 millijÀrku

Istio armatuurlaud kasutab umbes 35 korda rohkem protsessori ressursse, kui Linkerd. Loomulikult on kĂ”ik vaikeseaded ja palju protsessori ressursse tarbib istio-telemetry (seda saab keelata, loobudes mĂ”nest funktsioonist). Kui see komponent eemaldada, jÀÀb ikkagi ĂŒle 100 millijĂ€rgu, st 4 korda rohkem, kui Linkerd.

Sidecar proxy

SeejÀrel kontrollisime proxy kasutamist. Siin peaks olema lineaarne sÔltuvus pÀringute arvust, kuid iga sidecar'i puhul on mÔned kulud, mis mÔjutavad kÔverat.

CPU tarbimise benchmark Istio ja Linkerd jaoks
Linkerd: ~100 millijÀrku irs-client jaoks, ~50 millijÀrku irs-client-loadgen'i jaoks

Tulemused nĂ€ivad olevat loogilised, kuna client proxy saab kaks korda rohkem liiklust kui loadgen proxy: iga vĂ€ljamineva pĂ€ringu kohta loadgen'ilt on client'il ĂŒks sisenev ja ĂŒks vĂ€ljuv.

CPU tarbimise benchmark Istio ja Linkerd jaoks
Istio/Envoy: ~155 millijÀrku irs-client jaoks, ~75 millijÀrku irs-client-loadgen'i jaoks

NĂ€eme sarnaseid tulemusi Istio sidecar'ide puhul.

Kuid ĂŒldiselt tarbivad Istio/Envoy proxy'd umbes 50% rohkem protsessori ressursse, kui Linkerd.

Sama mustrit nĂ€eme serveri kĂŒljel:

CPU tarbimise benchmark Istio ja Linkerd jaoks
Linkerd: ~50 millijÀrku irs-server jaoks

CPU tarbimise benchmark Istio ja Linkerd jaoks
Istio/Envoy: ~80 millijÀrku irs-server jaoks

Serveri kĂŒljel tarbib Istio/Envoy sidecar umbes 60% rohkem protsessori ressursse, kui Linkerd.

KokkuvÔte

Istio Envoy proxy tarbib meie simuleeritud töökoormuse puhul 50+% rohkem CPU-d kui Linkerd. Linkerdi armatuurlaud tarbib palju vÀhem ressursse kui Istio, eriti pÔhi komponentide osas.

Me mÔtleme endiselt, kuidas neid kulusid vÀhendada. Kui teil on ideid, jagage neid!

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