Production-ready bilder för k8s

Den hÀr historien handlar om hur vi anvÀnder containrar i produktionsmiljö, sÀrskilt under Kubernetes. Artikeln handlar om insamling av metrik och loggar frÄn containrar, samt byggande av bilder.

Production-ready bilder för k8s

Vi kommer frÄn fintech-företaget Exness, som utvecklar tjÀnster för onlinehandel och fintech-produkter för B2B och B2C. I vÄr R&D finns det mÄnga olika team, och avdelningen för utveckling har över 100 anstÀllda.

Vi representerar teamet som ansvarar för plattformen för insamling och körning av kod av vÄra utvecklare. Specifikt ansvarar vi för insamling, lagring och tillhandahÄllande av metrik, loggar och hÀndelser frÄn applikationer. För nÀrvarande hanterar vi cirka tre tusen Docker-containrar i produktionsmiljö, upprÀtthÄller vÄrt big data-lager pÄ 50 TB och tillhandahÄller arkitekturlösningar som byggs runt vÄr infrastruktur: Kubernetes, Rancher och olika offentliga molnleverantörer. 

VÄr motivation

Vad brinner? Ingen kan svara. Var Àr fokus? SvÄrt att förstÄ. NÀr började det brinna? Det gÄr att ta reda pÄ, men inte omedelbart. 

Production-ready bilder för k8s

Varför stÄr vissa containrar stilla medan andra har fallit? Vilken container orsakade det? UtifrÄn verkar containrarna likadana, men inuti har varje sin egen Neo.

Production-ready bilder för k8s

VÄra utvecklare Àr kompetenta personer. De skapar bra tjÀnster som ger företaget vinst. Men det uppstÄr ocksÄ problem nÀr containrarna med applikationerna sprider sig. En container förbrukar för mycket CPU, en annan nÀtverk, en tredje I/O-operationer, och en fjÀrde gör överhuvudtaget oklara saker med sockets. Allt detta faller och skeppet sjunker. 

Agenter

För att förstÄ vad som hÀnder inuti beslutade vi att installera agenter direkt i containrarna.

Production-ready bilder för k8s

Dessa agenter Àr kontrollprogram som hÄller containrarna i ett sÄdant tillstÄnd sÄ att de inte förstör varandra. Agenterna Àr standardiserade, vilket gör att vi kan standardisera tillvÀgagÄngssÀttet för underhÄll av containrar. 

I vÄrt fall mÄste agenterna tillhandahÄlla loggar i ett standardformat, taggade och med throttling. Dessutom mÄste de ge oss standardiserade metrik som Àr utbyggbara ur affÀrsapplikationernas perspektiv.

Under agenter avser vi ocksÄ verktyg för drift och underhÄll som kan fungera i olika orkestreringssystem, och stöder olika images (Debian, Alpine, Centos osv.).

Äntligen mĂ„ste agenter stödja en enkel CI/CD som inkluderar Docker-filer. Annars kommer skeppet att gĂ„ sönder eftersom containrarna börjar levereras pĂ„ "sneda" spĂ„r.

Byggprocess och uppbyggnad av mÄlimagen

För att allt ska vara standardiserat och hanterbart mÄste vi följa en standardiserad byggprocess. DÀrför har vi beslutat att bygga containrar med hjÀlp av containrar - sÄdan Àr vÄr rekursion.

Production-ready bilder för k8s

HÀr representeras containrarna med solida konturer. Vi bestÀmde oss för att lÀgga in distributionerna i dem, sÄ att "livet inte kÀndes som en dans pÄ rosor". Varför detta gjordes, kommer vi att berÀtta nedan.
 
Resultatet blev ett verktyg för byggande - en container av viss version som refererar till specifika versioner av distributionerna och specifika versioner av skripten.

Hur anvÀnder vi det? Vi har en Docker Hub dÀr containern finns. Vi speglar den in i vÄrt eget system för att bli av med externa beroenden. Vi fick en container som markerats med gult. Vi skapar en mall för att installera alla nödvÀndiga distributioner och skript i containern. DÀrefter bygger vi en fullstÀndig bild som Àr redo för drift: utvecklarna lÀgger in sin kod och vissa egna specifika beroenden. 

