Kreiranje kubernetes platforme na Pinterestu

Tokom godina, 300 miliona korisnika Pinteresta kreiralo je više od 200 milijardi pinova na više od 4 milijarde ploča. Da bi služio ovoj armiji korisnika i ogromnoj bazi sadržaja, portal je razvio hiljade usluga, u rasponu od mikroservisa kojima može upravljati nekoliko CPU-a, do ogromnih monolita koji rade na cijeloj floti virtuelnih mašina. A onda je došao trenutak kada je pogled kompanije pao na k8s. Zašto je „kocka“ dobro izgledala na Pinterestu? O tome ćete saznati iz našeg prijevoda nedavnog članka iz blog Pinterest inženjering.

Kreiranje kubernetes platforme na Pinterestu

Dakle, stotine miliona korisnika i stotine milijardi pinova. Da bismo služili ovoj armiji korisnika i ogromnoj bazi sadržaja, razvili smo hiljade servisa, u rasponu od mikroservisa kojima može upravljati nekoliko CPU-a, do ogromnih monolita koji rade na čitavoj floti virtuelnih mašina. Osim toga, imamo razne okvire koji također mogu zahtijevati pristup CPU-u, memoriji ili I/O.

U održavanju ovog zoološkog vrta alata, razvojni tim se suočava s nizom izazova:

  • Ne postoji jedinstven način na koji inženjeri vode proizvodno okruženje. Stateless usluge, Stateful usluge i projekti u aktivnom razvoju baziraju se na potpuno različitim tehnološkim stackovima. To je dovelo do kreiranja čitavog kursa za obuku inženjera, a takođe ozbiljno komplikuje rad našeg infrastrukturnog tima.
  • Programeri sa sopstvenom flotom virtuelnih mašina stvaraju ogroman teret internim administratorima. Kao rezultat, takve jednostavne operacije kao što je ažuriranje OS-a ili AMI-ja traju tjednima i mjesecima. To dovodi do povećanog opterećenja u naizgled apsolutno svakodnevnim situacijama.
  • Poteškoće u kreiranju globalnih alata za upravljanje infrastrukturom povrh postojećih rješenja. Situaciju dodatno komplikuje činjenica da pronalaženje vlasnika virtuelnih mašina nije lako. Odnosno, ne znamo da li se ovaj kapacitet može bezbedno izvući za rad u drugim delovima naše infrastrukture.

Sistemi orkestracije kontejnera su način objedinjavanja upravljanja radnim opterećenjem. Oni otvaraju vrata povećanju brzine razvoja i pojednostavljuju upravljanje infrastrukturom, budući da se svim resursima uključenim u projekat upravlja jednim centralizovanim sistemom.

Kreiranje kubernetes platforme na Pinterestu

Slika 1: Infrastrukturni prioriteti (pouzdanost, produktivnost programera i efikasnost).

Tim Cloud Management Platforma u Pinterestu otkrio je K8s 2017. Do prve polovine 2017. godine, dokumentirali smo većinu naših proizvodnih mogućnosti, uključujući API i sve naše web servere. Nakon toga smo izvršili temeljnu procjenu različitih sistema za orkestriranje kontejnerskih rješenja, izgradnju klastera i rad s njima. Krajem 2017. odlučili smo koristiti Kubernetes. Bio je prilično fleksibilan i široko podržan u zajednici programera.

Do danas smo izgradili vlastite alate za pokretanje klastera zasnovane na Kops-u i migrirali postojeće komponente infrastrukture kao što su umrežavanje, sigurnost, metrika, evidentiranje, upravljanje identitetom i promet na Kubernetes. Također smo implementirali sistem modeliranja radnog opterećenja za naš resurs, čija je složenost skrivena od programera. Sada smo fokusirani na osiguranje stabilnosti klastera, njegovo skaliranje i povezivanje novih klijenata.

Kubernetes: Pinterest način

Početak rada s Kubernetesom na razini Pinteresta kao platforme koju bi naši inženjeri voljeli naišao je na mnogo izazova.

Kao velika kompanija, uložili smo mnogo u infrastrukturne alate. Primjeri uključuju sigurnosne alate koji rukuju certifikatima i distribucijom ključeva, komponente kontrole prometa, sisteme za otkrivanje usluga, komponente vidljivosti i komponente otpremanja dnevnika i metrike. Sve je ovo prikupljeno s razlogom: prošli smo normalan put pokušaja i grešaka, i stoga smo željeli integrirati svu ovu opremu u novu infrastrukturu na Kubernetesu umjesto da izmišljamo stari točak na novoj platformi. Ovaj pristup je sveukupno pojednostavio migraciju, jer sva podrška za aplikacije već postoji i ne treba je kreirati od nule.

