Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes
Atik sa a pral ede w konprann ki jan balans chaj ap travay nan Kubernetes, kisa k ap pase lè w ap monte koneksyon ki dire lontan, epi poukisa ou ta dwe konsidere balans bò kliyan si w itilize HTTP/2, gRPC, RSockets, AMQP oswa lòt pwotokòl ki dire lontan. . 

Yon ti kras sou fason trafik yo redistribiye nan Kubernetes 

Kubernetes bay de abstraksyon pratik pou deplwaye aplikasyon yo: Sèvis ak Deplwaman.

Deplwaman yo dekri kijan ak konbyen kopi aplikasyon w lan ta dwe kouri nan nenpòt ki lè. Chak aplikasyon deplwaye kòm yon Pod epi yo asiyen yon adrès IP.

Sèvis yo sanble nan fonksyon ak yon balans chaj. Yo fèt pou distribye trafik atravè plizyè gous.

Ann wè sa li sanble.

  1. Nan dyagram ki anba a ou ka wè twa ka menm aplikasyon an ak yon balans chaj:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  2. Balanse chaj la rele yon Sèvis epi yo bay yon adrès IP. Nenpòt demann k ap vini yo redireksyon sou youn nan gous yo:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  3. Senaryo deplwaman an detèmine kantite ka aplikasyon an. Ou pral prèske pa janm oblije elaji dirèkteman anba:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  4. Yo bay chak gous pwòp adrès IP li:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Li itil pou w panse sèvis yo kòm yon koleksyon adrès IP. Chak fwa ou jwenn aksè nan sèvis la, youn nan adrès IP yo chwazi nan lis la epi yo itilize kòm adrès destinasyon an.

Li sanble sa a.

  1. Yo resevwa yon demann curl 10.96.45.152 nan sèvis la:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  2. Sèvis la chwazi youn nan twa adrès gous kòm destinasyon an:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  3. Trafik redireksyon nan yon gous espesifik:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Si aplikasyon w lan konsiste de yon entèfas ak yon backend, Lè sa a, w ap gen tou de yon sèvis ak yon deplwaman pou chak.

Lè frontend la fè yon demann nan backend la, li pa bezwen konnen egzakteman konbyen gous backend la sèvi: ta ka gen youn, dis, oswa yon santèn.

Epitou, frontend la pa konnen anyen sou adrès gous yo sèvi backend la.

Lè frontend la fè yon demann nan backend la, li itilize adrès IP sèvis backend la, ki pa chanje.

Sa a se sa li sanble.

  1. Anba 1 demann eleman backend entèn la. Olye pou yo chwazi yon sèl espesifik pou backend la, li fè yon demann nan sèvis la:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  2. Sèvis la chwazi youn nan gous backend yo kòm adrès destinasyon an:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  3. Trafik ale soti nan Pod 1 a Pod 5, sèvis la chwazi:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  4. Anba 1 pa konnen egzakteman konbyen gous tankou anba 5 ki kache dèyè sèvis la:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Men, ki jan egzakteman sèvis la distribye demann? Li sanble tankou balanse wonn-robin yo itilize? Ann kalkile li. 

Balanse nan sèvis Kubernetes

Sèvis Kubernetes pa egziste. Pa gen okenn pwosesis pou sèvis la ki asiyen yon adrès IP ak pò.

Ou ka verifye sa lè w konekte nan nenpòt ne nan gwoup la epi kouri lòd netstat -ntlp la.

Ou p'ap menm ka jwenn adrès IP atribye ba sèvis la.

Adrès IP sèvis la sitiye nan kouch kontwòl la, nan kontwolè a, epi li anrejistre nan baz done a - etcd. Se menm adrès la itilize pa yon lòt eleman - kube-proxy.
Kube-proxy resevwa yon lis adrès IP pou tout sèvis epi jenere yon seri règ iptables sou chak ne nan gwoup la.

Règ sa yo di: "Si nou wè adrès IP sèvis la, nou bezwen modifye adrès destinasyon demann lan epi voye li nan youn nan gous yo."

Se adrès IP sèvis la itilize sèlman kòm yon pwen antre epi yo pa sèvi ak okenn pwosesis koute adrès IP ak pò sa a.

