Skapar en kubernetesplattform pÄ Pinterest

Under Ären har Pinterest 300 miljoner anvÀndare skapat över 200 miljarder pins pÄ mer Àn 4 miljarder tavlor. För att betjÀna denna armé av anvÀndare och den omfattande innehÄllsbasen har portalen utvecklat tusentals tjÀnster, frÄn mikrotjÀnster som hanteras av nÄgra CPU:er till enorma monoliter som körs pÄ en hel park av virtuella maskiner. Och nu har företaget riktat sin blick mot k8s. Vad Àr det som gör att "kubben" tilltalar "Pinterest"? Det fÄr du veta i vÄr översÀttning av den senaste artikeln frÄn Pinterest Engineering-bloggen.

Skapar en kubernetesplattform pÄ Pinterest

SÄ, hundratals miljoner anvÀndare och hundratals miljarder pins. För att betjÀna denna armé av anvÀndare och den omfattande innehÄllsbasen har vi utvecklat tusentals tjÀnster, frÄn mikrotjÀnster som hanteras av nÄgra CPU:er till enorma monoliter som körs pÄ en hel park av virtuella maskiner. Dessutom har vi olika ramverk som ocksÄ kan krÀva resurser frÄn CPU, minne eller tillgÄng till I/O-operationer.

Vid stödet av denna djungel av verktyg stÄr utvecklingsteamet inför flera problem:

  • Ingen enhetlig metod för att starta arbetsmiljön. Stateless-tjĂ€nster, Stateful-tjĂ€nster och projekt under aktiv utveckling baseras pĂ„ helt olika tekniska stackar. Detta har lett till skapandet av en hel utbildningskurs för ingenjörer, och det komplicerar ocksĂ„ arbetet för vĂ„rt infrastrukturteam avsevĂ€rt.
  • Utvecklare som har tillgĂ„ng till sin egen park av virtuella maskiner lĂ€gger en enorm börda pĂ„ interna administratörer. Som resultat drar sĂ„dana enkla uppgifter som att uppdatera OS eller AMI ut pĂ„ veckor och mĂ„nader. Detta leder till ökad belastning i vad som verkar vara helt vardagliga situationer.
  • SvĂ„righeter med att skapa globala infrastrukturoperationsverktyg ovanpĂ„ redan existerande lösningar. Situationen kompliceras ytterligare av att det inte Ă€r lĂ€tt att hitta Ă€gare av virtuella maskiner. Det vill sĂ€ga att vi vet inte om vi sĂ€kert kan frigöra dessa resurser för anvĂ€ndning pĂ„ andra delar av vĂ„r infrastruktur.

Containerorkestreringssystem Àr ett sÀtt att enhetliggöra hanteringen av arbetsbelastningar. De ger dig möjlighet att öka utvecklingshastigheten och förenklar infrastrukturen, eftersom alla resurser som ingÄr i projektet hanteras av ett centralt system.

Skapar en kubernetesplattform pÄ Pinterest

Bild 1: Infrastrukturprioriteringar (pÄlitlighet, utvecklarprestanda och effektivitet).

Cloud Management Platform-teamet pÄ Pinterest bekantade sig med K8s 2017. Under första halvan av 2017 dokumenterade vi större delen av vÄra produktionsresurser, inklusive API:er och alla vÄra webbservrar. DÀrefter genomförde vi en noggrann utvÀrdering av olika system för containerorkestrering, klusteruppbyggnad och drift. I slutet av 2017 beslutade vi oss för att anvÀnda Kubernetes. Det var tillrÀckligt flexibelt och hade stort stöd i utvecklarcommunityt.

Vid detta tillfĂ€lle har vi skapat egna verktyg för klusterbootstrapping baserade pĂ„ Kops och migrerat befintliga infrastrukturella komponenter till Kubernetes — sĂ„som nĂ€tverk, sĂ€kerhet, övervakning, loggning, identitetshantering och trafik. Vi har ocksĂ„ implementerat ett arbetsbelastningssimuleringssystem för vĂ„r resurs, vars komplexitet döljs för utvecklarna. Nu fokuserar vi pĂ„ att sĂ€kerstĂ€lla stabilitet i klustret, dess skalning och att ansluta nya kunder.

Kubernetes: VÀgen för Pinterest

Att börja arbeta med Kubernetes i stor skala pÄ Pinterest, som en plattform som vÄra ingenjörer skulle Àlska, ledde till mÄnga svÄrigheter.

Som ett stort företag har vi investerat betydande resurser i infrastrukturella verktyg. Exempelvis verktyg för sÀkerhet som hanterar certifikat och distribuerar nycklar, trafikövervakningskomponenter, tjÀnstupptÀcktsystem, synlighets- och loggkomponenter samt metrik. Allt detta har byggts upp för en anledning: vi har genomgÄtt en normal vÀg av försök och misstag, och dÀrför ville vi integrera allt detta i den nya infrastrukturen pÄ Kubernetes istÀllet för att uppfinna hjulet pÄ nytt pÄ en ny plattform. Denna strategi förenklade i allmÀnhet migreringen, eftersom all applikationsstöd redan finns, det behöver inte skapas frÄn grunden.

