Krijimi i një platforme kubernetes në Pinterest

Gjatë viteve, 300 milionë përdoruesit e Pinterest kanë krijuar më shumë se 200 miliardë kunja në më shumë se 4 miliardë tabela. Për t'i shërbyer kësaj armate përdoruesish dhe bazës së gjerë të përmbajtjes, portali ka zhvilluar mijëra shërbime, duke filluar nga mikroshërbimet që mund të trajtohen nga disa CPU, tek monolitë gjigantë që funksionojnë në një flotë të tërë makinash virtuale. Dhe më pas erdhi momenti kur sytë e kompanisë ranë te k8s. Pse "kubi" dukej mirë në Pinterest? Ju do të mësoni për këtë nga përkthimi ynë i një artikulli të fundit nga blog Pinterest ingeneering.

Krijimi i një platforme kubernetes në Pinterest

Pra, qindra miliona përdorues dhe qindra miliarda kunja. Për t'i shërbyer kësaj armate përdoruesish dhe bazës së gjerë të përmbajtjes, ne kemi zhvilluar mijëra shërbime, duke filluar nga mikroshërbimet që mund të trajtohen nga disa CPU, deri te monolitë gjigantë që funksionojnë në flota të tëra makinash virtuale. Përveç kësaj, ne kemi një sërë kornizash që mund të kërkojnë gjithashtu CPU, memorie ose akses në hyrje/dalje.

Në mirëmbajtjen e këtij kopshti zoologjik të mjeteve, ekipi i zhvillimit përballet me një sërë sfidash:

  • Nuk ka asnjë mënyrë uniforme që inxhinierët të drejtojnë një mjedis prodhimi. Shërbimet pa shtetësi, shërbimet shtetërore dhe projektet në zhvillim aktiv bazohen në pirgje teknologjike krejtësisht të ndryshme. Kjo çoi në krijimin e një kursi të tërë trajnimi për inxhinierët, dhe gjithashtu e ndërlikon seriozisht punën e ekipit tonë të infrastrukturës.
  • Zhvilluesit me flotën e tyre të makinave virtuale krijojnë një barrë të madhe për administratorët e brendshëm. Si rezultat, operacione të tilla të thjeshta si përditësimi i OS ose AMI zgjasin javë dhe muaj. Kjo çon në rritjen e ngarkesës së punës në situata në dukje absolutisht të përditshme.
  • Vështirësi në krijimin e mjeteve globale të menaxhimit të infrastrukturës në krye të zgjidhjeve ekzistuese. Situata ndërlikohet edhe më shumë nga fakti se gjetja e pronarëve të makinave virtuale nuk është e lehtë. Kjo do të thotë, ne nuk e dimë nëse ky kapacitet mund të nxirret në mënyrë të sigurt për të operuar në pjesë të tjera të infrastrukturës sonë.

Sistemet e orkestrimit të kontejnerëve janë një mënyrë për të unifikuar menaxhimin e ngarkesës së punës. Ato hapin derën për rritjen e shpejtësisë së zhvillimit dhe thjeshtojnë menaxhimin e infrastrukturës, pasi të gjitha burimet e përfshira në projekt menaxhohen nga një sistem i centralizuar.

Krijimi i një platforme kubernetes në Pinterest

Figura 1: Prioritetet e infrastrukturës (besueshmëria, produktiviteti i zhvilluesit dhe efikasiteti).

Ekipi i Platformës së Menaxhimit të Cloud në Pinterest zbuloi K8 në 2017. Deri në gjysmën e parë të 2017, ne kishim dokumentuar shumicën e aftësive tona të prodhimit, duke përfshirë API-në dhe të gjithë serverët tanë të internetit. Më pas, ne kryem një vlerësim të plotë të sistemeve të ndryshme për orkestrimin e zgjidhjeve të kontejnerëve, ndërtimin e grupeve dhe punën me to. Nga fundi i vitit 2017, vendosëm të përdorim Kubernetes. Ishte mjaft fleksibël dhe i mbështetur gjerësisht në komunitetin e zhvilluesve.

Deri më sot, ne kemi ndërtuar mjetet tona të nisjes së grupit bazuar në Kops dhe kemi migruar komponentët ekzistues të infrastrukturës si rrjeti, siguria, metrikat, regjistrimi, menaxhimi i identitetit dhe trafiku në Kubernetes. Ne gjithashtu zbatuam një sistem modelimi të ngarkesës së punës për burimin tonë, kompleksiteti i të cilit është i fshehur nga zhvilluesit. Tani jemi të fokusuar në sigurimin e stabilitetit të grupit, shkallëzimin e tij dhe lidhjen e klientëve të rinj.

