Ustvarjanje platforme kubernetes na Pinterestu

V preteklih letih je 300 milijonov uporabnikov Pinteresta ustvarilo več kot 200 milijard žebljičkov na več kot 4 milijardah plošč. Da bi služil tej vojski uporabnikov in obsežni vsebinski bazi, je portal razvil na tisoče storitev, od mikrostoritev, ki jih lahko upravlja nekaj CPE, do velikanskih monolitov, ki delujejo na celotni floti virtualnih strojev. In potem je prišel trenutek, ko so oči podjetja padle na k8s. Zakaj je "kocka" dobro izgledala na Pinterestu? O tem boste izvedeli iz našega prevoda nedavnega članka iz blog Pinterest inženiring.

Ustvarjanje platforme kubernetes na Pinterestu

Torej, na stotine milijonov uporabnikov in na stotine milijard pinov. Da bi služili tej vojski uporabnikov in obsežni bazi vsebin, smo razvili na tisoče storitev, od mikrostoritev, ki jih lahko upravlja nekaj CPU-jev, do velikanskih monolitov, ki delujejo na celotnih flotah virtualnih strojev. Poleg tega imamo različna ogrodja, ki lahko zahtevajo tudi dostop do procesorja, pomnilnika ali V/I.

Pri vzdrževanju tega živalskega vrta orodij se razvojna ekipa sooča s številnimi izzivi:

  • Za inženirje ni enotnega načina za vodenje proizvodnega okolja. Storitve brez stanja, storitve z zaznavanjem stanja in projekti v aktivnem razvoju temeljijo na popolnoma različnih tehnoloških nizih. To je privedlo do oblikovanja celotnega tečaja usposabljanja za inženirje, poleg tega pa resno otežuje delo naše ekipe za infrastrukturo.
  • Razvijalci z lastno floto virtualnih strojev ustvarjajo veliko breme za notranje skrbnike. Posledično tako preproste operacije, kot je posodabljanje OS ali AMI, trajajo tedne in mesece. To vodi do povečane delovne obremenitve v na videz popolnoma vsakdanjih situacijah.
  • Težave pri ustvarjanju orodij za upravljanje globalne infrastrukture poleg obstoječih rešitev. Situacijo dodatno otežuje dejstvo, da iskanje lastnikov virtualnih strojev ni preprosto. To pomeni, da ne vemo, ali je to zmogljivost mogoče varno pridobiti za delovanje v drugih delih naše infrastrukture.

Sistemi za orkestracijo vsebnikov so način za poenotenje upravljanja delovne obremenitve. Odpirajo vrata povečani hitrosti razvoja in poenostavljajo upravljanje infrastrukture, saj vse vire, vključene v projekt, upravlja en centraliziran sistem.

Ustvarjanje platforme kubernetes na Pinterestu

Slika 1: Prednostne naloge infrastrukture (zanesljivost, produktivnost razvijalcev in učinkovitost).

Ekipa Cloud Management Platform pri Pinterestu je leta 8 odkrila K2017s. Do prve polovice leta 2017 smo dokumentirali večino naših proizvodnih zmogljivosti, vključno z API-jem in vsemi našimi spletnimi strežniki. Nato smo izvedli temeljito oceno različnih sistemov za orkestriranje kontejnerskih rešitev, gradnjo grozdov in delo z njimi. Proti koncu leta 2017 smo se odločili za uporabo Kubernetesa. Bil je precej prilagodljiv in široko podprt v skupnosti razvijalcev.

Do danes smo zgradili lastna orodja za zagon gruče, ki temeljijo na Kopsu, in preselili obstoječe komponente infrastrukture, kot so mreženje, varnost, metrike, beleženje, upravljanje identitete in promet, v Kubernetes. Implementirali smo tudi sistem za modeliranje delovne obremenitve za naš vir, katerega kompleksnost razvijalcem skrivamo. Zdaj smo osredotočeni na zagotavljanje stabilnosti grozda, njegovo skaliranje in povezovanje novih strank.

Kubernetes: Pinterest način

Začetek uporabe Kubernetesa na ravni Pinteresta kot platforme, ki bi jo naši inženirji vzljubili, je bil povezan s številnimi izzivi.

Kot veliko podjetje smo veliko vlagali v infrastrukturna orodja. Primeri vključujejo varnostna orodja, ki obravnavajo obdelavo certifikatov in distribucijo ključev, komponente za nadzor prometa, sisteme za odkrivanje storitev, komponente vidnosti ter komponente za pošiljanje dnevnikov in meritev. Vse to je bilo zbrano z razlogom: šli smo po običajni poti poskusov in napak, zato smo želeli vso to opremo integrirati v novo infrastrukturo na Kubernetesu, namesto da bi na novo odkrili staro kolo na novi platformi. Ta pristop je na splošno poenostavil selitev, saj vsa podpora za aplikacije že obstaja in je ni treba ustvariti iz nič.

