ProHoster > blog > Amministrazzjoni > L-ibbilanċjar tat-tagħbija u l-iskala ta' konnessjonijiet ta' ħajja twila f'Kubernetes
L-ibbilanċjar tat-tagħbija u l-iskala ta' konnessjonijiet ta' ħajja twila f'Kubernetes
Dan l-artikolu jgħinek tifhem kif jaħdem l-ibbilanċjar tat-tagħbija f'Kubernetes, x'jiġri meta tiskalja konnessjonijiet b'ħajja twila, u għaliex għandek tikkunsidra l-ibbilanċjar min-naħa tal-klijent jekk tuża HTTP/2, gRPC, RSockets, AMQP, jew protokolli oħra ta' ħajja twila. .
Ftit dwar kif it-traffiku jiġi distribwit mill-ġdid f'Kubernetes
Kubernetes jipprovdi żewġ estrazzjonijiet konvenjenti għall-iskjerament tal-applikazzjonijiet: Servizzi u Deployments.
L-iskjeramenti jiddeskrivu kif u kemm-il kopji tal-applikazzjoni tiegħek għandhom jitħaddmu fi kwalunkwe ħin partikolari. Kull applikazzjoni hija skjerata bħala Pod u hija assenjata indirizz IP.
Is-servizzi huma simili fil-funzjoni għal load balancer. Huma ddisinjati biex iqassmu t-traffiku fuq diversi pods.
Ejja naraw kif jidher.
Fid-dijagramma ta' hawn taħt tista' tara tliet każijiet tal-istess applikazzjoni u load balancer:
Il-load balancer jissejjaħ Servizz u huwa assenjat indirizz IP. Kwalunkwe talba li tkun deħlin tiġi ridiretta lejn wieħed mill-imżiewed:
Ix-xenarju tal-iskjerament jiddetermina n-numru ta' każijiet tal-applikazzjoni. Kważi qatt ma jkollok tespandi direttament taħt:
Kull pod huwa assenjat l-indirizz IP tiegħu stess:
Huwa utli li wieħed jaħseb għas-servizzi bħala ġabra ta' indirizzi IP. Kull darba li taċċessa s-servizz, wieħed mill-indirizzi IP jintgħażel mil-lista u jintuża bħala l-indirizz tad-destinazzjoni.
Jidher bħal dan.
Waslet talba curl 10.96.45.152 lis-servizz:
Is-servizz jagħżel wieħed minn tliet indirizzi tal-pods bħala d-destinazzjoni:
It-traffiku jiġi ridirett lejn pod speċifiku:
Jekk l-applikazzjoni tiegħek tikkonsisti minn frontend u backend, allura jkollok kemm servizz kif ukoll skjerament għal kull wieħed.
Meta l-frontend jagħmel talba lill-backend, m'għandux għalfejn ikun jaf eżattament kemm-il pods iservi l-backend: jista 'jkun hemm wieħed, għaxra jew mija.
Ukoll, il-frontend ma jaf xejn dwar l-indirizzi tal-imżiewed li jservu l-backend.
Meta l-frontend jagħmel talba lill-backend, juża l-indirizz IP tas-servizz backend, li ma jinbidilx.
Dan huwa kif jidher.
Taħt 1 jitlob il-komponent backend intern. Minflok ma tagħżel waħda speċifika għall-backend, tagħmel talba lis-servizz:
Is-servizz jagħżel wieħed mill-backend pods bħala l-indirizz tad-destinazzjoni:
It-traffiku jmur minn Pod 1 għal Pod 5, magħżul mis-servizz:
Taħt l-1 ma jafx eżatt kemm hemm imżiewed bħal taħt il-5 huma moħbija wara s-servizz:
Imma kif eżattament is-servizz iqassam it-talbiet? Jidher li jintuża l-ibbilanċjar round-robin? Ejja insemmu.
Ibbilanċjar fis-servizzi Kubernetes
Is-servizzi Kubernetes ma jeżistux. M'hemm l-ebda proċess għas-servizz li huwa assenjat indirizz IP u port.
Tista' tivverifika dan billi tidħol fi kwalunkwe node fil-cluster u tħaddem il-kmand netstat -ntlp.
Lanqas se tkun tista' ssib l-indirizz IP allokat għas-servizz.
L-indirizz IP tas-servizz jinsab fis-saff ta 'kontroll, fil-kontrollur, u rreġistrat fid-database - etcd. L-istess indirizz jintuża minn komponent ieħor - kube-proxy.
Kube-proxy jirċievi lista ta 'indirizzi IP għas-servizzi kollha u jiġġenera sett ta' regoli iptables fuq kull node fil-cluster.
Dawn ir-regoli jgħidu: "Jekk naraw l-indirizz IP tas-servizz, irridu nimmodifikaw l-indirizz tad-destinazzjoni tat-talba u nibagħtu lil wieħed mill-imżiewed."
L-indirizz IP tas-servizz jintuża biss bħala punt ta’ dħul u ma jiġi moqdi minn ebda proċess li jisma’ dak l-indirizz IP u l-port.
Ejja nħarsu lejn dan.
Ikkunsidra raggruppament ta 'tliet nodi. Kull nodu għandu l-imżiewed:
Il-miżwed marbuta miżbugħin beige huma parti mis-servizz. Minħabba li s-servizz ma jeżistix bħala proċess, jidher bil-griż:
L-ewwel pods jitlob servizz u jrid imur f'wieħed mill-imżiewed assoċjati:
Imma s-servizz ma jeżistix, il-proċess ma jeżistix. Kif taħdem?
Qabel ma t-talba tħalli n-node, tgħaddi mir-regoli iptables:
Ir-regoli iptables jafu li s-servizz ma jeżistix u jissostitwixxu l-indirizz IP tiegħu b'wieħed mill-indirizzi IP tal-imżiewed assoċjati ma' dak is-servizz:
It-talba tirċievi indirizz IP validu bħala l-indirizz tad-destinazzjoni u tiġi pproċessata normalment:
Skont it-topoloġija tan-netwerk, it-talba eventwalment tilħaq il-pod:
Jistgħu l-iptables jgħabbu l-bilanċ?
Le, iptables jintużaw għall-iffiltrar u ma kinux iddisinjati għall-ibbilanċjar.
Madankollu, huwa possibbli li tikteb sett ta 'regoli li jaħdmu bħal pseudo-balancer.
U dan huwa eżattament dak li huwa implimentat f'Kubernetes.
Jekk għandek tliet imżiewed, kube-proxy se jikteb ir-regoli li ġejjin:
Agħżel l-ewwel sub bi probabbiltà ta '33%, inkella mur għar-regola li jmiss.
Agħżel it-tieni waħda bi probabbiltà ta '50%, inkella mur għar-regola li jmiss.
Agħżel it-tielet taħt.
Din is-sistema tirriżulta f'kull pod jintgħażel bi probabbiltà ta' 33%.
U m'hemm l-ebda garanzija li Pod 2 se jintgħażel wara l-Pod 1.
Innota: iptables juża modulu statistiku b'distribuzzjoni każwali. Għalhekk, l-algoritmu tal-ibbilanċjar huwa bbażat fuq għażla każwali.
Issa li tifhem kif jaħdmu s-servizzi, ejja nħarsu lejn xenarji ta' servizz aktar interessanti.
Konnessjonijiet ta' ħajja twila f'Kubernetes ma jiskalawx awtomatikament
Kull talba HTTP mill-frontend sal-backend hija moqdija minn konnessjoni TCP separata, li tinfetaħ u tingħalaq.
Jekk il-frontend jibgħat 100 talba kull sekonda lill-backend, allura jinfetħu u jingħalqu 100 konnessjoni TCP differenti.
Tista' tnaqqas il-ħin u t-tagħbija tal-ipproċessar tat-talbiet billi tiftaħ konnessjoni TCP waħda u tużaha għat-talbiet HTTP sussegwenti kollha.
Il-protokoll HTTP għandu karatteristika msejħa HTTP keep-alive, jew użu mill-ġdid tal-konnessjoni. F'dan il-każ, tintuża konnessjoni TCP waħda biex tibgħat u tirċievi talbiet u tweġibiet HTTP multipli:
Din il-karatteristika mhix attivata awtomatikament: kemm is-server kif ukoll il-klijent għandhom jiġu kkonfigurati kif xieraq.
Is-setup innifsu huwa sempliċi u aċċessibbli għall-biċċa l-kbira tal-lingwi u l-ambjenti ta 'programmar.
Hawn huma xi links għal eżempji f'lingwi differenti:
X'jiġri jekk nużaw keep-alive f'servizz Kubernetes?
Ejja nassumu li kemm il-frontend kif ukoll il-backend jappoġġaw iż-żamma tal-ħajja.
Għandna kopja waħda tal-frontend u tliet kopji tal-backend. Il-frontend jagħmel l-ewwel talba u jiftaħ konnessjoni TCP mal-backend. It-talba tasal fis-servizz, wieħed mill-imżiewed backend jintgħażel bħala l-indirizz tad-destinazzjoni. Il-backend jibgħat tweġiba, u l-frontend jirċeviha.
B'differenza mis-sitwazzjoni tas-soltu fejn il-konnessjoni TCP tingħalaq wara li tirċievi tweġiba, issa tinżamm miftuħa għal aktar talbiet HTTP.
X'jiġri jekk il-frontend jibgħat aktar talbiet lill-backend?
Biex tgħaddi dawn it-talbiet, se tintuża konnessjoni TCP miftuħa, it-talbiet kollha se jmorru għall-istess backend fejn marret l-ewwel talba.
L-iptables m'għandhomx iqassmu mill-ġdid it-traffiku?
Mhux f'dan il-każ.
Meta tinħoloq konnessjoni TCP, din tgħaddi minn regoli iptables, li jagħżlu backend speċifiku fejn se jmur it-traffiku.
Peress li t-talbiet kollha sussegwenti huma fuq konnessjoni TCP diġà miftuħa, ir-regoli iptables m'għadhomx jissejħu.
Ejja naraw kif jidher.
L-ewwel pod jibgħat talba lis-servizz:
Diġà taf x'se jiġri wara. Is-servizz ma jeżistix, iżda hemm regoli iptables li se jipproċessaw it-talba:
Wieħed mill-imżiewed backend se jintgħażel bħala l-indirizz tad-destinazzjoni:
It-talba tilħaq il-pod. F'dan il-punt, se tiġi stabbilita konnessjoni TCP persistenti bejn iż-żewġ imżiewed:
Kwalunkwe talba sussegwenti mill-ewwel pod se tgħaddi mill-konnessjoni diġà stabbilita:
Ir-riżultat huwa ħin ta 'rispons aktar mgħaġġel u throughput ogħla, iżda titlef il-kapaċità li tiskala l-backend.
Anke jekk għandek żewġ imżiewed fil-backend, b'konnessjoni kostanti, it-traffiku dejjem imur lejn wieħed minnhom.
Dan jista 'jiġi ffissat?
Peress li Kubernetes ma jafx kif jibbilanċja konnessjonijiet persistenti, dan il-kompitu jaqa' f'idejk.
Is-servizzi huma ġabra ta’ indirizzi IP u portijiet imsejħa endpoints.
L-applikazzjoni tiegħek tista' tikseb lista ta' endpoints mis-servizz u tiddeċiedi kif tqassam it-talbiet bejniethom. Tista 'tiftaħ konnessjoni persistenti għal kull pod u tibbilanċja talbiet bejn dawn il-konnessjonijiet billi tuża round-robin.
Il-kodiċi tan-naħa tal-klijent li huwa responsabbli għall-ibbilanċjar għandu jsegwi din il-loġika:
Ikseb lista ta' endpoints mis-servizz.
Iftaħ konnessjoni persistenti għal kull endpoint.
Meta tkun trid issir talba, uża waħda mill-konnessjonijiet miftuħa.
Aġġorna regolarment il-lista ta 'endpoints, oħloq oħrajn ġodda jew agħlaq konnessjonijiet persistenti qodma jekk il-lista tinbidel.
Dan huwa kif se jidher.
Minflok l-ewwel pod jibgħat it-talba lis-servizz, tista’ tibbilanċja t-talbiet min-naħa tal-klijent:
Ikollok bżonn tikteb kodiċi li jistaqsi liema pods huma parti mis-servizz:
Ladarba jkollok il-lista, issalvaha fuq in-naħa tal-klijent u użaha biex tikkonnettja mal-miżwed:
Int responsabbli għall-algoritmu tal-ibbilanċjar tat-tagħbija:
Issa tqum il-mistoqsija: din il-problema tapplika biss għal HTTP keep-alive?
Ibbilanċjar tat-tagħbija fuq in-naħa tal-klijent
HTTP mhuwiex l-uniku protokoll li jista 'juża konnessjonijiet TCP persistenti.
Jekk l-applikazzjoni tiegħek tuża database, allura konnessjoni TCP ma tinfetaħx kull darba li jkollok bżonn tagħmel talba jew tirkupra dokument mid-database.
Minflok, tinfetaħ u tintuża konnessjoni TCP persistenti mad-database.
Jekk id-database tiegħek hija skjerata fuq Kubernetes u l-aċċess huwa pprovdut bħala servizz, allura tiltaqa 'ma' l-istess problemi deskritti fit-taqsima preċedenti.
Replika tad-database waħda se tkun aktar mgħobbija mill-oħrajn. Kube-proxy u Kubernetes mhux se jgħinu biex jibbilanċjaw il-konnessjonijiet. Trid tieħu ħsieb li tibbilanċja l-mistoqsijiet fid-database tiegħek.
Skont liema librerija tuża biex tikkonnettja mad-database, jista 'jkollok għażliet differenti biex issolvi din il-problema.
Hawn taħt hawn eżempju ta 'aċċess għal cluster ta' database MySQL minn Node.js:
var mysql = require('mysql');
var poolCluster = mysql.createPoolCluster();
var endpoints = /* retrieve endpoints from the Service */
for (var [index, endpoint] of endpoints) {
poolCluster.add(`mysql-replica-${index}`, endpoint);
}
// Make queries to the clustered MySQL database
Hemm ħafna protokolli oħra li jużaw konnessjonijiet TCP persistenti:
WebSockets u WebSockets assigurati
HTTP / 2
gRPC
RSockets
AMQP
Għandek tkun diġà familjari mal-biċċa l-kbira ta 'dawn il-protokolli.
Imma jekk dawn il-protokolli huma tant popolari, għaliex ma jkunx hemm soluzzjoni ta 'ibbilanċjar standardizzata? Għaliex jeħtieġ li l-loġika tal-klijent tinbidel? Hemm soluzzjoni nattiva ta' Kubernetes?
Kube-proxy u iptables huma ddisinjati biex ikopru l-aktar każijiet ta' użu komuni meta jiġu skjerati għal Kubernetes. Dan huwa għall-konvenjenza.
Jekk qed tuża servizz tal-web li jesponi REST API, int xorti - f'dan il-każ, konnessjonijiet TCP persistenti ma jintużawx, tista 'tuża kwalunkwe servizz Kubernetes.
Imma ladarba tibda tuża konnessjonijiet TCP persistenti, ikollok issib kif tqassam it-tagħbija b'mod uniformi fuq il-backends. Kubernetes ma fihx soluzzjonijiet lesti għal dan il-każ.
Madankollu, ċertament hemm għażliet li jistgħu jgħinu.
Ibbilanċjar ta 'konnessjonijiet ta' ħajja twila f'Kubernetes
Hemm erba' tipi ta' servizzi f'Kubernetes:
ClusterIP
Node Port
LoadBalancer
Bla ras
L-ewwel tliet servizzi joperaw ibbażati fuq indirizz IP virtwali, li jintuża minn kube-proxy biex jibni regoli iptables. Iżda l-bażi fundamentali tas-servizzi kollha hija servizz bla ras.
Is-servizz bla ras m'għandux indirizz IP assoċjat miegħu u jipprovdi biss mekkaniżmu għall-irkupru ta 'lista ta' indirizzi IP u portijiet tal-imżiewed (endpoints) assoċjati miegħu.
Is-servizzi kollha huma bbażati fuq is-servizz bla ras.
Is-servizz ClusterIP huwa servizz bla ras b'xi żidiet:
Is-saff ta 'ġestjoni jassenjah indirizz IP.
Kube-proxy jiġġenera r-regoli iptables meħtieġa.
B'dan il-mod tista 'tinjora kube-proxy u tuża direttament il-lista ta' endpoints miksuba mis-servizz bla ras biex tibbilanċja l-applikazzjoni tiegħek.
Imma kif nistgħu nżidu loġika simili għall-applikazzjonijiet kollha skjerati fil-cluster?
Jekk l-applikazzjoni tiegħek hija diġà skjerata, dan il-kompitu jista 'jidher impossibbli. Madankollu, hemm għażla alternattiva.
Service Mesh ser jgħinek
Probabilment diġà ndunajt li l-istrateġija tal-ibbilanċjar tat-tagħbija fuq in-naħa tal-klijent hija pjuttost standard.
Meta tibda l-applikazzjoni, din:
Iġib lista ta' indirizzi IP mis-servizz.
Jiftaħ u jżomm pool ta 'konnessjoni.
Taġġorna perjodikament il-pool billi żżid jew tneħħi endpoints.
Ladarba l-applikazzjoni tkun trid tagħmel talba, din:
Jagħżel konnessjoni disponibbli billi tuża xi loġika (eż. round-robin).
Teżegwixxi t-talba.
Dawn il-passi jaħdmu kemm għall-konnessjonijiet WebSockets, gRPC, u AMQP.
Tista' tissepara din il-loġika f'librerija separata u tużaha fl-applikazzjonijiet tiegħek.
Madankollu, tista 'tuża malji tas-servizz bħal Istio jew Linkerd minflok.
Service Mesh iżid l-applikazzjoni tiegħek bi proċess li:
Tfittxijiet awtomatikament għall-indirizzi IP tas-servizz.
Service Mesh jgħin fil-ġestjoni tat-traffiku fi ħdan il-cluster, iżda huwa pjuttost intensiv fir-riżorsi. Għażliet oħra qed jużaw libreriji ta’ partijiet terzi bħal Netflix Ribbon jew prokuri programmabbli bħal Envoy.
X'jiġri jekk tinjora kwistjonijiet ta' bilanċ?
Tista' tagħżel li ma tużax l-ibbilanċjar tat-tagħbija u xorta ma tinnota l-ebda tibdil. Ejja nħarsu lejn ftit xenarji tax-xogħol.
Jekk għandek aktar klijenti minn servers, din mhix problema daqshekk kbira.
Ejja ngħidu li hemm ħames klijenti li jgħaqqdu żewġ servers. Anke jekk ma jkunx hemm ibbilanċjar, iż-żewġ servers se jintużaw:
Il-konnessjonijiet jistgħu ma jitqassmux b'mod ugwali: forsi erba' klijenti konnessi mal-istess server, iżda hemm ċans tajjeb li jintużaw iż-żewġ servers.
L-aktar problematiku huwa x-xenarju oppost.
Jekk għandek inqas klijenti u aktar servers, ir-riżorsi tiegħek jistgħu jkunu sottoutilizzati u se jidher ostakolu potenzjali.
Ejja ngħidu li hemm żewġ klijenti u ħames servers. Fl-aħjar każ, se jkun hemm żewġ konnessjonijiet permanenti għal żewġ servers minn ħamsa.
Is-servers li jifdal se jkunu inattivi:
Jekk dawn iż-żewġ servers ma jistgħux jimmaniġġjaw it-talbiet tal-klijenti, l-iskala orizzontali ma tgħinx.
Konklużjoni
Is-servizzi Kubernetes huma ddisinjati biex jaħdmu fil-biċċa l-kbira tax-xenarji standard tal-applikazzjoni tal-web.
Madankollu, ladarba tibda taħdem bi protokolli ta 'applikazzjoni li jużaw konnessjonijiet TCP persistenti, bħal databases, gRPC jew WebSockets, is-servizzi m'għadhomx adattati. Kubernetes ma jipprovdix mekkaniżmi interni għall-ibbilanċjar tal-konnessjonijiet TCP persistenti.
Dan ifisser li trid tikteb applikazzjonijiet b'bilanċ min-naħa tal-klijent f'moħħok.