Stvaranje kubernetes platforme na Pinterestu

Tijekom godina, 300 milijuna korisnika Pinteresta stvorilo je više od 200 milijardi pinova na više od 4 milijarde ploča. Kako bi služio ovoj vojsci korisnika i ogromnoj bazi sadržaja, portal je razvio tisuće usluga, u rasponu od mikroservisa kojima može upravljati nekoliko CPU-a, do golemih monolita koji rade na čitavoj floti virtualnih strojeva. A onda je došao trenutak kada su oči tvrtke pale 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.

Stvaranje kubernetes platforme na Pinterestu

Dakle, stotine milijuna korisnika i stotine milijardi pinova. Kako bismo služili ovoj vojsci korisnika i ogromnoj bazi sadržaja, razvili smo tisuće usluga, u rasponu od mikroservisa kojima može upravljati nekoliko CPU-a, do golemih monolita koji rade na cijelim flotama virtualnih strojeva. Osim toga, imamo niz okvira koji također mogu zahtijevati CPU, memoriju ili I/O pristup.

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

  • Ne postoji jedinstveni način na koji inženjeri mogu voditi proizvodno okruženje. Stateless usluge, Stateful usluge i projekti u aktivnom razvoju temelje se na potpuno različitim tehnološkim skupovima. To je dovelo do stvaranja cijelog tečaja za obuku inženjera, a također ozbiljno komplicira rad našeg infrastrukturnog tima.
  • Programeri s vlastitom flotom virtualnih strojeva stvaraju veliki teret internim administratorima. Kao rezultat toga, tako 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 posve svakodnevnim situacijama.
  • Poteškoće u stvaranju alata za upravljanje globalnom infrastrukturom povrh postojećih rješenja. Situaciju dodatno komplicira činjenica da pronalazak vlasnika virtualnih strojeva nije jednostavan. Odnosno, ne znamo može li se taj kapacitet sigurno iskoristiti za rad u drugim dijelovima naše infrastrukture.

Sustavi orkestracije spremnika način su objedinjavanja upravljanja radnim opterećenjem. Otvaraju vrata povećanju brzine razvoja i pojednostavljuju upravljanje infrastrukturom, budući da svim resursima uključenim u projekt upravlja jedan centralizirani sustav.

Stvaranje kubernetes platforme na Pinterestu

Slika 1: Infrastrukturni prioriteti (pouzdanost, produktivnost programera i učinkovitost).

Tim Cloud Management Platforma na Pinterestu otkrio je K8s 2017. godine. Do prve polovice 2017. dokumentirali smo većinu naših proizvodnih mogućnosti, uključujući API i sve naše web poslužitelje. Nakon toga proveli smo temeljitu procjenu različitih sustava za orkestriranje kontejnerskih rješenja, izgradnju klastera i rad s njima. Pred kraj 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 temeljene na Kops-u i migrirali postojeće infrastrukturne komponente kao što su umrežavanje, sigurnost, metrika, bilježenje, upravljanje identitetom i promet na Kubernetes. Također smo implementirali sustav 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 platformom koju bi naši inženjeri voljeli dolazi s puno izazova.

Kao velika tvrtka, puno smo uložili u infrastrukturne alate. Primjeri uključuju sigurnosne alate koji rukuju certifikatima i distribucijom ključeva, komponente kontrole prometa, sustave za otkrivanje usluga, komponente vidljivosti i komponente za slanje dnevnika i metrike. Sve je to prikupljeno s razlogom: prošli smo uobičajeni put pokušaja i pogrešaka i stoga smo htjeli integrirati svu ovu opremu u novu infrastrukturu na Kubernetesu umjesto ponovnog izuma starog kotača na novoj platformi. Ovaj pristup općenito je pojednostavio migraciju, budući da sva podrška za aplikacije već postoji i ne mora se stvarati od nule.

S druge strane, modeli predviđanja opterećenja u samom Kubernetesu (kao što su implementacije, poslovi i Daemon setovi) nisu dovoljni za naš projekt. Ovi problemi s upotrebljivošću velike su prepreke prelasku na Kubernetes. Na primjer, čuli smo da se programeri usluga žale na nedostajuće ili netočne postavke prijave. Također smo se susreli s nepravilnom upotrebom mehanizama za predloške, kada su stotine kopija stvorene s istom specifikacijom i zadatkom, što je rezultiralo problemima s otklanjanjem pogrešaka iz noćne more.

Također je bilo vrlo teško održavati različite verzije u istom klasteru. Zamislite složenost korisničke podrške ako morate 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 našim inženjerima olakšali implementaciju Kubernetesa te pojednostavili i ubrzali našu infrastrukturu, razvili smo vlastite prilagođene definicije resursa (CRD).

CRD-ovi pružaju sljedeće funkcije:

  1. Kombiniranje 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. To programerima omogućuje da ne brinu o postavljanju DNS-a.
  2. Implementirati potrebnu aplikacijsku podršku. Korisnik se treba usredotočiti samo na specifikaciju spremnika prema svojoj poslovnoj logici, dok CRD kontroler implementira sve potrebne init spremnike, varijable okruženja i specifikacije podova. To pruža bitno drugačiju razinu udobnosti za programere.
  3. CRD kontroleri također upravljaju životnim ciklusom izvornih resursa i poboljšavaju dostupnost otklanjanja pogrešaka. To uključuje usklađivanje željenih i stvarnih specifikacija, ažuriranje statusa CRD-a i održavanje zapisa događaja i više. Bez CRD-a programeri bi bili prisiljeni upravljati višestrukim resursima, što bi samo povećalo vjerojatnost pogreške.

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

Stvaranje kubernetes platforme na Pinterestu

Kao što možete vidjeti gore, za podršku prilagođenog spremnika moramo integrirati init spremnik i nekoliko dodataka za pružanje sigurnosti, vidljivosti i mrežnog prometa. Osim toga, izradili smo predloške mape konfiguracije i implementirali podršku za PVC predloške za skupne poslove, kao i praćenje višestrukih varijabli okruženja za praćenje identiteta, potrošnje resursa i sakupljanja smeća.

Teško je zamisliti da bi programeri željeli ručno pisati ove konfiguracijske datoteke bez CRD podrške, a kamoli dalje održavati i ispravljati pogreške u konfiguracijama.

Tijek rada implementacije aplikacije

Stvaranje kubernetes platforme na Pinterestu

Gornja slika pokazuje kako implementirati prilagođeni resurs Pinteresta u Kubernetes klaster:

  1. Programeri komuniciraju s našim Kubernetes klasterom putem CLI-ja i korisničkog sučelja.
  2. CLI/UI alati dohvaćaju konfiguracijske YAML datoteke tijeka rada i druga svojstva izrade (isti ID verzije) iz Artifactoryja i zatim ih šalju u Job Submission Service. Ovaj korak osigurava da se samo proizvodne verzije isporučuju klasteru.
  3. JSS je pristupnik za razne platforme, uključujući Kubernetes. Ovdje se korisnik autentificira, izdaju se kvote i djelomično provjerava konfiguracija našeg CRD-a.
  4. Nakon provjere CRD-a na JSS strani, informacije se šalju API-ju k8s platforme.
  5. Naš CRD kontroler prati događaje na svim korisničkim resursima. Pretvara CR-ove u izvorne k8s resurse, dodaje potrebne module, postavlja odgovarajuće varijable okruženja i obavlja druge poslove podrške kako bi se osiguralo da korisničke aplikacije u kontejnerima imaju dovoljnu infrastrukturnu podršku.
  6. CRD kontroler zatim prosljeđuje primljene podatke Kubernetes API-ju kako bi ih planer mogao obraditi i staviti u proizvodnju.

Primijetiti: Ovaj radni tijek implementacije prije izdanja stvoren je za prve korisnike nove k8s platforme. Trenutno smo u procesu usavršavanja ovog procesa kako bismo ga u potpunosti integrirali s našim novim CI/CD-om. To znači da vam ne možemo reći sve vezano uz Kubernetes. Veselimo se dijeljenju našeg iskustva i napretka tima u ovom smjeru u našem sljedećem postu na blogu, “Izgradnja CI/CD platforme za Pinterest.”

Vrste posebnih sredstava

Na temelju specifičnih potreba Pinteresta, razvili smo sljedeće CRD-ove koji odgovaraju različitim radnim procesima:

  • PinterestService su usluge bez stanja koje rade već duže vrijeme. Mnogi od naših osnovnih sustava temelje se na skupu takvih usluga.
  • PinterestJobSet modelira serijske poslove punog ciklusa. Uobičajen scenarij na Pinterestu jest da više poslova paralelno pokreće iste spremnike, bez obzira na druge slične procese.
  • PinterestCronJob naširoko se koristi u kombinaciji s malim periodičnim opterećenjima. Ovo je omotač za nativni cron rad s Pinterest mehanizmima podrške koji su odgovorni za sigurnost, promet, zapisnike i metriku.
  • PinterestDaemon uključuje infrastrukturne demone. Ova obitelj nastavlja rasti kako dodajemo više podrške našim klasterima.
  • PinterestTrainingJob proširuje se na Tensorflow i Pytorch procese, pružajući istu razinu podrške za vrijeme izvođenja kao i svi ostali CRD-ovi. Budući da Pinterest aktivno koristi Tensorflow i druge sustave strojnog učenja, imali smo razloga izgraditi zaseban CRD oko njih.

Također radimo na PinterestStatefulSet-u, koji će uskoro biti prilagođen za skladišta podataka i druge sustave sa statusom.

Podrška za vrijeme izvođenja

Kada se pod aplikacija pokrene na Kubernetesu, ona automatski prima certifikat da se identificira. Ovaj se certifikat koristi za pristup tajnoj pohrani ili za komunikaciju s drugim uslugama putem mTLS-a. U međuvremenu, Container Init Configurator i Daemon će preuzeti sve potrebne ovisnosti prije pokretanja kontejnerske aplikacije. Kada je sve spremno, prometna pomoćna prikolica i Daemon će registrirati IP adresu modula kod našeg Zookeepera kako bi ga klijenti mogli otkriti. Sve će to raditi jer je mrežni modul konfiguriran prije pokretanja aplikacije.

Gore navedeni su tipični primjeri podrške za vrijeme izvođenja za radna opterećenja. Druge vrste radnih opterećenja mogu zahtijevati malo drugačiju podršku, ali sve dolaze u obliku pomoćnih prikolica na razini pod-razine, demona na razini čvora ili virtualnog stroja. Osiguravamo da je sve to raspoređeno unutar infrastrukture upravljanja i da je dosljedno u svim aplikacijama, što u konačnici značajno smanjuje opterećenje u smislu tehničkog rada i korisničke podrške.

Testiranje i osiguranje kvalitete

Izgradili smo end-to-end test cjevovod povrh postojeće Kubernetes test infrastrukture. Ovi testovi se odnose na sve naše klastere. Naš je proizvodni program prošao kroz mnoge revizije prije nego što je postao dio proizvodnog klastera.

Osim sustava za testiranje, imamo sustave za nadzor i uzbunjivanje koji konstantno prate stanje komponenti sustava, potrošnju resursa i druge važne pokazatelje, obavještavajući nas samo kada je potrebna ljudska intervencija.

Alternative

Proučili smo neke alternative prilagođenim resursima, kao što su kontroleri pristupa mutaciji i sustavi predložaka. Međutim, svi oni dolaze sa značajnim operativnim izazovima, pa smo odabrali CRD rutu.

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

Napomena: Sustavi predložaka kao što su Helm grafikoni također se često koriste za pokretanje aplikacija sa sličnim konfiguracijama. Međutim, naše su radne aplikacije previše raznolike da bi se njima upravljalo pomoću predložaka. Također će tijekom kontinuirane implementacije biti previše pogrešaka pri korištenju predložaka.

Predstojeći posao

Trenutno imamo posla s 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:

  • Zbirka klastera distribuira velike aplikacije po različitim klasterima radi skalabilnosti i stabilnosti.
  • Osiguravanje stabilnosti klastera, skalabilnosti i vidljivosti za stvaranje povezivosti aplikacija i SLA-ova.
  • Upravljanje resursima i kvotama kako aplikacije ne bi bile u sukobu jedna s drugom, a skala klastera je kontrolirana s naše strane.
  • Nova CI/CD platforma za podršku i implementaciju aplikacija na Kubernetesu.

Izvor: www.habr.com

Dodajte komentar