
Sissejuhatus
Meie tegelevad Istio kĂ€itamisega teenuste vĂ”rku. Ăldiselt on kĂ”ik okei, vĂ€lja arvatud ĂŒks asi: see on kallis.
Uues 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 () 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: .
Teenuste vÔrgu paigaldamine
Esmalt paigaldasin klastrisse :
$ 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 labeledLinkerd 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: ActiveIstio 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 . 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
barteenust, mis tagastab vastuse200/OK100 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
5xxkliendi 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 sekundisirs-client.irs-client: 3 koopiat, mis saavad pÀringu, ootavad 100 ms ja suunavad pÀringu edasiirs-server.irs-server: 3 koopiat, mis tagastavad200/OK100 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 , 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.
Linkerdi armatuurlaud ~22 millijÀrku
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.
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.
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:
Linkerd: ~50 millijÀrku irs-server 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