Å andra sidan Ă€r modeller för belastningsprognoser inom Kubernetes (till exempel distributioner, uppgifter och daemon-set) otillrĂ€ckliga för vĂ„rt projekt. Dessa anvĂ€ndbarhetsproblem utgör enorma hinder för övergĂ„ngen till Kubernetes. Till exempel har vi hört hur tjĂ€nsteutvecklare klagar över bristande eller felaktig inloggningskonfiguration. Vi har ocksĂ„ stött pĂ„ felaktig anvĂ€ndning av mallmotorer nĂ€r hundratals kopior med samma specifikation och uppdrag skapats, vilket resulterat i hemska debuggingsproblem.

Det var ocksÄ mycket svÄrt att stödja olika versioner i samma kluster. TÀnk pÄ hur komplicerat kundsupporten blir nÀr du behöver jobba med flera versioner av samma körmiljö, med alla deras problem, buggar och uppdateringar.

Anpassade resurser och kontrollerare för Pinterest

För att underlÀtta implementeringen av Kubernetes för vÄra ingenjörer och förenkla infrastrukturen samt pÄskynda dess prestanda har vi utvecklat vÄra egna definitioner av anpassade resurser (CRD).

CRD erbjuder följande funktionaliteter:

  1. Sammanföra olika inbyggda resurser i Kubernetes sÄ att de fungerar som en enhetlig belastning. Till exempel innefattar resursen PinterestService distribution, inloggningsservice och konfigurationskarta. Detta gör att utvecklare inte behöver bekymra sig om DNS-konfiguration.
  2. Implementera nödvÀndigt stöd för applikationer. AnvÀndaren behöver bara fokusera pÄ specifikationen av containern enligt sin affÀrslogik medan CRD-kontrollern implementerar alla nödvÀndiga init-containrar, miljövariabler och pod-specifikationer. Detta ger en helt annan nivÄ av komfort för utvecklare.
  3. CRD-kontrollrar hanterar ocksÄ livscykeln för egna resurser och ökar tillgÀngligheten för debugging. Detta inkluderar att synkronisera önskade och faktiska specifikationer, uppdatera statusen för CRD och logga hÀndelser och mer. Utan CRD skulle utvecklare vara tvungna att hantera en mÀngd resurser, vilket skulle öka risken för fel.

HÀr Àr ett exempel pÄ PinterestService och en intern resurs som styrs av vÄr kontrollerare:

Skapar en kubernetesplattform pÄ Pinterest

Som nÀmnt ovan, för att stödja en anvÀndarcontainer behöver vi integrera en initialiseringscontainer och flera tillÀgg för att sÀkerstÀlla sÀkerhet, synlighet och hantering av nÀtverkstrafik. Dessutom har vi skapat konfigurationskarta-mallar och implementerat stöd för PVC-mallar för batchjobb, samt spÄring av flera miljövariabler för att följa identifiering, resursanvÀndning och insamling av "skrÀp".

Det Àr svÄrt att förestÀlla sig att utvecklare skulle vilja skriva dessa konfigurationsfiler för hand utan stöd för CRD, för att inte tala om vidare stöd och felsökning av konfigurationerna.

Workflow för applikationsdeployment

Skapar en kubernetesplattform pÄ Pinterest

OvanstÄende illustration visar hur man distribuerar en anvÀndarresurs för Pinterest i en Kubernetes-kluster:

  1. Utvecklare interagerar med vÄr Kubernetes-kluster via CLI och anvÀndargrÀnssnitt.
  2. CLI / UI-verktygen hÀmtar YAML-konfigurationsfiler för arbetsflödet och andra byggegenskaper (samma versions-ID) frÄn Artifactory, som sedan skickas till Job Submission Service. Detta steg sÀkerstÀller att endast fungerande versioner levereras till klustret.
  3. JSS fungerar som en gateway för olika plattformar, inklusive Kubernetes. HÀr sker anvÀndarautentisering, kvotering och delvis konfigurationsverifiering av vÄr CRD.
  4. Efter verifiering av CRD pÄ JSS-sidan skickas informationen till k8s plattformens API.
  5. VÄr CRD-kontrollant övervakar hÀndelser för alla anvÀndarresurser. Den omvandlar CR till nativa k8s-resurser, lÀgger till nödvÀndiga moduler, stÀller in lÀmpliga miljövariabler och utför andra hjÀlparbeten, vilket garanterar att containeranvÀndarapplikationer fÄr tillrÀckligt med infrastrukturellt stöd.
  6. Sedan vidarebefordrar CRD-kontrollanten de mottagna uppgifterna till Kubernetes API för bearbetning av schemalÀggaren och för att sÀttas i drift.

AnmÀrkning: detta förhandsversionsarbetsflöde skapades för de första anvÀndarna av den nya k8s-plattformen. Nu Àr vi i fÀrd med att utveckla denna process för att fullt ut integrera med vÄr nya CI/CD. Det betyder att vi inte kan dela allt som rör Kubernetes. Vi ser fram emot att dela vÄr erfarenhet och berÀtta om teamets framsteg i detta avseende i vÄrt nÀsta blogginlÀgg "Bygga en CI/CD-plattform för Pinterest".

