Tijekom godina svog postojanja Pinterest je 300 milijuna korisnika usluge stvorilo više od 200 milijardi pinova na više od 4 milijarde ploča. Kako bi služio ovoj vojsci korisnika i opsežnoj bazi sadržaja, portal je razvio tisuće servisa, od mikroservisa koje može podržati nekoliko CPU-a do golemih monolita koji se vrte na cijelom parku virtualnih mašina. I došao je trenutak kada je pogled kompanije pao na k8s. Što je to toliko privuklo „Pinterest“? O tome ćete saznati iz našeg prijevoda svježe objavljene članka iz .

Dakle, stotine milijuna korisnika i stotine milijardi pinova. Kako bismo podržali ovu vojsku korisnika i opsežnu bazu sadržaja, razvili smo tisuće servisa, od mikroservisa koje može podržati nekoliko CPU-a do ogromnih monolita koji se vrte na cijelom parku virtualnih mašina. Osim toga, imamo raznolike okvire koji također mogu zahtijevati resurse CPU-a, memorije ili pristup ulazno-izlaznim operacijama.
Tijekom podrške ovom zoološkom vrtu alata, tim razvijenja suočava se s nizom problema:
- Inženjeri nemaju jedinstven način pokretanja radnog okruženja. Stateless servisi, Stateful servisi i projekti koji su u aktivnom razvoju temelje se na potpuno različitim tehnološkim skupovima. To je dovelo do stvaranja cijelog tečaja obuke za inženjere, a također ozbiljno otežava rad našem infrastrukturnom timu.
- Razvijači, koji imaju na raspolaganju vlastiti park virtualnih mašina, stvaraju ogromno opterećenje na unutarnje administratore. Kao rezultat, takve jednostavne operacije, poput ažuriranja OS-a ili AMI-a, produžavaju se na tjedne i mjesece. To dovodi do povećanja opterećenja u, čini se, potpuno uobičajenim situacijama.
- Složenosti u izradi globalnih alata za upravljanje infrastrukturom preko već postojećih rješenja. Situaciju dodatno otežava to što je teško pronaći vlasnike virtualnih mašina. To jest, ne znamo možemo li sigurno izvući te resurse za rad na drugim dijelovima naše infrastrukture.
Sustavi orkestracije kontejnera su način za unifikaciju upravljanja radnim opterećenjem. Otvaraju vam put ka povećanju brzine razvoja i pojednostavljuju upravljanje infrastrukturom, s obzirom da svi resursi uključeni u projekt upravljaju jednom centraliziranom sistemu.