Po drugi strani pa modeli napovedovanja obremenitve v samem Kubernetesu (kot so uvedbe, opravila in nabori Daemon) ne zadostujejo za naš projekt. Te težave z uporabnostjo so velike ovire za prehod na Kubernetes. Na primer, slišali smo, da se razvijalci storitev pritožujejo zaradi manjkajočih ali nepravilnih nastavitev za prijavo. Naleteli smo tudi na nepravilno uporabo mehanizmov predlog, ko je bilo ustvarjenih na stotine kopij z isto specifikacijo in nalogo, kar je povzročilo nočne more težav pri odpravljanju napak.

Prav tako je bilo zelo težko vzdrževati različne različice v isti gruči. Predstavljajte si zapletenost podpore strankam, če morate sočasno delati v več različicah istega izvajalnega okolja z vsemi njihovimi težavami, napakami in posodobitvami.

Uporabniške lastnosti in krmilniki Pinterest

Da bi našim inženirjem olajšali implementacijo Kubernetesa ter poenostavili in pospešili našo infrastrukturo, smo razvili lastne definicije virov po meri (CRD).

CRD zagotavljajo naslednje funkcije:

  1. Združevanje različnih izvornih virov Kubernetes, tako da delujejo kot ena delovna obremenitev. Na primer, vir PinterestService vključuje uvajanje, prijavno storitev in konfiguracijski zemljevid. To razvijalcem omogoča, da ne skrbijo za nastavitev DNS.
  2. Izvedite potrebno podporo za aplikacije. Uporabnik se mora osredotočiti le na specifikacijo vsebnika v skladu s svojo poslovno logiko, medtem ko krmilnik CRD izvaja vse potrebne init vsebnike, spremenljivke okolja in specifikacije pod. To zagotavlja bistveno drugačno raven udobja za razvijalce.
  3. Krmilniki CRD prav tako upravljajo življenjski cikel izvornih virov in izboljšujejo razpoložljivost odpravljanja napak. To vključuje usklajevanje želenih in dejanskih specifikacij, posodabljanje statusa CRD in vzdrževanje dnevnikov dogodkov in drugo. Brez CRD bi bili razvijalci prisiljeni upravljati več virov, kar bi samo povečalo verjetnost napake.

Tu je primer storitve PinterestService in notranjega vira, ki ga upravlja naš krmilnik:

Ustvarjanje platforme kubernetes na Pinterestu

Kot lahko vidite zgoraj, moramo za podporo vsebnika po meri integrirati vsebnik init in več dodatkov za zagotavljanje varnosti, vidnosti in omrežnega prometa. Poleg tega smo ustvarili predloge konfiguracijskih zemljevidov in uvedli podporo za predloge PVC za paketna opravila ter sledenje več spremenljivkam okolja za sledenje identiteti, porabi virov in zbiranju smeti.

Težko si je predstavljati, da bi razvijalci želeli ročno pisati te konfiguracijske datoteke brez podpore CRD, kaj šele nadalje vzdrževati in odpravljati napake v konfiguracijah.

Delovni tok uvajanja aplikacije

Ustvarjanje platforme kubernetes na Pinterestu

Zgornja slika prikazuje, kako razmestiti vir po meri Pinterest v gručo Kubernetes:

  1. Razvijalci komunicirajo z našo gručo Kubernetes prek CLI in uporabniškega vmesnika.
  2. Orodja CLI/UI pridobijo datoteke YAML konfiguracije delovnega toka in druge lastnosti gradnje (isti ID različice) iz Artifactory in jih nato predložijo storitvi Job Submission Service. Ta korak zagotavlja, da so v gručo dostavljene samo produkcijske različice.
  3. JSS je prehod za različne platforme, vključno s Kubernetesom. Tukaj se uporabnik overi, izdajo se kvote in delno preveri konfiguracija našega CRD.
  4. Po preverjanju CRD na strani JSS se informacije pošljejo API-ju platforme k8s.
  5. Naš krmilnik CRD spremlja dogodke na vseh uporabniških virih. Pretvori CR-je v izvorne vire k8s, doda potrebne module, nastavi ustrezne spremenljivke okolja in izvede drugo podporno delo, da zagotovi, da imajo vsebniške uporabniške aplikacije zadostno infrastrukturno podporo.
  6. Krmilnik CRD nato prejete podatke posreduje API-ju Kubernetes, tako da jih lahko razporejevalnik obdela in da v produkcijo.

Obvestilo: Ta potek dela pred izdajo uvajanja je bil ustvarjen za prve uporabnike nove platforme k8s. Trenutno smo v procesu izpopolnjevanja tega postopka za popolno integracijo z našim novim CI/CD. To pomeni, da vam ne moremo povedati vsega, kar je povezano s Kubernetesom. Veselimo se, da bomo svoje izkušnje in napredek ekipe v tej smeri delili v naši naslednji objavi v spletnem dnevniku, »Izdelava platforme CI/CD za Pinterest«.