Kubernetes: Rruga Pinterest

Fillimi me Kubernetes në shkallën e Pinterest si një platformë që inxhinierët tanë do ta donin, erdhi me shumë sfida.

Si një kompani e madhe, ne kemi investuar shumë në mjetet e infrastrukturës. Shembujt përfshijnë mjete sigurie që trajtojnë përpunimin e certifikatave dhe shpërndarjen e çelësave, komponentët e kontrollit të trafikut, sistemet e zbulimit të shërbimit, komponentët e dukshmërisë dhe komponentët e dërgimit të regjistrave dhe metrikës. E gjithë kjo u mblodh për një arsye: ne kaluam rrugën normale të provës dhe gabimit, dhe për këtë arsye donim të integronim të gjitha këto pajisje në infrastrukturën e re në Kubernetes në vend që të rishpiknim rrotën e vjetër në një platformë të re. Kjo qasje në përgjithësi thjeshtoi migrimin, pasi e gjithë mbështetja e aplikacionit ekziston tashmë dhe nuk ka nevojë të krijohet nga e para.

Nga ana tjetër, modelet e parashikimit të ngarkesës në vetë Kubernetes (të tilla si vendosjet, punët dhe grupet Daemon) nuk janë të mjaftueshme për projektin tonë. Këto çështje të përdorshmërisë janë pengesa të mëdha për të kaluar në Kubernetes. Për shembull, ne kemi dëgjuar zhvilluesit e shërbimeve të ankohen për cilësime të humbura ose të pasakta të hyrjes. Ne kemi hasur gjithashtu në përdorim të gabuar të motorëve të shablloneve, kur u krijuan qindra kopje me të njëjtin specifikim dhe detyrë, gjë që rezultoi në probleme të korrigjimit të ankthit.

Ishte gjithashtu shumë e vështirë të ruheshin versione të ndryshme në të njëjtin grup. Imagjinoni kompleksitetin e mbështetjes së klientit nëse ju duhet të punoni njëkohësisht në versione të shumta të të njëjtit mjedis të ekzekutimit, me të gjitha problemet, defektet dhe përditësimet e tyre.

Karakteristikat dhe kontrollorët e përdoruesve të Pinterest

Për ta bërë më të lehtë për inxhinierët tanë zbatimin e Kubernetes dhe për të thjeshtuar dhe përshpejtuar infrastrukturën tonë, ne kemi zhvilluar përkufizimet tona të burimeve të personalizuara (CRD).

CRD-të ofrojnë funksionalitetin e mëposhtëm:

  1. Kombinimi i burimeve të ndryshme vendase të Kubernetes në mënyrë që ato të funksionojnë si një ngarkesë e vetme pune. Për shembull, burimi PinterestService përfshin një vendosje, një shërbim identifikimi dhe një hartë konfigurimi. Kjo i lejon zhvilluesit të mos shqetësohen për konfigurimin e DNS.
  2. Zbatoni mbështetjen e nevojshme të aplikacionit. Përdoruesi duhet të fokusohet vetëm në specifikimin e kontejnerit sipas logjikës së tij të biznesit, ndërsa kontrolluesi CRD zbaton të gjithë kontejnerët e nevojshëm fillestar, variablat e mjedisit dhe specifikimet e pod. Kjo siguron një nivel thelbësisht të ndryshëm rehatie për zhvilluesit.
  3. Kontrollorët CRD gjithashtu menaxhojnë ciklin e jetës së burimeve vendase dhe përmirësojnë disponueshmërinë e korrigjimit. Kjo përfshin harmonizimin e specifikimeve të dëshiruara dhe aktuale, përditësimin e statusit të CRD dhe mbajtjen e regjistrave të ngjarjeve, dhe më shumë. Pa CRD, zhvilluesit do të detyroheshin të menaxhonin burime të shumta, gjë që do të rriste vetëm gjasat e gabimit.

Këtu është një shembull i një PinterestService dhe një burimi të brendshëm që menaxhohet nga kontrolluesi ynë:

Krijimi i një platforme kubernetes në Pinterest