S druge strane, modeli predviđanja opterećenja u samom Kubernetesu (kao što su implementacije, poslovi i skupovi demona) nisu dovoljni za naš projekat. Ovi problemi upotrebljivosti predstavljaju ogromne prepreke prelasku na Kubernetes. Na primjer, čuli smo da se programeri usluga žale na nedostajuće ili netačne postavke za prijavu. Naišli smo i na nepravilnu upotrebu šablonskih mehanizama, kada su kreirane stotine kopija sa istom specifikacijom i zadatkom, što je rezultiralo košmarnim problemima u otklanjanju grešaka.

Također je bilo vrlo teško održavati različite verzije u istom klasteru. Zamislite složenost korisničke podrške ako trebate raditi istovremeno u više verzija istog runtime okruženja, sa svim njihovim problemima, greškama i ažuriranjima.

Pinterest korisnička svojstva i kontroleri

Kako bismo olakšali našim inženjerima implementaciju Kubernetesa, te pojednostavili i ubrzali našu infrastrukturu, razvili smo vlastite prilagođene definicije resursa (CRD).

CRD-ovi pružaju sljedeću funkcionalnost:

  1. Kombinovanje različitih izvornih Kubernetes resursa tako da rade kao jedno radno opterećenje. Na primjer, resurs PinterestService uključuje implementaciju, uslugu prijave i mapu konfiguracije. Ovo omogućava programerima da ne brinu o postavljanju DNS-a.
  2. Implementirajte potrebnu podršku za aplikaciju. Korisnik treba da se fokusira samo na specifikaciju kontejnera u skladu sa svojom poslovnom logikom, dok CRD kontroler implementira sve potrebne init kontejnere, varijable okruženja i pod specifikacije. Ovo pruža fundamentalno drugačiji nivo udobnosti za programere.
  3. CRD kontroleri također upravljaju životnim ciklusom izvornih resursa i poboljšavaju dostupnost otklanjanja grešaka. Ovo uključuje usklađivanje željenih i stvarnih specifikacija, ažuriranje CRD statusa i održavanje dnevnika događaja i još mnogo toga. Bez CRD-a, programeri bi bili prisiljeni upravljati višestrukim resursima, što bi samo povećalo vjerovatnoću greške.

Evo primjera PinterestServicea i internog resursa kojim upravlja naš kontrolor:

Kreiranje kubernetes platforme na Pinterestu

Kao što možete vidjeti gore, da bismo podržali prilagođeni kontejner, moramo integrirati init kontejner i nekoliko dodataka kako bismo osigurali sigurnost, vidljivost i mrežni promet. Pored toga, kreirali smo šablone konfiguracionih mapa i implementirali podršku za PVC šablone za batch poslove, kao i praćenje višestrukih varijabli okruženja za praćenje identiteta, potrošnje resursa i prikupljanja smeća.

Teško je zamisliti da bi programeri željeli da pišu ove konfiguracijske datoteke ručno bez CRD podrške, a kamoli dalje održavanje i otklanjanje grešaka u konfiguracijama.

Tok rada za implementaciju aplikacije

Kreiranje kubernetes platforme na Pinterestu

Slika iznad pokazuje kako implementirati Pinterest prilagođeni resurs u Kubernetes klaster:

  1. Programeri stupaju u interakciju s našim Kubernetes klasterom kroz CLI i korisničko sučelje.
  2. CLI/UI alati preuzimaju YAML datoteke konfiguracije toka posla i druga svojstva građenja (isti ID verzije) iz Artifactoryja, a zatim ih šalju Službi za podnošenje posla. Ovaj korak osigurava da se klasteru isporučuju samo proizvodne verzije.
  3. JSS je gateway za različite platforme, uključujući Kubernetes. Ovdje se korisnik autentifikuje, izdaju se kvote i djelimično se provjerava konfiguracija našeg CRD-a.
  4. Nakon provjere CRD-a na JSS strani, informacije se šalju API-ju platforme k8s.
  5. Naš CRD kontroler prati događaje na svim korisničkim resursima. Konvertuje CR-ove u izvorne k8s resurse, dodaje potrebne module, postavlja odgovarajuće varijable okruženja i obavlja druge poslove podrške kako bi osigurao da kontejnerske korisničke aplikacije imaju dovoljnu infrastrukturnu podršku.
  6. CRD kontroler zatim prosljeđuje primljene podatke Kubernetes API-ju tako da ih planer može obraditi i staviti u proizvodnju.

primjedba: Ovaj radni tok implementacije prije izdanja kreiran je za prve korisnike nove k8s platforme. Trenutno smo u procesu usavršavanja ovog procesa kako bismo se u potpunosti integrirali s našim novim CI/CD. To znači da vam ne možemo reći sve što se odnosi na Kubernetes. Radujemo se što ćemo podijeliti svoje iskustvo i napredak tima u ovom smjeru u našem sljedećem blog postu, “Izgradnja CI/CD platforme za Pinterest.”

