Kubernetese platvormi loomine Pinterestis

Aastate jooksul on Pinteresti 300 miljonit kasutajat loonud rohkem kui 200 miljardit tihvti enam kui 4 miljardile tahvlile. Selle kasutajate armee ja tohutu sisubaasi teenindamiseks on portaal välja töötanud tuhandeid teenuseid, alates mikroteenustest, mida saab hallata mõne CPU-ga, kuni hiiglaslike monoliitideni, mis töötavad tervel virtuaalmasinapargil. Ja siis saabus hetk, mil ettevõtte pilk langes k8-le. Miks nägi "kuubik" Pinterestis hea välja? Selle kohta saate teada meie hiljutise artikli tõlkest blogi Pinterest engeneering.

Kubernetese platvormi loomine Pinterestis

Niisiis, sajad miljonid kasutajad ja sajad miljardid kontaktid. Selle kasutajate armee ja tohutu sisubaasi teenindamiseks oleme välja töötanud tuhandeid teenuseid, alates mikroteenustest, mida saab hallata mõne CPU-ga, kuni hiiglaslike monoliitideni, mis töötavad tervetel virtuaalmasinatel. Lisaks on meil mitmesuguseid raamistikke, mis võivad samuti nõuda CPU-, mälu- või I/O-juurdepääsu.

Selle tööriistade loomaaia hooldamisel seisab arendusmeeskond silmitsi mitme väljakutsega.

  • Inseneridel puudub ühtne viis tootmiskeskkonna juhtimiseks. Stateless teenused, Stateful teenused ja aktiivses arenduses olevad projektid põhinevad täiesti erinevatel tehnoloogiapakkidel. See tõi kaasa terve inseneride koolituskursuse loomise ja raskendab tõsiselt ka meie taristumeeskonna tööd.
  • Arendajad, kellel on oma virtuaalne masinapark, tekitavad sisemiste administraatorite jaoks tohutu koormuse. Seetõttu võtavad sellised lihtsad toimingud nagu OS-i või AMI värskendamine nädalaid ja kuid. See toob kaasa suurema töökoormuse näiliselt täiesti igapäevastes olukordades.
  • Raskused olemasolevate lahenduste kõrval globaalsete infrastruktuurihaldustööriistade loomisel. Olukorra teeb veelgi keerulisemaks asjaolu, et virtuaalmasinate omanike leidmine pole lihtne. See tähendab, et me ei tea, kas seda võimsust saab ohutult kaevandada, et töötada meie infrastruktuuri muudes osades.

Konteinerite orkestreerimissüsteemid on viis töökoormuse haldamise ühtlustamiseks. Need avavad ukse arenduskiiruse suurendamisele ja lihtsustavad infrastruktuuri haldamist, kuna kõiki projektiga seotud ressursse haldab üks tsentraliseeritud süsteem.

Kubernetese platvormi loomine Pinterestis

Joonis 1: Infrastruktuuri prioriteedid (usaldusväärsus, arendaja tootlikkus ja tõhusus).

Pinteresti pilvehaldusplatvormi meeskond avastas K8-d 2017. aastal. 2017. aasta esimeseks pooleks olime dokumenteerinud enamiku oma tootmisvõimalustest, sealhulgas API ja kõik meie veebiserverid. Seejärel hindasime põhjalikult erinevaid süsteeme konteinerlahenduste orkestreerimiseks, klastrite ehitamiseks ja nendega töötamiseks. 2017. aasta lõpu poole otsustasime kasutada Kubernetes. See oli üsna paindlik ja arendajate kogukonnas laialdaselt toetatud.

Tänaseks oleme loonud oma klastri alglaadimistööriistad, mis põhinevad Kopsil ja migreerinud olemasolevad infrastruktuuri komponendid, nagu võrgundus, turvalisus, mõõdikud, logimine, identiteedihaldus ja liiklus Kubernetesesse. Samuti juurutasime oma ressursi jaoks töökoormuse modelleerimise süsteemi, mille keerukus on arendajate eest varjatud. Nüüd oleme keskendunud klastri stabiilsuse tagamisele, skaleerimisele ja uute klientide ühendamisele.

Kubernetes: Pinteresti viis

Kubernetesega alustamine Pinteresti skaalal platvormina, mis meie inseneridele meeldiks, tõi kaasa palju väljakutseid.

Suure ettevõttena oleme investeerinud palju infrastruktuuri tööriistadesse. Näited hõlmavad turbetööriistu, mis haldavad sertifikaatide töötlemist ja võtmete levitamist, liiklusjuhtimiskomponente, teenusetuvastussüsteeme, nähtavuse komponente ning logi ja mõõdikute saatmise komponente. Kõik see koguti põhjusega: läbisime tavapärase katse-eksituse tee ja seetõttu tahtsime integreerida kogu selle varustuse Kubernetese uude infrastruktuuri, selle asemel et vana ratast uuel platvormil uuesti leiutada. Selline lähenemine lihtsustas üldiselt migreerimist, kuna kogu rakendustugi on juba olemas ja seda pole vaja nullist luua.