Typer av specialresurser

Baserat pÄ Pinterests specifika behov har vi utvecklat följande CRD:er som passar olika arbetsflöden:

  • PinterestService Ă€r stateless-tjĂ€nster som har varit i drift lĂ€nge. MĂ„nga av vĂ„ra kĂ€rnsystem bygger pĂ„ en uppsĂ€ttning sĂ„dana tjĂ€nster.
  • PinterestJobSet modellerar batchuppgifter med full cykel. Det finns ett vanligt scenarie inom Pinterest dĂ€r flera uppgifter kör samma containrar parallellt, oavsett andra liknande processer.
  • PinterestCronJob anvĂ€nds ofta för smĂ„, periodiska belastningar. Detta Ă€r en wrapper för nativ cron-funktionalitet med stödsystem för Pinterest som ansvarar för sĂ€kerhet, trafik, loggar och metrik.
  • PinterestDaemon inkluderar daemoner för infrastrukturen. Denna familj vĂ€xer kontinuerligt eftersom vi lĂ€gger till mer stöd för vĂ„ra kluster.
  • PinterestTrainingJob omfattar processer för Tensorflow och Pytorch och ger samma nivĂ„ av support under körning som alla andra CRD:er. Eftersom Tensorflow och andra maskininlĂ€rningssystem anvĂ€nds aktivt pĂ„ Pinterest fanns det skĂ€l att bygga en separat CRD kring dem.

Vi arbetar ocksÄ med PinterestStatefulSet, som snart kommer att anpassas för datalager och andra stateful-system.

Stöd för körmiljö

NÀr applikationsmodulen startas i Kubernetes, fÄr den automatiskt ett certifikat för att identifiera sig sjÀlv. Detta certifikat anvÀnds för att fÄ tillgÄng till hemlagret eller för att kommunicera med andra tjÀnster via mTLS. Under tiden kommer containernas initialiseringskonfigurator och Daemon att ladda alla nödvÀndiga beroenden innan containerapplikationen startas. NÀr allt Àr klart registrerar sidokontaktens trafik och Daemon modulens IP-adress i vÄr Zookeeper, sÄ att kunderna kan upptÀcka den. Allt detta kommer att fungera, eftersom nÀtverksmodulen konfigurerades innan applikationen startades.

OvanstÄende Àr typiska exempel pÄ stöd för arbetsbelastningar under körning. För andra typer av arbetsbelastningar kan nÄgot annat stöd krÀvas, men allt presenteras i form av pod-nivÄ sidecar, nod- eller Daemon-nivÄ virtuella maskiner. Vi ser till att allt detta rullas ut inom den hanterande infrastrukturen och koordineras mellan applikationerna, vilket i slutÀnden avsevÀrt minskar belastningen i frÄga om tekniskt arbete och kundsupport.

Testning och QA

Vi har byggt en end-to-end testpipeline ovanpÄ den befintliga testinfrastrukturen i Kubernetes. Dessa tester strÀcker sig över alla vÄra kluster. VÄr pipeline har genomgÄtt mÄnga omarbetningar innan den blev en del av produktklustret.

Förutom testningssystem har vi övervaknings- och varningssystem som stÀndigt bevakar statusen för systemkomponenterna, resursförbrukningen och andra viktiga indikatorer, och meddelar oss endast vid behov av mÀnsklig inblandning.

Alternativ

Vi övervÀgde vissa alternativ till anpassade resurser, sÄsom mutationskontrollanter och mallsystem. Men alla dessa Àr förenade med allvarliga svÄrigheter, sÄ vi valde vÀgen CRD.

Mutationskontrollanten anvÀndes för att införa sidokontakter, miljövariabler och annat stöd under körning. Men den stötte pÄ olika problem, sÄsom resursbindning och hantering av livet, vilket inte förekommer i CRD.

AnmÀrkning: Mall för system, sÄsom Helm-diagram, anvÀnds ocksÄ i stor utstrÀckning för att köra applikationer med liknande konfigurationer. VÄra arbetsapplikationer Àr dock för varierande för att hanteras med hjÀlp av mallar. Dessutom kommer det att uppstÄ för mÄnga fel vid kontinuerlig driftsÀttning med anvÀndning av mallar.

Kommande arbete

Just nu hanterar vi en blandad belastning pÄ alla vÄra kluster. För att stödja sÄdana processer av olika typer och storlekar arbetar vi inom följande omrÄden:

  • En uppsĂ€ttning kluster distribuerar stora applikationer över olika kluster för att sĂ€kerstĂ€lla skalbarhet och stabilitet.
  • Att sĂ€kerstĂ€lla stabilitet, skalbarhet och synlighet för klustret för att skapa en koppling mellan applikationen och dess SLA.
  • Resurshantering och kvoter sĂ„ att applikationer inte stör varandra, och klustrets skala kontrolleras frĂ„n vĂ„r sida.
  • En ny CI/CD-plattform för att stödja och distribuera applikationer i Kubernetes.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster