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 .

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.

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:
- 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.
- 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.
- 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:

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

OvanstÄende illustration visar hur man distribuerar en anvÀndarresurs för Pinterest i en Kubernetes-kluster:
- Utvecklare interagerar med vÄr Kubernetes-kluster via CLI och anvÀndargrÀnssnitt.
- 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.
- JSS fungerar som en gateway för olika plattformar, inklusive Kubernetes. HÀr sker anvÀndarautentisering, kvotering och delvis konfigurationsverifiering av vÄr CRD.
- Efter verifiering av CRD pÄ JSS-sidan skickas informationen till k8s plattformens API.
- 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.
- 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