Vad Àr fördelarna med ett sÄdant tillvÀgagÄngssÀtt? 

  • För det första, komplett versionskontroll av byggverktyg - byggcontainer, versioner av skript och distributioner. 
  • För det andra, har vi uppnĂ„tt standardisering: vi skapar mallar, mellanliggande och driftsklara bilder pĂ„ samma sĂ€tt. 
  • För det tredje ger containrarna oss portabilitet. Idag anvĂ€nder vi Gitlab, och imorgon byter vi till TeamCity eller Jenkins och kan pĂ„ samma sĂ€tt köra vĂ„ra containrar. 
  • För det fjĂ€rde, minimering av beroenden. Vi har inte av en slump lagt distributioner i containern, eftersom detta gör att vi inte behöver ladda ner dem varje gĂ„ng frĂ„n Internet. 
  • För det femte, har hastigheten pĂ„ byggprocessen ökat - tillgĂ„ngen pĂ„ lokala kopior av bilder gör att vi inte behöver lĂ€gga tid pĂ„ nedladdningar, eftersom det finns en lokal bild. 

Med andra ord har vi uppnÄtt en kontrollerad och flexibel byggprocess. Vi anvÀnder samma verktyg för att bygga alla containrar med fullstÀndig versionering. 

Hur fungerar vÄr byggprocess?

Production-ready bilder för k8s

Byggandet startar med ett kommando och processen körs i en bild (markerad med röd). Utvecklaren har en Docker-fil (markerad med gul), som vi renderar genom att byta ut variabler mot vÀrden. Samtidigt lÀgger vi till header och footer - detta Àr vÄra agenter. 

Headern lÀgger till distributioner frÄn motsvarande bilder. Och footern installerar vÄra tjÀnster, konfigurerar belastningsstart, loggning och andra agenter, byter ut entrypoint osv. 

Production-ready bilder för k8s

Vi övervÀgde lÀnge om vi skulle anvÀnda en supervisor. Till slut bestÀmde vi att vi behövde en. Vi valde S6. Supervisorn möjliggör hantering av containern: den gör det möjligt att ansluta till den om huvudprocessen kraschar och ger manuell kontroll över containern utan att behöva Äterskapa den. Loggar och mÀtvÀrden Àr processer som körs inuti containern. Vi mÄste ocksÄ kontrollera dem, och det gör vi med hjÀlp av supervisorn. Slutligen tar S6 hand om housekeeping, signalbearbetning och andra uppgifter.

Eftersom vi anvÀnder olika orkestreringssystem, efter byggandet och startandet av containern, mÄste den förstÄ i vilken miljö den befinner sig och agera utifrÄn situationen. Till exempel:
Detta gör att vi kan bygga en bild och köra den i olika orkestreringssystem, dÀr den kommer att startas med hÀnsyn till specifika krav frÄn detta orkestreringssystem.

 Production-ready bilder för k8s

För samma container fÄr vi olika processtrÀd i Docker och Kubernetes:

Production-ready bilder för k8s

Nyttolasten körs under supervisorn S6. Observera collector och events - detta Àr vÄra agenter som ansvarar för loggar och mÀtvÀrden. I Kubernetes finns de inte, men i Docker finns de. Varför? 

Om vi ser pĂ„ specifikationen för ‘pod’ (hĂ€refter Kubernetes pod) kommer vi att se att containern events körs i en pod dĂ€r det finns en separat container collector som utför funktionen av att samla mĂ€tvĂ€rden och loggar. Vi kan anvĂ€nda Kubernetes-funktioner: köra containrar i samma pod, i samma process- och/eller nĂ€tverksutrymmen. Faktiskt införa vĂ„ra agenter och utföra vissa funktioner. Och om samma container startas i Docker fĂ„r den alla samma möjligheter, det vill sĂ€ga kan leverera loggar och mĂ€tvĂ€rden, eftersom agenterna kommer att köras inuti. 

MÀtvÀrden och loggar

Leverans av mÀtvÀrden och loggar Àr en komplex uppgift. Det finns flera aspekter kopplade till dess lösning.
Infrastrukturen skapas för att hantera nyttolast, inte för massdistribution av loggar. Det vill sÀga att denna process bör utföras med minimala resurskrav för containrarna. Vi strÀvar efter att hjÀlpa vÄra utvecklare: "Ta en Docker Hub-container, starta den, sÄ kan vi leverera loggar." 