Siç mund ta shihni më lart, për të mbështetur një kontejner të personalizuar, duhet të integrojmë një kontejner fillestar dhe disa shtesa për të ofruar siguri, dukshmëri dhe trafik në rrjet. Përveç kësaj, ne krijuam shabllone të hartave të konfigurimit dhe zbatuam mbështetje për shabllonet PVC për punët e grumbulluara, si dhe gjurmimin e variablave të shumtë të mjedisit për të gjurmuar identitetin, konsumin e burimeve dhe mbledhjen e mbeturinave.

Është e vështirë të imagjinohet që zhvilluesit do të dëshironin t'i shkruanin këto skedarë konfigurimi me dorë pa mbështetjen e CRD, e lëre më të mirëmbajnë dhe korrigjojnë më tej konfigurimet.

Rrjedha e punës e vendosjes së aplikacionit

Krijimi i një platforme kubernetes në Pinterest

Imazhi i mësipërm tregon se si të vendosni një burim personal Pinterest në një grupim Kubernetes:

  1. Zhvilluesit ndërveprojnë me grupin tonë Kubernetes përmes CLI dhe ndërfaqes së përdoruesit.
  2. Mjetet CLI/UI marrin skedarët YAML të konfigurimit të rrjedhës së punës dhe veçoritë e tjera të ndërtimit (ID-i i njëjtë i versionit) nga Artifactory dhe më pas i dorëzojnë ato në Shërbimin e Paraqitjes së Punës. Ky hap siguron që vetëm versionet e prodhimit të dorëzohen në grup.
  3. JSS është një portë për platforma të ndryshme, duke përfshirë Kubernetes. Këtu përdoruesi vërtetohet, jepen kuota dhe kontrollohet pjesërisht konfigurimi i CRD-së tonë.
  4. Pas kontrollit të CRD në anën JSS, informacioni dërgohet në API të platformës k8s.
  5. Kontrolluesi ynë CRD monitoron ngjarjet në të gjitha burimet e përdoruesit. Ai konverton CR-të në burime k8s vendase, shton modulet e nevojshme, vendos variablat e duhura të mjedisit dhe kryen punë të tjera mbështetëse për të siguruar që aplikacionet e përdoruesve të kontejneruar të kenë mbështetje të mjaftueshme të infrastrukturës.
  6. Më pas kontrolluesi CRD i kalon të dhënat e marra në Kubernetes API në mënyrë që ato të mund të përpunohen nga planifikuesi dhe të vihen në prodhim.

Shënim: Ky fluks i punës para publikimit i vendosjes u krijua për përdoruesit e parë të platformës së re k8s. Aktualisht jemi në procesin e përpunimit të këtij procesi për t'u integruar plotësisht me CI/CD-në tonë të re. Kjo do të thotë që ne nuk mund t'ju tregojmë gjithçka që lidhet me Kubernetes. Mezi presim të ndajmë përvojën tonë dhe përparimin e ekipit në këtë drejtim në postimin tonë të ardhshëm në blog, "Ndërtimi i një platforme CI/CD për Pinterest".

Llojet e burimeve të veçanta

Bazuar në nevojat specifike të Pinterest, ne kemi zhvilluar CRD-të e mëposhtme për t'iu përshtatur flukseve të ndryshme të punës:

  • PinterestService janë shërbime pa shtetësi që funksionojnë për një kohë të gjatë. Shumë nga sistemet tona kryesore bazohen në një grup shërbimesh të tilla.
  • PinterestJobSet modelon punë me grup të plotë të ciklit. Një skenar i zakonshëm në Pinterest është që shumë punë drejtojnë të njëjtat kontejnerë paralelisht, pavarësisht nga proceset e tjera të ngjashme.
  • PinterestCronJob përdoret gjerësisht në lidhje me ngarkesa të vogla periodike. Ky është një mbështjellës për punën origjinale të cron me mekanizmat mbështetës të Pinterest që janë përgjegjës për sigurinë, trafikun, regjistrat dhe metrikat.
  • PinterestDaemon përfshin Daemonët e infrastrukturës. Kjo familje vazhdon të rritet ndërsa ne i shtojmë më shumë mbështetje grupeve tona.
  • PinterestTrainingJob shtrihet në proceset Tensorflow dhe Pytorch, duke ofruar të njëjtin nivel të mbështetjes në kohën e ekzekutimit si të gjitha CRD-të e tjera. Meqenëse Pinterest përdor në mënyrë aktive Tensorflow dhe sisteme të tjera të mësimit të makinerive, ne kishim një arsye për të ndërtuar një CRD të veçantë rreth tyre.

Ne po punojmë gjithashtu në PinterestStatefulSet, i cili së shpejti do të përshtatet për magazinat e të dhënave dhe sistemet e tjera shtetërore.

Mbështetje për kohën e ekzekutimit

Kur një pod aplikacioni funksionon në Kubernetes, ai automatikisht merr një certifikatë për të identifikuar veten. Kjo certifikatë përdoret për të hyrë në ruajtje sekrete ose për të komunikuar me shërbime të tjera nëpërmjet mTLS. Ndërkohë, Container Init Configurator dhe Daemon do të shkarkojnë të gjitha varësitë e nevojshme përpara se të ekzekutojnë aplikacionin e kontejneruar. Kur gjithçka të jetë gati, karriera anësore e trafikut dhe Daemon do të regjistrojnë adresën IP të modulit me Zookeeper tonë në mënyrë që klientët ta zbulojnë atë. E gjithë kjo do të funksionojë sepse moduli i rrjetit është konfiguruar përpara se të lansohej aplikacioni.

Më sipër janë shembuj tipikë të mbështetjes në kohën e ekzekutimit për ngarkesat e punës. Llojet e tjera të ngarkesave të punës mund të kërkojnë mbështetje paksa të ndryshme, por të gjitha ato vijnë në formën e karrigeve anësore të nivelit të pod-it, Daemons të nivelit të nyjeve ose të nivelit të makinës virtuale. Ne sigurojmë që e gjithë kjo të vendoset brenda infrastrukturës së menaxhimit dhe të jetë konsistente në të gjithë aplikacionet, gjë që në fund të fundit redukton ndjeshëm barrën për sa i përket punës teknike dhe mbështetjes së klientit.

Testimi dhe SC

Ne ndërtuam një tubacion testimi nga fundi në fund në krye të infrastrukturës ekzistuese të testimit Kubernetes. Këto teste zbatohen për të gjitha grupimet tona. Gazsjellësi ynë kaloi nëpër shumë rishikime përpara se të bëhej pjesë e grupit të produkteve.

Përveç sistemeve të testimit, ne kemi sisteme monitorimi dhe alarmi që monitorojnë vazhdimisht statusin e komponentëve të sistemit, konsumin e burimeve dhe tregues të tjerë të rëndësishëm, duke na njoftuar vetëm kur është e nevojshme ndërhyrja njerëzore.

alternativa

Ne shikuam disa alternativa ndaj burimeve të personalizuara, të tilla si kontrollorët e aksesit të mutacioneve dhe sistemet e modeleve. Megjithatë, të gjitha ato vijnë me sfida të rëndësishme operacionale, kështu që ne zgjodhëm rrugën CRD.

Një kontrollues i pranimit mutacion është përdorur për të futur karriget anësore, variablat e mjedisit dhe mbështetje të tjera të kohës së funksionimit. Megjithatë, ajo u përball me probleme të ndryshme, si lidhja e burimeve dhe menaxhimi i ciklit të jetës, ku probleme të tilla nuk lindin në CRD.

Shenim: Sistemet shabllone të tilla si diagramet Helm përdoren gjithashtu gjerësisht për të ekzekutuar aplikacione me konfigurime të ngjashme. Megjithatë, aplikacionet tona të punës janë shumë të ndryshme për t'u menaxhuar duke përdorur shabllone. Gjithashtu gjatë vendosjes së vazhdueshme do të ketë shumë gabime gjatë përdorimit të shablloneve.

Puna e ardhshme

Aktualisht kemi të bëjmë me një ngarkesë të përzier në të gjitha grupimet tona. Për të mbështetur procese të tilla të llojeve dhe madhësive të ndryshme, ne punojmë në fushat e mëposhtme:

  • Një koleksion grupesh shpërndan aplikacione të mëdha nëpër grupime të ndryshme për shkallëzim dhe stabilitet.
  • Sigurimi i qëndrueshmërisë së grupit, shkallëzueshmërisë dhe dukshmërisë për të krijuar lidhjen e aplikacioneve dhe SLA.
  • Menaxhimi i burimeve dhe kuotave në mënyrë që aplikacionet të mos bien ndesh me njëri-tjetrin dhe shkalla e grupit të kontrollohet nga ana jonë.
  • Një platformë e re CI/CD për mbështetjen dhe vendosjen e aplikacioneve në Kubernetes.

Burimi: www.habr.com

Shto një koment