Vrste posebnih sredstev

Na podlagi posebnih potreb Pinteresta smo razvili naslednje CRD, ki ustrezajo različnim potekom dela:

  • PinterestService so storitve brez stanja, ki delujejo že dolgo časa. Številni naši osrednji sistemi temeljijo na naboru takih storitev.
  • PinterestJobSet modelira paketna opravila celotnega cikla. Pogost scenarij na Pinterestu je, da več opravil vzporedno izvaja iste vsebnike, ne glede na druge podobne procese.
  • PinterestCronJob se pogosto uporablja v povezavi z majhnimi periodičnimi obremenitvami. To je ovoj za izvorno delo cron s podpornimi mehanizmi Pinterest, ki so odgovorni za varnost, promet, dnevnike in meritve.
  • PinterestDaemon vključuje infrastrukturne demone. Ta družina še naprej raste, ko dodajamo več podpore našim grozdom.
  • PinterestTrainingJob se razširja na procese Tensorflow in Pytorch ter zagotavlja enako raven podpore med izvajanjem kot vsi drugi CRD-ji. Ker Pinterest aktivno uporablja Tensorflow in druge sisteme strojnega učenja, smo imeli razlog, da okoli njih zgradimo ločen CRD.

Delamo tudi na PinterestStatefulSet, ki bo kmalu prilagojen za podatkovna skladišča in druge sisteme s stanjem.

Podpora za izvajanje

Ko se paket aplikacije izvaja v Kubernetesu, samodejno prejme potrdilo za identifikacijo. To potrdilo se uporablja za dostop do skrivnega pomnilnika ali za komunikacijo z drugimi storitvami prek mTLS. Medtem bosta Container Init Configurator in Daemon prenesla vse potrebne odvisnosti, preden zaženeta posodobljeno aplikacijo. Ko bo vse pripravljeno, bosta prometna stranska prikolica in Daemon registrirala naslov IP modula pri našem Zookeeperju, da ga lahko stranke odkrijejo. Vse to bo delovalo, ker je bil omrežni modul konfiguriran pred zagonom aplikacije.

Zgoraj so tipični primeri podpore izvajalnega časa za delovne obremenitve. Druge vrste delovnih obremenitev lahko zahtevajo nekoliko drugačno podporo, vendar so vse v obliki stranskih prikolic na ravni podov, demonov na ravni vozlišč ali na ravni virtualnih strojev. Zagotavljamo, da je vse to razporejeno znotraj upravljavske infrastrukture in konsistentno med aplikacijami, kar na koncu bistveno zmanjša obremenitev glede tehničnega dela in podpore uporabnikom.

Testiranje in zagotavljanje kakovosti

Nad obstoječo testno infrastrukturo Kubernetes smo zgradili testni cevovod od konca do konca. Ti testi veljajo za vse naše grozde. Naš cevovod je šel skozi številne revizije, preden je postal del grozda izdelkov.

Poleg sistemov za testiranje imamo sisteme za spremljanje in opozarjanje, ki nenehno spremljajo stanje komponent sistema, porabo virov in druge pomembne indikatorje ter nas obvestijo le, ko je nujen človeški poseg.

Alternativa

Ogledali smo si nekaj alternativ virom po meri, kot so krmilniki dostopa do mutacije in sistemi predlog. Vendar pa vsi prihajajo s precejšnjimi operativnimi izzivi, zato smo izbrali pot CRD.

Krmilnik mutacijskega sprejema je bil uporabljen za uvedbo stranskih prikolic, spremenljivk okolja in druge podpore za čas izvajanja. Vendar pa se je soočal z različnimi težavami, kot sta vezava virov in upravljanje življenjskega cikla, kjer se takšne težave ne pojavljajo v CRD.

Opomba: Sistemi predlog, kot so grafikoni Helm, se pogosto uporabljajo tudi za izvajanje aplikacij s podobnimi konfiguracijami. Vendar so naše delovne aplikacije preveč raznolike, da bi jih upravljali s predlogami. Tudi med neprekinjenim uvajanjem bo pri uporabi predlog preveč napak.

Prihajajoče delo

Trenutno imamo opravka z mešano obremenitvijo v vseh naših grozdih. Za podporo takim procesom različnih vrst in velikosti delujemo na naslednjih področjih:

  • Zbirka gruč porazdeli velike aplikacije po različnih gručih za razširljivost in stabilnost.
  • Zagotavljanje stabilnosti gruče, razširljivosti in vidnosti za ustvarjanje povezljivosti aplikacij in SLA.
  • Upravljanje z viri in kvotami, tako da aplikacije niso v konfliktu med seboj, z naše strani pa nadzorujemo obseg gruče.
  • Nova platforma CI/CD za podporo in uvajanje aplikacij na Kubernetes.

Vir: www.habr.com

Dodaj komentar