Teisest küljest ei piisa meie projekti jaoks Kubernetese enda koormuse prognoosimise mudelitest (nt juurutused, töökohad ja deemonikomplektid). Need kasutatavuse probleemid takistavad tohutult Kubernetesesse üleminekut. Näiteks oleme kuulnud teenusearendajaid kurtmas puuduvate või valede sisselogimisseadete üle. Samuti puutusime kokku mallimootorite ebaõige kasutamisega, kui sama spetsifikatsiooni ja ülesandega loodi sadu koopiaid, mis tõi kaasa õudusunenägude silumisprobleemid.

Samuti oli väga raske hoida samas klastris erinevaid versioone. Kujutage ette klienditoe keerukust, kui peate töötama samaaegselt sama käituskeskkonna mitmes versioonis koos kõigi nende probleemide, vigade ja värskendustega.

Pinteresti kasutaja omadused ja kontrollerid

Kubernetese juurutamise hõlbustamiseks meie inseneridel ning infrastruktuuri lihtsustamiseks ja kiirendamiseks oleme välja töötanud oma kohandatud ressursside määratlused (CRD).

CRD-d pakuvad järgmisi funktsioone:

  1. Erinevate Kubernetese algressursside kombineerimine nii, et need töötaksid ühe töökoormusena. Näiteks PinterestService'i ressurss sisaldab juurutamist, sisselogimisteenust ja konfiguratsioonikaarti. See võimaldab arendajatel mitte muretseda DNS-i seadistamise pärast.
  2. Rakendage vajalikku rakendustuge. Kasutaja peab keskenduma ainult konteineri spetsifikatsioonile vastavalt oma äriloogikale, samal ajal kui CRD-kontroller rakendab kõik vajalikud algkonteinerid, keskkonnamuutujad ja pod-spetsifikatsioonid. See annab arendajatele põhimõtteliselt erineva mugavuse taseme.
  3. CRD-kontrollerid haldavad ka omaressursside elutsüklit ja parandavad silumise saadavust. See hõlmab soovitud ja tegelike spetsifikatsioonide ühitamist, CRD oleku värskendamist ja sündmuste logide pidamist ja palju muud. Ilma CRD-d oleksid arendajad sunnitud haldama mitut ressurssi, mis ainult suurendaks vea tõenäosust.

Siin on näide PinterestService'ist ja sisemisest ressursist, mida haldab meie kontroller:

Kubernetese platvormi loomine Pinterestis

Nagu ülal näete, peame kohandatud konteineri toetamiseks integreerima init-konteineri ja mitmed lisandmoodulid, et pakkuda turvalisust, nähtavust ja võrguliiklust. Lisaks lõime konfiguratsioonikaardi mallid ja rakendasime paketttööde PVC-mallide toe, samuti mitme keskkonnamuutuja jälgimist, et jälgida identiteeti, ressursside tarbimist ja prügi kogumist.

On raske ette kujutada, et arendajad sooviksid neid konfiguratsioonifaile käsitsi kirjutada ilma CRD-toeta, rääkimata konfiguratsioonide edasisest hooldamisest ja silumisest.

Rakenduse juurutamise töövoog

Kubernetese platvormi loomine Pinterestis

Ülaltoodud pilt näitab, kuidas Pinteresti kohandatud ressurssi Kubernetese klastris juurutada:

  1. Arendajad suhtlevad meie Kubernetese klastriga CLI ja kasutajaliidese kaudu.
  2. CLI/UI tööriistad toovad töövoo konfiguratsiooni YAML-failid ja muud järgu atribuudid (sama versiooni ID) Artifactoryst ning esitavad need seejärel töö esitamise teenusele. See samm tagab, et klastrisse tarnitakse ainult tootmisversioonid.
  3. JSS on värav erinevatele platvormidele, sealhulgas Kubernetesele. Siin autenditakse kasutaja, väljastatakse kvoodid ja kontrollitakse osaliselt meie CRD konfiguratsiooni.
  4. Pärast CRD kontrollimist JSS-i poolel saadetakse teave k8s platvormi API-le.
  5. Meie CRD-kontroller jälgib sündmusi kõigis kasutajaressurssides. See teisendab CR-id natiivseteks k8s-ressurssideks, lisab vajalikud moodulid, määrab sobivad keskkonnamuutujad ja teeb muid tugitöid, et tagada konteinerite kasutajarakenduste piisav infrastruktuuri tugi.
  6. Seejärel edastab CRD-kontroller saadud andmed Kubernetes API-le, et planeerija saaks neid töödelda ja tootmisse panna.

Märkus: see juurutuse väljalaskeeelne töövoog loodi uue k8s platvormi esimestele kasutajatele. Praegu täiustame seda protsessi, et integreeruda täielikult meie uue CI/CD-ga. See tähendab, et me ei saa teile kõike Kubernetesega seonduvat rääkida. Ootame oma kogemusi ja meeskonna edusamme selles suunas jagama meie järgmises blogipostituses „CI/CD platvormi loomine Pinteresti jaoks”.