Vrste specijalnih resursa

Na osnovu specifičnih potreba Pinterest-a, razvili smo sljedeće CRD-ove koji odgovaraju različitim tokovima posla:

  • PinterestService su usluge bez državljanstva koje rade već duže vrijeme. Mnogi od naših osnovnih sistema zasnovani su na skupu takvih usluga.
  • PinterestJobSet modelira batch poslove punog ciklusa. Uobičajeni scenario na Pinterestu je da više poslova paralelno pokreće iste kontejnere, bez obzira na druge slične procese.
  • PinterestCronJob se široko koristi u kombinaciji s malim periodičnim opterećenjima. Ovo je omot za nativni cron rad s Pinterest mehanizmima podrške koji su odgovorni za sigurnost, promet, zapise i metriku.
  • PinterestDaemon uključuje infrastrukturne demone. Ova porodica nastavlja da raste kako dodajemo više podrške našim klasterima.
  • PinterestTrainingJob se proširuje na Tensorflow i Pytorch procese, pružajući isti nivo podrške tokom izvršavanja kao i svi drugi CRD-ovi. Budući da Pinterest aktivno koristi Tensorflow i druge sisteme mašinskog učenja, imali smo razloga da oko njih napravimo poseban CRD.

Radimo i na PinterestStatefulSet-u, koji će uskoro biti adaptiran za skladišta podataka i druge sisteme za praćenje stanja.

Runtime support

Kada se modul aplikacije pokrene na Kubernetesu, automatski prima certifikat da se identifikuje. Ovaj sertifikat se koristi za pristup tajnoj memoriji ili za komunikaciju sa drugim servisima putem mTLS-a. U međuvremenu, Container Init Configurator i Daemon će preuzeti sve potrebne zavisnosti prije pokretanja kontejnerizirane aplikacije. Kada sve bude spremno, saobraćajna prikolica i Daemon će registrovati IP adresu modula kod našeg Zookeeper-a kako bi je klijenti mogli otkriti. Sve će ovo funkcionirati jer je mrežni modul konfiguriran prije pokretanja aplikacije.

Gore navedeni su tipični primjeri podrške za radna opterećenja. Druge vrste radnih opterećenja mogu zahtijevati malo drugačiju podršku, ali svi dolaze u obliku bočnih kola na nivou pod, Demona na nivou čvora ili virtuelne mašine. Osiguravamo da je sve ovo raspoređeno unutar infrastrukture upravljanja i da je konzistentno u svim aplikacijama, što u konačnici značajno smanjuje opterećenje u smislu tehničkog rada i korisničke podrške.

Testiranje i QA

Napravili smo end-to-end test pipeline na vrhu postojeće Kubernetes testne infrastrukture. Ovi testovi se primjenjuju na sve naše klastere. Naš kanal je prošao kroz mnoge revizije prije nego što je postao dio klastera proizvoda.

Pored sistema za testiranje, imamo sisteme za praćenje i uzbunjivanje koji stalno prate status komponenti sistema, potrošnju resursa i druge važne indikatore, obavještavajući nas samo kada je potrebna ljudska intervencija.

Alternative

Pogledali smo neke alternative prilagođenim resursima, kao što su kontroleri pristupa mutacija i sistemi šablona. Međutim, svi oni dolaze sa značajnim operativnim izazovima, pa smo odabrali CRD rutu.

Mutacijski kontroler prijema korišten je za uvođenje sidecara, varijabli okruženja i druge podrške za vrijeme izvođenja. Međutim, suočio se s raznim problemima, kao što su vezivanje resursa i upravljanje životnim ciklusom, gdje se takvi problemi ne pojavljuju u CRD-u.

Napomena: Sistemi šablona kao što su Helm grafikoni se takođe široko koriste za pokretanje aplikacija sa sličnim konfiguracijama. Međutim, naše radne aplikacije su previše raznolike da bi se njima moglo upravljati pomoću šablona. Također tokom kontinuirane implementacije bit će previše grešaka pri korištenju šablona.

Predstojeći rad

Trenutno se suočavamo sa mješovitim opterećenjem u svim našim klasterima. Kako bismo podržali takve procese različitih vrsta i veličina, radimo u sljedećim područjima:

  • Kolekcija klastera distribuira velike aplikacije u različite klastere radi skalabilnosti i stabilnosti.
  • Osiguravanje stabilnosti klastera, skalabilnosti i vidljivosti za kreiranje povezivanja aplikacija i SLA.
  • Upravljanje resursima i kvotama tako da se aplikacije ne sukobljavaju jedna s drugom, a obim klastera kontroliramo s naše strane.
  • Nova CI/CD platforma za podršku i implementaciju aplikacija na Kubernetes.

izvor: www.habr.com

Dodajte komentar