Slika 1: Prioriteti infrastrukture (pouzdanost, produktivnost developera i učinkovitost).
Tim Cloud Management Platforme u Pinterestu upoznao se s K8s u 2017. godini. Do prve polovice 2017. dokumentirali smo veći dio naših proizvodnih resursa, uključujući API i sve naše web servere. Nakon toga smo proveli detaljnu procjenu raznih sustava za orkestraciju rješenja s kontejnerima, izgradnju klastera i njihovo upravljanje. Do kraja 2017. odlučili smo se za Kubernetes. Bio je dovoljno fleksibilan i široko podržavan u razvojnim zajednicama.
Do sada smo izradili vlastite alate za inicijalno pokretanje klastera temeljenog na Kops-u i prebacili postojeće infrastrukturne komponente na Kubernetes — kao što su mreža, sigurnost, metrike, vođenje evidencije, upravljanje identitetom i promet. Također smo implementirali sustav za modeliranje radnog opterećenja za naše resurse, čija je složenost skrivena od developera. Trenutno smo fokusirani na osiguranje stabilnosti klastera, njegovom skaliranju i povezivanju novih klijenata.
Kubernetes: put Pinterest
Pokretanje rada s Kubernetesom na razini Pinterest-a kao platforme koju će naši inženjeri voljeti donijelo je mnogo izazova.
Kao velika kompanija uložili smo značajna sredstva u infrastrukturne alate. Primjerice, tu su alati za sigurnost koji obrađuju certifikate i distribuiraju ključeve, komponente kontrole prometa, sustavi otkrivanja usluga, komponente vidljivosti i slanja evidencija i metrika. Sve to nije prikupljeno slučajno: prošli smo kroz uobičajen proces pokušaja i pogrešaka, pa je bilo poželjno integrirati sve to u novu infrastrukturu na Kubernetes-u umjesto da iznova izmišljamo stari bicikl na novoj platformi. Ovakav pristup u cjelini je pojednostavio migraciju, budući da toda podrška aplikacija već postoji, a nije je potrebno stvoriti ispočetka.
S druge strane, modeli predikcije opterećenja unutar Kubernetes-a (poput implementacija, poslova i Daemon setova) nisu dovoljni za naš projekt. Ovi problemi u upotrebljivosti predstavljaju ogromne prepreke za prelazak na Kubernetes. Na primjer, čuli smo kako se programeri usluga žale na nedostatak ili pogrešne postavke ulaza. Također smo se susretali s pogrešnim korištenjem predložaka, kada su stvorene stotine kopija s identičnim specifikacijama i zadacima, što je rezultiralo strašnim problemima s ispravljanjem grešaka.
Također je bilo vrlo teško podržati različite verzije unutar istog klastera. Zamislite samo složenost korisničke podrške ako morate raditi istovremeno u više verzija istog izvršnog okruženja, sa svim njihovim problemima, greškama i ažuriranjima.
Korisnički resursi i kontroleri Pinterest-a
Kako bismo olakšali našim inženjerima proces implementacije Kubernetes-a, kao i pojednostavili infrastrukturu i ubrzali njen rad, razvili smo vlastite definicije korisničkih resursa (CRD).
CRD pružaju sljedeće funkcionalnosti:
- Spajanje različitih nativnih resursa Kubernetes-a kako bi radili kao jedinstveno opterećenje. Na primjer, resurs PinterestService uključuje implementaciju, ulaznu uslugu i konfiguracijsku kartu. To omogućava programerima da se ne brinu o postavkama DNS-a.
- Implementacija potrebne podrške aplikacija. Korisnik se mora usredotočiti samo na specifikaciju kontejnera prema svojoj poslovnoj logici, dok kontroler CRD implementira sve potrebne init-kontejnere, varijable okruženja i specifikacije podova. Ovo osigurava suštinski drugačiju razinu udobnosti za programere.
- Kontroleri CRD također upravljaju životnim ciklusom vlastitih resursa i poboljšavaju dostupnost ispravljanja grešaka. To uključuje usklađivanje željenih i stvarnih specifikacija, ažuriranje statusa CRD-a i vođenje evidencije o događajima i ne samo tome. Bez CRD-a, programeri bi bili prisiljeni upravljati brojnim skupovima resursa, što bi samo povećalo vjerovatnost greške.
Evo primjera PinterestService i unutarnjeg resursa kojeg upravlja naš kontroler:

Kao što je ranije prikazano, za podršku korisničkom kontejneru potrebno je integrirati kontejner za inicijalizaciju i nekoliko dodataka kako bi se osigurala sigurnost, vidljivost i rad s mrežnim prometom. Osim toga, izradili smo predloške konfiguracijskih karata i implementirali podršku za PVC predloške za grupne zadatke, kao i praćenje niza varijabli okruženja za identifikaciju, korištenje resursa i prikupljanje 'otpada'.
Teško je zamisliti da bi programeri željeli ručno pisati te konfiguracijske datoteke bez podrške CRD, a kamoli daljnje održavanje i otklanjanje grešaka u konfiguracijama.
Radni tok implementacije aplikacija

Na gornjem slikovnom prikazu prikazano je kako implementirati korisnički resurs Pinterest u Kubernetes klasteru:
- Programeri komuniciraju s našim Kubernetes klasterom putem CLI-a i korisničkog sučelja.
- CLI / UI alati izvlače YAML konfiguracijske datoteke radnog toka i druge značajke gradnje (isti identifikator verzije) iz Artifactory-ja, nakon čega ih šalju u Job Submission Service. Ovaj korak osigurava da u klaster budu isporučene samo radne verzije.
- JSS služi kao pristupna točka za različite platforme, uključujući Kubernetes. Ovdje se odvija autentifikacija korisnika, dodjela kvota i djelomična provjera konfiguracije našeg CRD-a.
- Nakon provjere CRD-a s JSS strane, informacije se šalju na API platforme k8s.
- Naš CRD kontroler prati događaje na svim korisničkim resursima. Pretvara CR u nativne resurse k8s, dodaje potrebne module, postavlja odgovarajuće varijable okruženja i obavlja druge pomoćne zadatke, čime osigurava dovoljnu infrastrukturnu podršku korisničkim aplikacijama u kontejnerima.
- Zatim CRD kontroler prosljeđuje dobivene podatke u Kubernetes API kako bi ih obradio planer i pokrenuo u rad.
Napomena: Ova predizdajna radna procedura implementacije stvorena je za prve korisnike nove k8s platforme. Trenutno smo u procesu dorade ovog procesa kako bismo se potpuno integrirali s našim novim CI/CD. To znači da ne možemo otkriti sve informacije vezane uz Kubernetes. Radujemo se dijeljenju našeg iskustva i izvještavanju o napretku tima u ovom smjeru u našem sljedećem blogu „Izgradnja CI/CD platforme za Pinterest“.
Vrste specijalnih resursa
Uzimajući u obzir specifične potrebe Pinteresta, razvili smo sljedeće CRD-ove koji su prikladni za različite radne tokove:
- PinterestService su stateless usluge koje djeluju već duže vrijeme. Mnogi naši osnovni sustavi temelje se na skupu tih usluga.
- PinterestJobSet modelira seriju zadataka punog ciklusa. U Pinterestu postoji uobičajen scenarij u kojem više zadataka pokreće iste kontejnere paralelno, bez obzira na druge slične procese.
- PinterestCronJob se široko koristi u kombinaciji s malim periodičnim opterećenjima. To je omotač za izvorne cron operacije s mehanizmima podrške Pinterestu koji se brinu za sigurnost, promet, zapise i metrike.
- PinterestDaemon obuhvaća infrastrukturne demone. Ova obitelj se nastavlja širiti jer dodajemo sve više podrške za naše klastere.
- PinterestTrainingJob pokriva procese Tensorflow i Pytorch, osiguravajući istu razinu podrške tijekom rada kao i svi drugi CRD-ovi. Budući da Pinterest aktivno koristi Tensorflow i druge sustave strojnog učenja, imalo je smisla izgraditi poseban CRD oko njih.
Također radimo na PinterestStatefulSet, koji će uskoro biti prilagođen za baze podataka i druge stateful sustave.
Podrška za okruženje izvršavanja
Kada se aplikacijski modul pokrene u Kubernetesu, automatski dobiva certifikat za svoju identifikaciju. Ovaj certifikat se koristi za pristup tajnom skladištu ili za komunikaciju s drugim uslugama putem mTLS-a. U međuvremenu, konfigurator za inicijalizaciju kontejnera i Daemon učitavat će sve potrebne ovisnosti prije nego što pokrene aplikaciju u kontejneru. Kada sve bude spremno, sidecar za promet i Daemon registrirat će IP adresu modula u našem Zookeeperu kako bi ga klijenti mogli otkriti. Sve ovo će funkcionirati jer je mrežni modul konfiguriran prije pokretanja aplikacije.
Iznad su navedeni tipični primjeri podrške za radne opterećenja tijekom izvršavanja. Za druge tipove radnih opterećenja može biti potrebna nešto drugačija podrška, no svi su prikazani kao sidecar na razini pod-a, nodovima ili Daemon-ima na razini virtualnih mašina. Pratimo da se sve ovo izvodi unutar upravljačke infrastrukture i da je usklađeno između aplikacija, što u konačnici značajno smanjuje opterećenje u pogledu tehničkih radova i korisničke podrške.
Testiranje i QA
Sastavili smo end-to-end testni kanal iznad postojeće testne infrastrukture Kubernetes. Ovi testovi se šire na sve naše klastere. Naš pipeline je prošao kroz brojne prepravke prije nego što je postao dio produktivnog klastera.
Osim sustava testiranja, imamo sustave za praćenje i obavještavanje koji stalno prate stanje komponenti sustava, potrošnju resursa i druge važne pokazatelje, obavještavajući nas samo kada je potrebno ljudsko posredovanje.
Alternatives
Razmatrali smo neke alternative prilagođenim resursima, poput mutacijskih kontrolera pristupa i sustava predložaka. Ipak, svi oni su povezani s ozbiljnim poteškoćama u radu, pa smo izabrali put CRD.
Mutacijski kontroler pristupa korišten je za umetanje sidecara, varijabli okruženja i druge podrške tijekom izvršavanja. Ipak, suočavao se s raznim problemima, poput vezivanja resursa i upravljanja njihovim životnim ciklusom, dok u CRD-u takvi problemi ne postoje.
Napomena: Sustavi predložaka, poput Helm dijagrama, također se široko koriste za pokretanje aplikacija sličnih konfiguracija. Međutim, naše radne aplikacije su previše raznolike da bi se njima moglo upravljati putem predložaka. Također, tijekom neprekidnog implementiranja koristi od predložaka doći će do previše grešaka.
Nadolazeći zadatak
Trenutno se suočavamo sa miješanom opterećenjem na svim našim klasterima. Kako bismo podržali slične procese različitih tipova i veličina, radimo u sljedećim smjerovima:
- Skup klastera raspoređuje velike aplikacije po raznim klasterima radi osiguravanja skalabilnosti i stabilnosti.
- Osiguranje stabilnosti, skalabilnosti i vidljivosti klastera za uspostavljanje veze između aplikacije i njenog SLA-a.
- Upravljanje resursima i kvotama kako bi se aplikacije ne sukobljavale, a skalabilnost klastera kontrolirala s naše strane.
- Nova CI/CD platforma za podršku i implementaciju aplikacija u Kubernetesu.
Izvor: habr.com
