Kontenè, mikwosèvis ak sèvis may

Nan entènèt la pil atik о sèvis may (sèvis may), ak isit la nan yon lòt. Houra! Men poukisa? Lè sa a, mwen vle deklare opinyon mwen ke may sèvis yo ta pi bon 10 ane de sa, anvan avenman platfòm veso tankou Docker ak Kubernetes. Mwen pa di ke pwen de vi mwen pi bon oswa pi mal pase lòt moun, men kòm may sèvis yo se bèt byen konplèks, plizyè pwen de vi ap ede yo pi byen konprann yo.

Mwen pral pale sou platfòm dotCloud, ki te bati sou plis pase yon santèn mikwosèvis ak sipòte plizyè milye aplikasyon nan resipyan. Mwen pral eksplike defi yo nou rankontre nan devlope ak lanse li, ak ki jan may sèvis ta ka (oswa pa ta ka) ede.

istwa dotcloud

Mwen deja ekri sou istwa dotCloud ak chwa achitekti pou platfòm sa a, men mwen pa pale anpil sou kouch rezo a. Si ou pa vle li dènye atik Konsènan dotCloud, men esansyèl la: li se yon platfòm PaaS kòm yon sèvis ki pèmèt kliyan yo kouri yon pakèt aplikasyon (Java, PHP, Python...), ak sipò pou yon pakèt sèvis done ( MongoDB, MySQL, Redis...) ak yon workflow tankou Heroku: ou telechaje kòd ou a sou platfòm la, li bati imaj veso ak deplwaye yo.

Mwen pral di w kijan trafik yo te voye sou platfòm dotCloud la. Se pa paske li te patikilyèman fre (byenke sistèm nan te travay byen pou tan li!), Men sitou paske avèk èd nan zouti modèn, tankou yon konsepsyon ka fasil aplike nan yon ti tan pa yon ekip modès si yo bezwen yon fason yo wout. trafik ant yon pakèt mikwosèvis oswa yon pakèt aplikasyon. Kidonk, ou ka konpare opsyon: sa k ap pase si ou devlope tout bagay tèt ou oswa itilize yon may sèvis ki egziste deja. Chwa estanda: fè pwòp ou a oswa achte.

Trafik routage pou aplikasyon hébergé

Aplikasyon sou dotCloud ka ekspoze pwen final HTTP ak TCP.

HTTP pwen final yo dinamik ajoute nan konfigirasyon gwoup balanse chaj la Hipache. Sa a se menm jan ak sa resous yo ap fè jodi a Pénétrer nan Kubernetes ak yon balanse chaj tankou Traefik.

Kliyan konekte ak pwen final HTTP atravè domèn ki apwopriye yo, bay non domèn pwente balans chaj dotCloud. Pa gen anyen espesyal.

TCP pwen final yo ki asosye ak yon nimewo pò, ki Lè sa a, pase nan tout resipyan ki nan pil sa a atravè varyab anviwònman an.

Kliyan yo ka konekte ak pwen final TCP lè l sèvi avèk non host ki apwopriye a (yon bagay tankou gateway-X.dotcloud.com) ak nimewo pò.

Non host sa a rezoud nan gwoup sèvè "nats" (pa gen rapò ak NATS) ki pral dirije koneksyon TCP fèk ap rantre yo nan veso ki kòrèk la (oswa, nan ka sèvis balanse chaj, nan veso ki kòrèk yo).

Si ou abitye ak Kubernetes, sa ap pwobableman fè ou sonje sèvis yo NodePort.

Pa te gen okenn ekivalan sèvis sou platfòm dotCloud la ClusterIP: pou senplisite, aksè a sèvis te rive menm jan an tou de andedan ak deyò platfòm la.

Tout bagay te òganize byen tou senpleman: aplikasyon orijinal HTTP ak TCP rezo routage yo te pwobableman sèlman kèk santèn liy nan Python. Senp (mwen ta di, nayif) algoritm ki te rafine ak kwasans lan nan platfòm la ak aparisyon nan kondisyon adisyonèl.

Refactoring vaste nan kòd ki egziste deja pa te obligatwa. An patikilye, 12 Faktè Apps ka dirèkteman itilize adrès ou jwenn nan varyab anviwònman an.

Ki jan sa a diferan de yon may sèvis modèn?

Limite vizibilite. Nou pa t gen okenn mezi pou TCP routage may ditou. Lè li rive HTTP routage, vèsyon ki pi resan yo gen mezi HTTP detaye ak kòd erè ak tan repons, men may sèvis modèn yo ale menm pi lwen, bay entegrasyon ak sistèm koleksyon mezi tankou Prometheus, pou egzanp.

Vizibilite enpòtan pa sèlman nan yon pwen de vi operasyonèl (pou ede rezoud pwoblèm), men tou lè nouvo karakteristik yo lage. Pale sou sekirite deplwaman ble-vèt и deplwaman nan kanari.

Efikasite routage limite tou. Nan may routage dotCloud, tout trafik te oblije pase nan yon gwoup nœuds routage devwe. Sa vle di potansyèlman travèse plizyè fwontyè AZ (zòn disponiblite) ak yon ogmantasyon siyifikatif nan latansi. Mwen sonje kòd depanaj ki te fè plis pase yon santèn demann SQL pou chak paj epi li te louvri yon nouvo koneksyon sou sèvè SQL la pou chak demann. Lè yo kouri lokalman, paj la chaje imedyatman, men sou dotCloud li pran kèk segonn pou chaje paske chak koneksyon TCP (ak rechèch SQL ki vin apre) pran plizyè dizèn milisgond. Nan ka sa a patikilye, koneksyon ki pèsistan rezoud pwoblèm nan.

May sèvis modèn yo pi bon nan fè fas ak pwoblèm sa yo. Premye a tout, yo tcheke ke koneksyon yo ap dirije nan sous. Koule lojik la se menm bagay la: клиент → меш → сервис, men kounye a may la ap travay lokalman epi yo pa sou nœuds aleka, kidonk koneksyon an клиент → меш se lokal ak trè vit (mikwosgond olye pou yo milisgond).

May sèvis modèn tou aplike pi entelijan algoritm balanse chaj. Lè yo kontwole sante backend yo, yo ka voye plis trafik nan backends pi vit, sa ki lakòz pi bon pèfòmans jeneral.

Безопасность se pi bon tou. May routage dotCloud la te kouri nèt sou EC2 Classic epi li pa ankripte trafik la (nan sipozisyon ke si yon moun te jere mete yon sniffer sou trafik rezo EC2, ou deja nan gwo pwoblèm). Mesh sèvis modèn yo transparan pwoteje tout trafik nou an, pou egzanp, ak otantifikasyon TLS mityèl ak chifreman ki vin apre.

Routage trafik pou sèvis platfòm yo

Oke, nou te diskite sou trafik ant aplikasyon yo, men sa ki sou platfòm la dotCloud tèt li?

Platfòm nan tèt li te genyen anviwon yon santèn mikwosèvis ki responsab plizyè fonksyon. Gen kèk ki t ap aksepte demann lòt moun, e gen kèk ki te travayè ki te konekte ak lòt sèvis men yo pa t aksepte koneksyon tèt yo. Nan nenpòt ka, chak sèvis dwe konnen pwen final adrès li bezwen pou konekte avèk yo.

Anpil sèvis wo nivo ka itilize may routage ki dekri pi wo a. An reyalite, anpil nan plis pase XNUMX mikwosèvis dotCloud yo te deplwaye kòm aplikasyon regilye sou platfòm dotCloud li menm. Men, yon ti kantite sèvis ki ba-nivo (an patikilye, sa yo ki aplike sa a may routage) te bezwen yon bagay ki pi senp, ak mwens depandans (paske yo pa t 'kapab depann sou tèt yo nan travay - bon vye pwoblèm nan poul ak ze).

Ba nivo, sèvis esansyèl sa yo te deplwaye pa kouri kontenè dirèkteman sou kèk nœuds kle. An menm tan an, sèvis platfòm estanda yo pa te enplike: linker, scheduler, ak runner. Si ou vle konpare ak platfòm veso modèn, se tankou lanse yon avyon kontwòl ak docker run dirèkteman sou nœuds yo, olye pou yo delege travay la bay Kubernetes. Li trè sanble nan konsèp modil estatik (gous), ki itilize kubeadm oswa bootkube lè demaraj yon gwoup otonòm.

Sèvis sa yo te ekspoze nan yon fason ki senp ak brit: yon dosye YAML te lis non yo ak adrès yo; epi chak kliyan te oblije pran yon kopi dosye YAML sa a pou deplwaman.

Sou yon bò, sa a trè serye, paske li pa bezwen sipò nan yon magazen kle/valè ekstèn, tankou Zookeeper (sonje, etcd oswa Konsil pa t egziste nan moman sa a). Nan lòt men an, li te fè li difisil pou deplase sèvis yo. Chak fwa yo te fè yon mouvman, tout kliyan yo te oblije jwenn yon fichye YAML ki ajou (ak potansyèlman rechaje). Pa trè alèz!

Imedyatman, nou te kòmanse aplike yon nouvo konplo, kote chak kliyan konekte ak yon sèvè prokurasyon lokal yo. Olye pou yo adrès la ak pò, li sèlman bezwen konnen nimewo pò a nan sèvis la, epi konekte atravè localhost. Prokurasyon lokal la okipe koneksyon sa a epi voye li nan sèvè aktyèl la. Koulye a, lè w ap deplase backend la nan yon lòt machin oswa dekale, olye pou yo mete ajou tout kliyan, sèlman tout proxy lokal sa yo bezwen mete ajou; epi yon rdemare pa nesesè ankò.

(Li te planifye tou pou ankapsile trafik nan koneksyon TLS epi enstale yon lòt sèvè prokurasyon sou bò k ap resevwa a, osi byen ke tcheke sètifika TLS san patisipasyon sèvis k ap resevwa a, ki se configuré pou aksepte koneksyon sèlman sou localhost. Plis sou sa pita).

Sa a se trè menm jan ak smartstack soti nan Airbnb, men diferans enpòtan an se ke SmartStack aplike ak deplwaye nan pwodiksyon, pandan y ap sistèm routage entèn dotCloud a te bwat moute lè dotCloud tounen Docker.

Mwen pèsonèlman konsidere SmartStack youn nan predesesè yo nan sistèm tankou Istio, Linkerd ak Consul Connect paske yo tout swiv menm modèl la:

  • Kouri yon prokurasyon sou chak ne.
  • Kliyan konekte ak proxy la.
  • Avyon kontwòl la mete ajou konfigirasyon proxy a lè backends chanje.
  • … Pwofi!

Aplikasyon modèn sèvis may

Si nou bezwen aplike yon grille menm jan an jodi a, nou ka sèvi ak prensip menm jan an. Pou egzanp, mete yon zòn DNS entèn nan kat non sèvis nan adrès nan espas 127.0.0.0/8. Lè sa a, kouri HAProxy sou chak node cluster, aksepte koneksyon sou chak adrès sèvis (sou subnet sa a 127.0.0.0/8) ak redireksyon / balanse chaj la nan backend ki apwopriye yo. Konfigirasyon HAProxy ka jere konfd, ki pèmèt ou estoke enfòmasyon backend nan etcd oswa Consul epi otomatikman pouse konfigirasyon ajou nan HAProxy lè sa nesesè.

Men ki jan Istio travay! Men ak kèk diferans:

  • Itilizasyon Anvwaye prokurasyon olye de HAProxy.
  • Sove konfigirasyon backend atravè Kubernetes API olye de etcd oswa Consul.
  • Sèvis yo resevwa adrès sou subnet entèn la (Kubernetes ClusterIP adrès) olye pou yo 127.0.0.0/8.
  • Gen yon eleman adisyonèl (Sitadel) pou ajoute otantifikasyon TLS mityèl ant kliyan ak serveurs.
  • Sipòte nouvo karakteristik tankou sikwi kraze, trase distribiye, deplwaman Canary, elatriye.

Ann pran yon gade rapid nan kèk nan diferans ki genyen.

Anvwaye prokurasyon

Envoy Proxy te ekri pa Lyft [konkiran Uber a nan mache taksi a - approx. pou.]. Li sanble nan plizyè fason ak lòt proxy (egzanp HAProxy, Nginx, Traefik...), men Lyft te ekri pwòp yo paske yo te bezwen karakteristik ke lòt proxies pa genyen epi li te sanble pi sansib pou fè yon nouvo olye ke pwolonje. yon sèl ki deja egziste.

Envoy ka itilize pou kont li. Si mwen gen yon sèvis espesifik ki bezwen konekte ak lòt sèvis, mwen ka mete l kanpe pou konekte ak Envoy ak Lè sa a, dinamikman konfigirasyon ak rekonfigirasyon Envoy ak kote lòt sèvis yo, pandan y ap resevwa yon anpil nan siplemantè gwo tankou vizibilite. Olye de yon bibliyotèk kliyan koutim oswa piki nan kòd trase apèl la, nou voye trafik bay Envoy, epi li kolekte mezi pou nou.

Men, Envoy tou kapab travay kòm done avyon (avion done) pou may sèvis la. Sa vle di ke kounye a pou may sèvis sa a, Envoy configuré avyon kontwòl (avyon kontwòl).

Avyon kontwòl

Nan plan kontwòl la, Istio konte sou API Kubernetes la. Sa a pa trè diferan de lè l sèvi avèk confd, ki depann sou etcd oswa Konsil pou chèche yon seri kle nan magazen done yo. Istio gade nan yon seri resous Kubernetes atravè API Kubernetes.

Ant sa a ak lè sa a: Mwen pèsonèlman jwenn itil sa a Deskripsyon API Kuberneteski li:

Sèvè API Kubernetes se yon "sèvè estipid" ki ofri depo, vèsyon, validation, aktyalizasyon, ak semantik resous API.

Istio fèt pou travay ak Kubernetes; epi si ou vle sèvi ak li deyò nan Kubernetes, Lè sa a, ou bezwen kòmanse yon egzanp nan sèvè a API Kubernetes (ak sèvis la èd etcd).

Adrès Sèvis

Istio depann sou adrès ClusterIP ke Kubernetes asiyen, kidonk sèvis Istio jwenn yon adrès entèn (pa nan seri a. 127.0.0.0/8).

Trafik nan yon adrès ClusterIP pou yon sèvis espesifik nan yon gwoup Kubernetes san Istio entèsepte pa kube-proxy epi voye nan back end proxy a. Si w enterese nan detay teknik yo, kube-proxy mete kanpe règ iptables (oswa IPVS load balancers, tou depann de ki jan li konfigirasyon) pou reekri adrès IP destinasyon koneksyon ki ale nan adrès ClusterIP la.

Yon fwa Istio enstale sou yon gwoup Kubernetes, pa gen anyen ki chanje jiskaske li aktive klèman pou yon konsomatè bay, oswa menm espas non an antye, lè w entwodwi yon veso. sidecar nan gous koutim. Veso sa a pral kòmanse yon egzanp Envoy epi mete yon seri règ iptables pou entèsepte trafik ki ale nan lòt sèvis epi redireksyon trafik sa a nan Envoy.

Lè entegre ak Kubernetes DNS, sa vle di ke kòd nou an ka konekte pa non sèvis, ak tout bagay "jis travay". Nan lòt mo, kòd nou an pwoblèm demann tankou http://api/v1/users/4242lè sa a api rezoud demann lan pou 10.97.105.48, iptables règ yo entèsepte koneksyon soti nan 10.97.105.48 epi redireksyon yo nan proxy Envoy lokal la, ki pral voye demann lan nan backend aktyèl la API. Ouf!

Plis adisyonèl

Istio bay tou fen-a-fen chifreman ak otantifikasyon atravè mTLS (TLS mityèl). Eleman an rele Sitadèl.

Genyen tou yon eleman Mixer, ki Anvwaye ka mande pou chak demann pou pran yon desizyon espesyal sou demann sa a depann de plizyè faktè tankou headers, backend loading, elatriye... (pa enkyete w: gen anpil zouti pou kenbe Mixer travay, e menm si li fè aksidan, Envoy ap kontinye travay. kòm yon prokurasyon).

Epi, nan kou, nou mansyone vizibilite: Envoy kolekte yon gwo kantite mezi pandan y ap bay trase distribiye. Nan yon achitekti mikwosèvis, si yon sèl demann API bezwen ale nan mikwosèvis A, B, C, ak D, Lè sa a, lè w konekte, trase distribiye pral ajoute yon idantifyan inik nan demann lan epi estoke idantifyan sa a atravè sou-demann nan tout mikwosèvis sa yo, sa ki pèmèt ou pran tout apèl ki gen rapò, reta yo, elatriye.

Devlope oswa achte

Istio gen yon repitasyon kòm yon sistèm konplèks. Kontrèman, bati may routage ke mwen te dekri nan kòmansman pòs sa a se relativman fasil ak zouti ki deja egziste. Se konsa, li fè sans pou kreye pwòp sèvis may pito?

Si nou gen bezwen modès (nou pa bezwen vizibilite, yon disjoncteurs ak lòt sibtilite), Lè sa a, panse vini sou devlope pwòp zouti nou an. Men, si n ap itilize Kubernetes, li ka pa menm bezwen paske Kubernetes deja bay zouti debaz yo pou dekouvèt sèvis ak balans chaj.

Men, si nou gen kondisyon avanse, lè sa a "achte" yon bagay pou kouvri tèt sèvis sanble yon pi bon opsyon. (Sa a se pa toujou yon "achte" depi Istio se sous louvri, men nou toujou bezwen envesti tan jeni pou konprann, deplwaye, ak jere li.)

Kisa pou w chwazi: Istio, Linkerd oswa Consul Connect?

Jiskaprezan nou te sèlman pale de Istio, men se pa sèlman may sèvis la. Altènatif popilè a se Linkerd, men gen plis Konsil Konekte.

Ki sa ki yo chwazi?

Pou m onèt, mwen pa konnen. Pou lemoman mwen pa konsidere tèt mwen ase konpetan pou reponn kesyon sa a. Gen kèk enteresan atik ak yon konparezon nan zouti sa yo e menm referans.

Yon apwòch pwomèt se sèvi ak yon zouti tankou supergloo. Li aplike yon kouch abstrè pou senplifye ak inifye API yo bay may sèvis yo. Olye pou nou aprann API espesifik (e, daprè mwen, relativman konplèks) nan may sèvis divès kalite, nou ka itilize konstriksyon SuperGloo ki pi senp yo - epi fasil chanje soti nan youn nan yon lòt, tankou si nou te gen yon fòma konfigirasyon entèmedyè ki dekri koòdone HTTP ak backends. kapab jenere konfigirasyon aktyèl la pou Nginx, HAProxy, Traefik, Apache...

Mwen te jwe ak Istio ak SuperGloo yon ti kras, ak nan pwochen atik la mwen vle montre ki jan yo ajoute Istio oswa Linkerd nan yon gwoup ki egziste deja lè l sèvi avèk SuperGloo, ak ki jan lèt la pral fè travay li, se sa ki, li pèmèt ou chanje soti nan. yon may sèvis nan yon lòt san yo pa reekri konfigirasyon.

Sous: www.habr.com

Add nouvo kòmantè