Eriressursside tüübid

Lähtudes Pinteresti spetsiifilistest vajadustest, oleme erinevate töövoogude jaoks välja töötanud järgmised CRD-d:

  • PinterestService on kodakondsuseta teenused, mis on töötanud pikka aega. Paljud meie põhisüsteemid põhinevad sellistel teenustel.
  • PinterestJobSet modelleerib täistsükli paketttöid. Levinud stsenaarium Pinterestis on see, et mitu tööd käitavad paralleelselt samu konteinereid, sõltumata muudest sarnastest protsessidest.
  • PinterestCronJobi kasutatakse laialdaselt koos väikeste perioodiliste koormustega. See on ümbris natiivse cron-töö jaoks koos Pinteresti tugimehhanismidega, mis vastutavad turvalisuse, liikluse, logide ja mõõdikute eest.
  • PinterestDaemon sisaldab infrastruktuurideemoneid. See pere kasvab jätkuvalt, kuna lisame oma klastritele rohkem tuge.
  • PinterestTrainingJob laieneb Tensorflow ja Pytorchi protsessidele, pakkudes samal tasemel käitusaegset tuge kui kõik teised CRD-d. Kuna Pinterest kasutab aktiivselt Tensorflow ja teisi masinõppesüsteeme, oli meil põhjust nende ümber ehitada eraldi CRD.

Töötame ka PinterestStatefulSeti kallal, mida peagi kohandatakse andmeladude ja muude olekuga süsteemide jaoks.

Kestusaegne tugi

Kui Kubernetesis töötab rakenduskast, saab see automaatselt sertifikaadi enda tuvastamiseks. Seda sertifikaati kasutatakse mTLS-i kaudu salajasele salvestusruumile juurdepääsuks või teiste teenustega suhtlemiseks. Samal ajal laadivad Container Init Configurator ja deemon enne konteinerirakenduse käivitamist alla kõik vajalikud sõltuvused. Kui kõik on valmis, registreerivad liikluse külgkorvi ja Daemon mooduli IP-aadressi meie Zookeeperiga, et kliendid saaksid selle avastada. Kõik see töötab, kuna võrgumoodul konfigureeriti enne rakenduse käivitamist.

Ülaltoodud on tüüpilised näited töökoormuste käitusaja toest. Muud tüüpi töökoormused võivad vajada veidi erinevat tuge, kuid need kõik on saadaval pod-taseme külgkorvide, sõlme- või virtuaalmasina tasemel deemonite kujul. Tagame, et see kõik on haldusinfrastruktuuris juurutatud ja rakenduste vahel ühtlane, mis lõppkokkuvõttes vähendab oluliselt tehnilise töö ja klienditoe koormust.

Testimine ja kvaliteedi tagamine

Ehitasime olemasoleva Kubernetese testimise infrastruktuuri peale otsast lõpuni katsetorustiku. Need testid kehtivad kõigi meie klastrite kohta. Enne tooteklastri osaks saamist läbis meie konveieri palju muudatusi.

Lisaks testimissüsteemidele on meil olemas seire- ja häiresüsteemid, mis jälgivad pidevalt süsteemi komponentide olekut, ressursikulu ja muid olulisi näitajaid, andes meile teada vaid siis, kui inimese sekkumine on vajalik.

Alternatiivid

Vaatasime kohandatud ressurssidele mõnda alternatiivi, nagu mutatsiooni juurdepääsukontrollerid ja mallisüsteemid. Siiski on neil kõigil olulisi tegevusprobleeme, mistõttu valisime CRD-tee.

Mutatsioonilist sissepääsukontrollerit kasutati külgkorvide, keskkonnamuutujate ja muu käitusaja toe tutvustamiseks. Siiski seisis see silmitsi mitmesuguste probleemidega, nagu ressursside sidumine ja elutsükli haldamine, mille puhul selliseid probleeme ei esine kapitalinõuete direktiivis.

Märkus: Sarnaste konfiguratsioonidega rakenduste käitamiseks kasutatakse laialdaselt ka mallisüsteeme, nagu Helm diagrammid. Meie töörakendused on aga liiga mitmekesised, et neid mallide abil hallata. Ka pideva juurutamise ajal esineb mallide kasutamisel liiga palju vigu.

Tulevased tööd

Praegu tegeleme kõigi meie klastrite segakoormusega. Selliste erinevat tüüpi ja suurusega protsesside toetamiseks töötame järgmistes valdkondades:

  • Klastrite kogum jaotab mastaapsuse ja stabiilsuse tagamiseks suuri rakendusi eri klastrite vahel.
  • Klastrite stabiilsuse, mastaapsuse ja nähtavuse tagamine rakenduste ühenduvuse ja SLA-de loomiseks.
  • Ressursside ja kvootide haldamine nii, et rakendused ei läheks üksteisega vastuollu ning klastri ulatust kontrollime meie poolt.
  • Uus CI/CD platvorm rakenduste toetamiseks ja juurutamiseks Kubernetesis.

Allikas: www.habr.com

Lisa kommentaar