Ann gade sa

  1. Konsidere yon gwoup twa nœuds. Chak ne gen gous:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  2. Mare gous ki pentire bèlj fè pati sèvis la. Paske sèvis la pa egziste kòm yon pwosesis, li montre an gri:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  3. Premye gous la mande yon sèvis epi li dwe ale nan youn nan gous ki asosye yo:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  4. Men sèvis la pa egziste, pwosesis la pa egziste. Ki jan li travay?

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  5. Anvan demann lan kite ne la, li ale nan règ iptables yo:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  6. Règ iptables yo konnen ke sèvis la pa egziste epi ranplase adrès IP li a ak youn nan adrès IP gous ki asosye ak sèvis sa a:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  7. Demann lan resevwa yon adrès IP valab kòm adrès destinasyon an epi yo trete nòmalman:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  8. Tou depan de topoloji rezo a, demann lan evantyèlman rive nan gous la:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Èske iptables ka chaje balans?

Non, iptables yo itilize pou filtraj epi yo pa fèt pou balanse.

Sepandan, li posib yo ekri yon seri règ ki travay tankou pseudo-balancer.

Ak sa a se egzakteman sa ki aplike nan Kubernetes.

Si ou gen twa gous, kube-proxy pral ekri règ sa yo:

  1. Chwazi premye sub la ak yon pwobabilite 33%, otreman ale nan pwochen règ la.
  2. Chwazi dezyèm lan ak yon pwobabilite 50%, otreman ale nan pwochen règ la.
  3. Chwazi twazyèm anba a.

Sistèm sa a lakòz chak gous yo chwazi ak yon pwobabilite 33%.

Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Epi pa gen okenn garanti ke Pod 2 pral chwazi apre Pod 1.

Note: iptables itilize yon modil estatistik ak distribisyon o aza. Kidonk, algorithm balanse a baze sou seleksyon o aza.

Kounye a ke ou konprann ki jan sèvis yo travay, an n gade nan senaryo sèvis ki pi enteresan.

Koneksyon ki dire lontan nan Kubernetes pa echèl pa default

Chak demann HTTP soti nan frontend a nan backend la sèvi pa yon koneksyon TCP separe, ki louvri epi fèmen.

Si entèfas la voye 100 demann pa segonn nan backend la, Lè sa a, 100 diferan koneksyon TCP yo louvri epi fèmen.

Ou ka diminye tan pwosesis demann ak chaj lè w louvri yon koneksyon TCP epi sèvi ak li pou tout demann HTTP ki vin apre yo.

Pwotokòl HTTP a gen yon karakteristik ki rele HTTP kenbe-viv, oswa reitilizasyon koneksyon. Nan ka sa a, yo itilize yon sèl koneksyon TCP pou voye ak resevwa plizyè demann HTTP ak repons:

Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Karakteristik sa a pa aktive pa default: tou de sèvè a ak kliyan yo dwe configuré kòmsadwa.

Konfigirasyon nan tèt li se senp epi aksesib pou pifò langaj pwogramasyon ak anviwònman.

Men kèk lyen ki mennen nan egzanp nan diferan lang:

Kisa k ap pase si nou itilize kenbe-vivan nan yon sèvis Kubernetes?
Ann sipoze ke tou de entèfas ak backend sipòte kenbe-viv.

Nou gen yon kopi fasad la ak twa kopi backend la. Frontend la fè premye demann lan epi ouvè yon koneksyon TCP ak backend la. Demann lan rive nan sèvis la, youn nan gous backend yo chwazi kòm adrès destinasyon an. Backend la voye yon repons, epi frontend la resevwa li.

Kontrèman ak sitiyasyon abityèl kote koneksyon TCP la fèmen apre li fin resevwa yon repons, kounye a li kenbe ouvè pou plis demann HTTP.

Kisa k ap pase si fasad la voye plis demann nan backend la?

Pou voye demann sa yo, yo pral itilize yon koneksyon TCP ouvè, tout demann yo pral ale nan menm backend kote premye demann lan te ale.

Èske iptables pa ta dwe redistribiye trafik la?

Pa nan ka sa a.

Lè yo kreye yon koneksyon TCP, li ale nan règ iptables, ki chwazi yon backend espesifik kote trafik la pral ale.

Depi tout demann ki vin apre yo sou yon koneksyon TCP ki deja louvri, règ iptables yo pa rele ankò.

Ann wè sa li sanble.

  1. Premye gous la voye yon demann bay sèvis la:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  2. Ou deja konnen sa ki pral rive apre. Sèvis la pa egziste, men gen règ iptables ki pral trete demann lan:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  3. Youn nan gous backend yo pral chwazi kòm adrès destinasyon an:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  4. Demann lan rive nan gous la. Nan pwen sa a, yo pral etabli yon koneksyon TCP ki pèsistan ant de gous yo:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  5. Nenpòt demann ki vin apre soti nan premye gous la pral pase nan koneksyon ki deja etabli:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Rezilta a se pi rapid tan repons ak pi gwo debi, men ou pèdi kapasite nan echèl backend la.

Menm si ou gen de gous nan backend la, ak yon koneksyon konstan, trafik ap toujou ale nan youn nan yo.

Èske sa ka ranje?

Depi Kubernetes pa konnen ki jan yo balanse koneksyon ki pèsistan, travay sa a tonbe nan men ou.

Sèvis yo se yon koleksyon adrès IP ak pò yo rele pwen final.

Aplikasyon w lan ka jwenn yon lis pwen final nan sèvis la epi deside kijan pou distribye demann yo ant yo. Ou ka louvri yon koneksyon ki pèsistan nan chak gous ak demann balans ant koneksyon sa yo lè l sèvi avèk round-robin.

Oswa aplike plis algoritm balanse konplèks.

Kòd bò kliyan ki responsab balans lan ta dwe swiv lojik sa a:

  1. Jwenn yon lis pwen final nan sèvis la.
  2. Louvri yon koneksyon ki pèsistan pou chak pwen final.
  3. Lè yon demann bezwen fè, sèvi ak youn nan koneksyon ki louvri yo.
  4. Regilyèman mete ajou lis pwen final yo, kreye nouvo oswa fèmen ansyen koneksyon ki pèsistan si lis la chanje.

Sa a se sa li pral sanble.

  1. Olye pou premye gous la voye demann lan nan sèvis la, ou ka balanse demann sou bò kliyan an:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  2. Ou bezwen ekri kòd ki mande ki gous ki fè pati sèvis la:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  3. Yon fwa ou gen lis la, sove li sou bò kliyan epi sèvi ak li pou konekte avèk gous yo:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

  4. Ou responsab algorithm balanse chaj la:

    Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Koulye a, kesyon an rive: èske pwoblèm sa a sèlman aplike nan HTTP kenbe-vivan?

Balanse chaj kliyan-bò

HTTP se pa sèlman pwotokòl ki ka itilize koneksyon TCP ki pèsistan.

Si aplikasyon w lan sèvi ak yon baz done, Lè sa a, yon koneksyon TCP pa louvri chak fwa ou bezwen fè yon demann oswa rekipere yon dokiman nan baz done a. 

Olye de sa, yon koneksyon TCP ki pèsistan nan baz done a louvri epi yo itilize.

Si baz done ou a deplwaye sou Kubernetes epi yo bay aksè kòm yon sèvis, Lè sa a, ou pral rankontre menm pwoblèm ki dekri nan seksyon anvan an.

Yon kopi baz done yo pral plis chaje pase lòt yo. Kube-proxy ak Kubernetes pa pral ede balanse koneksyon. Ou dwe pran swen pou balanse demann yo nan baz done ou a.

Tou depan de ki bibliyotèk ou itilize pou konekte ak baz done a, ou ka gen diferan opsyon pou rezoud pwoblèm sa a.

Anba la a se yon egzanp aksè nan yon gwoup baz done MySQL soti nan 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

Gen anpil lòt pwotokòl ki itilize koneksyon TCP ki pèsistan:

  • WebSockets ak WebSockets an sekirite
  • HTTP / 2
  • gRPC
  • RSockets
  • AMQP

Ou ta dwe deja abitye ak pi fò nan pwotokòl sa yo.

Men, si pwotokòl sa yo tèlman popilè, poukisa pa gen yon solisyon estanda balanse? Poukisa lojik kliyan an bezwen chanje? Èske gen yon solisyon natif natal Kubernetes?

Kube-proxy ak iptables yo fèt pou kouvri ka itilizasyon ki pi komen lè yo deplwaye nan Kubernetes. Sa a se pou konvenyans.

Si w ap itilize yon sèvis entènèt ki ekspoze yon API REST, ou gen chans - nan ka sa a, koneksyon TCP ki pèsistan yo pa itilize, ou ka itilize nenpòt sèvis Kubernetes.

Men, yon fwa ou kòmanse sèvi ak koneksyon TCP ki pèsistan, ou pral oblije konnen ki jan yo respire distribye chay la atravè backend yo. Kubernetes pa gen solisyon pare pou ka sa a.

Sepandan, gen sètènman opsyon ki ka ede.

Balanse koneksyon ki dire lontan nan Kubernetes

Gen kat kalite sèvis nan Kubernetes:

  1. ClusterIP
  2. NodePort
  3. LoadBalancer
  4. Dekapite

Twa premye sèvis yo opere ki baze sou yon adrès IP vityèl, ki itilize pa kube-proxy pou konstwi règ iptables. Men, baz fondamantal tout sèvis se yon sèvis san tèt.

Sèvis san tèt la pa gen okenn adrès IP ki asosye ak li epi sèlman bay yon mekanis pou rekipere yon lis adrès IP ak pò gous yo (endpoints) ki asosye ak li.

Tout sèvis yo baze sou sèvis san tèt la.

Sèvis ClusterIP la se yon sèvis san tèt ak kèk adisyon: 

  1. Kouch jesyon an bay li yon adrès IP.
  2. Kube-proxy jenere règ iptables ki nesesè yo.

Nan fason sa a ou ka inyore kube-proxy epi dirèkteman sèvi ak lis pwen final yo jwenn nan sèvis la san tèt chaje balans aplikasyon w lan.

Men, ki jan nou ka ajoute lojik menm jan an nan tout aplikasyon deplwaye nan gwoup la?

Si aplikasyon w lan deja deplwaye, travay sa a ka sanble enposib. Sepandan, gen yon opsyon altènatif.

Sèvis may ap ede ou

Ou te pwobableman deja remake ke estrateji balanse chaj kliyan-bò se byen estanda.

Lè aplikasyon an kòmanse, li:

  1. Jwenn yon lis adrès IP nan sèvis la.
  2. Ouvè epi kenbe yon pisin koneksyon.
  3. Mete ajou pisin lan detanzantan lè yo ajoute oswa retire pwen final yo.

Yon fwa aplikasyon an vle fè yon demann, li:

  1. Chwazi yon koneksyon ki disponib lè l sèvi avèk kèk lojik (egzanp round-robin).
  2. Egzekite demann lan.

Etap sa yo travay pou tou de koneksyon WebSockets, gRPC ak AMQP.

Ou ka separe lojik sa a nan yon bibliyotèk separe epi sèvi ak li nan aplikasyon w yo.

Sepandan, ou ka itilize may sèvis tankou Istio oswa Linkerd pito.

Service Mesh ogmante aplikasyon w lan ak yon pwosesis ki:

  1. Otomatikman chèche adrès IP sèvis yo.
  2. Tès koneksyon tankou WebSockets ak gRPC.
  3. Balanse demann lè l sèvi avèk pwotokòl ki kòrèk la.

Service Mesh ede jere trafik nan gwoup la, men li gen anpil resous. Lòt opsyon ap itilize bibliyotèk twazyèm pati tankou Netflix Ribbon oswa proxy pwogramasyon tankou Envoy.

Kisa k ap pase si ou inyore pwoblèm balanse?

Ou ka chwazi pa sèvi ak balans chaj epi ou toujou pa remake okenn chanjman. Ann gade nan kèk senaryo travay.

Si ou gen plis kliyan pase serveurs, sa se pa yon gwo pwoblèm.

Ann di gen senk kliyan ki konekte nan de serveurs. Menm si pa gen balans, tou de sèvè yo pral itilize:

Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Koneksyon yo ka pa menm distribye: petèt kat kliyan ki konekte nan menm sèvè a, men gen yon bon chans ke tou de serveurs yo pral itilize.

Ki sa ki pi pwoblèm se senaryo opoze a.

Si ou gen mwens kliyan ak plis serveurs, resous ou yo ka sous-utilize ak yon potansyèl bouchon ap parèt.

Ann di gen de kliyan ak senk serveurs. Nan pi bon ka a, pral gen de koneksyon pèmanan nan de serveurs sou senk.

Sèvè ki rete yo pral san fè anyen konsa:

Balanse chaj ak dekale koneksyon ki dire lontan nan Kubernetes

Si de serveurs sa yo pa ka okipe demann kliyan, dekale orizontal pa pral ede.

Konklizyon

Sèvis Kubernetes yo fèt pou travay nan pifò senaryo aplikasyon entènèt estanda.

Sepandan, yon fwa ou kòmanse travay ak pwotokòl aplikasyon ki itilize koneksyon TCP ki pèsistan, tankou baz done, gRPC oswa WebSockets, sèvis yo pa apwopriye ankò. Kubernetes pa bay mekanis entèn pou balanse koneksyon TCP ki pèsistan.

Sa vle di ou dwe ekri aplikasyon ak balans bò kliyan nan tèt ou.

Tradiksyon ekip la prepare Kubernetes aaS soti nan Mail.ru.

Ki lòt bagay pou li sou sijè a:

  1. Twa nivo autoscaling nan Kubernetes ak kijan pou itilize yo efektivman
  2. Kubernetes nan lespri piratri ak yon modèl aplikasyon.
  3. Chanèl Telegram nou an sou transfòmasyon dijital.

Sous: www.habr.com

Add nouvo kòmantè