Den andra aspekten Àr begrÀnsningen av loggvolymen. Om flera containrar genererar en ökning av loggvolymen (t.ex. en applikation som i en loop skriver stacktrace), ökar belastningen pÄ CPU, kommunikationskanaler och logghanteringssystemet, vilket pÄverkar vÀrdenheten och andra containrar pÄ vÀrdenheten, och ibland leder detta till att vÀrdenheten "fallerar". 

Den tredje aspekten Àr att stödja sÄ mÄnga metoder för insamling av mÀtvÀrden som möjligt direkt frÄn starten. FrÄn att lÀsa filer och frÄga Prometheus-endpoint till att anvÀnda specifika applikationsprotokoll.

Och den sista aspekten Àr att minimera resursförbrukningen.

Vi har valt en open-source-lösning i Go kallad Telegraf. Det Àr en universell koppling som stödjer över 140 typer av ingÄngskanaler (input plugins) och 30 typer av utgÄngskanaler (output plugins). Vi har vidareutvecklat den och nu ska vi berÀtta hur den anvÀnds i vÄrt fall med Kubernetes. 

Production-ready bilder för k8s

Anta att en utvecklare deployar en belastning, och Kubernetes fÄr en begÀran om att skapa en pod. Vid detta ögonblick skapas automatiskt en container med namnet Collector för varje pod (vi anvÀnder mutation webhook). Collector Àr vÄr agent. Vid start konfigurerar denna container sig sjÀlv för att arbeta med Prometheus och logginsamlingssystemet.

  • För detta anvĂ€nder den pod-annoteringar, och beroende pĂ„ innehĂ„llet skapar den till exempel en slutpunkt för Prometheus. 
  • Baserat pĂ„ pod-specifikationen och specifika konfigurationer för containrar beslutar den hur loggar ska levereras.

Loggar samlas in via Docker API: utvecklarna behöver bara skriva dem till stdout eller stderr, och sedan tar Collector hand om resten. Loggarna samlas in i chunkar med viss fördröjning för att förhindra eventuell överbelastning av vÀrdenheten. 

MÀtvÀrden samlas in per instans av arbetsbelastningar (rocesser) i containrar. Allt mÀrks med taggar: namespace, pod och sÄ vidare, och konverteras sedan till Prometheus-format - och blir tillgÀngligt för insamling (förutom loggar). Dessutom skickar vi loggar, mÀtvÀrden och hÀndelser till Kafka och vidare:

  • Loggar Ă€r tillgĂ€ngliga i Graylog (för visuell analys);
  • Loggar, mĂ€tningar och hĂ€ndelser skickas till Clickhouse för lĂ„ngsiktig lagring.

PÄ samma sÀtt fungerar allt i AWS, endast att vi byter ut Graylog med Kafka mot Cloudwatch. Vi skickar loggar dit, och allt blir mycket bekvÀmt: det Àr direkt klart vilket kluster och vilken container de hör till. Detsamma gÀller för Google Stackdriver. SÄ vÄr lösning fungerar bÄde on-premise med Kafka och i molnet. 

Om vi inte har Kubernetes med pods, blir systemet nÄgot mer komplicerat, men det fungerar enligt samma principer.

Production-ready bilder för k8s

Inuti containern körs samma processer, de orkestreras med hjÀlp av S6. Samma processer har startats inuti en och samma container.

I slutÀndan

Vi har skapat en helhetslösning för att bygga och köra bilder i produktion, med alternativ för insamling och leverans av loggar och mÀtningar:

  • Vi har utvecklat en standardiserad metod för att bygga bilder och utifrĂ„n den har vi utvecklat CI-mallar;
  • Agenter för datainsamling Ă€r vĂ„ra Telegraf-tillĂ€gg. Vi har testat dem ordentligt i produktion;
  • Vi anvĂ€nder mutation webhook för att integrera containrar med agenter i pods; 
  • Vi har integrerat oss i Kubernetes/Rancher-ekosystemet;
  • Vi kan köra identiska containrar i olika orkestreringssystem och fĂ„ det resultat vi förvĂ€ntar oss;
  • Vi har skapat en helt dynamisk konfiguration för hantering av containrar. 

Medförfattare: Ilja Prudnikov

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