ProduktionsfÀrdiga bilder för k8s

Det hÀr Àr en berÀttelse om hur vi anvÀnder containrar i produktion, sÀrskilt under Kubernetes. Artikeln handlar om att samla in mÀtvÀrden och loggar frÄn containrar, samt att bygga avbildningar.

ProduktionsfÀrdiga 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. VÄr FoU har mÄnga olika team, och utvecklingsavdelningen har över 100 anstÀllda.

Vi Ă€r teamet som ansvarar för plattformen dĂ€r vĂ„ra utvecklare kan samla in och köra kod. Mer specifikt ansvarar vi för att samla in, lagra och leverera mĂ€tvĂ€rden, loggar och hĂ€ndelser frĂ„n applikationer. Vi driver för nĂ€rvarande cirka 50 XNUMX Docker-containrar i produktion, underhĂ„ller vĂ„r XNUMX TB stora datalagring och tillhandahĂ„ller arkitekturlösningar som Ă€r byggda kring vĂ„r infrastruktur: Kubernetes, Rancher och olika publika molnleverantörer. 

VÄr motivation

Vad brinner? Ingen kan svara. Var Ă€r kĂ€llan? Det Ă€r svĂ„rt att förstĂ„. NĂ€r fattade det eld? Det gĂ„r att ta reda pĂ„ det, men inte direkt. 

ProduktionsfÀrdiga bilder för k8s

Varför stÄr vissa containrar, medan andra har fallit? Vilken container var skyldig? Containrarna Àr trots allt identiska pÄ utsidan, men var och en har sin egen Neo pÄ insidan.

ProduktionsfÀrdiga bilder för k8s

VĂ„ra utvecklare Ă€r smarta killar. De skapar bra tjĂ€nster som ger företaget vinst. Men det blir problem nĂ€r containrar med applikationer gĂ„r i kras. En container förbrukar för mycket CPU, en annan - nĂ€tverket, den tredje - I/O-operationer, den fjĂ€rde Ă€r helt oklar vad den gör med sockets. Allt detta kraschar, och skeppet sjunker. 

Agenter

För att förstÄ vad som försiggick inuti bestÀmde vi oss för att placera agenter direkt i containrarna.

ProduktionsfÀrdiga bilder för k8s

Dessa agenter Ă€r de inneslutningsprogram som hĂ„ller containrar i ett tillstĂ„nd som förhindrar att de bryter sönder varandra. Agenterna Ă€r standardiserade, vilket möjliggör en standardiserad metod för containrarunderhĂ„ll. 

I vÄrt fall bör agenter tillhandahÄlla loggar i ett standardformat, taggade och begrÀnsade. De bör ocksÄ förse oss med standardiserade mÀtvÀrden som Àr utökningsbara ur ett affÀrsapplikationsperspektiv.

ĐŸĐŸĐŽ Đ°ĐłĐ”ĐœŃ‚Đ°ĐŒĐž таĐșжД ĐżĐŸĐŽŃ€Đ°Đ·ŃƒĐŒĐ”ĐČаются ŃƒŃ‚ĐžĐ»ĐžŃ‚Ń‹ ĐŽĐ»Ń эĐșŃĐżĐ»ŃƒĐ°Ń‚Đ°Ń†ĐžĐž Đž ĐŸĐ±ŃĐ»ŃƒĐ¶ĐžĐČĐ°ĐœĐžŃ, ŃƒĐŒĐ”ŃŽŃ‰ĐžĐ” Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ŃŒ  ĐČ Ń€Đ°Đ·ĐœŃ‹Ń… ŃĐžŃŃ‚Đ”ĐŒĐ°Ń… ĐŸŃ€ĐșĐ”ŃŃ‚Ń€ĐžŃ€ĐŸĐČĐ°ĐœĐžŃ, ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČающОД Ń€Đ°Đ·ĐœŃ‹Đ” images (Debian, alpina, Centos och sĂ„ vidare).

Slutligen mÄste agenter stödja enkla CI/CD-filer som inkluderar Dockerfiles. Annars kommer fartyget att falla isÀr eftersom containrar börjar levereras pÄ "snedvÀndiga" rÀls.

Monteringsprocessen och mÄlbildens enhet

För att hĂ„lla allt standardiserat och hanterbart behöver man följa nĂ„gon standardiserad byggprocess. SĂ„ vi bestĂ€mde oss för att bygga container för container – det Ă€r rekursion.

ProduktionsfÀrdiga bilder för k8s

HÀr representeras behÄllarna av heldragna konturer. Samtidigt bestÀmde vi oss för att placera fördelningar i dem, sÄ att "livet inte kÀnns som en dans pÄ rosor". Vi kommer att berÀtta nedan varför detta gjordes.
 
Resultatet Ă€r ett byggverktyg – en behĂ„llare för en specifik version som refererar till specifika versioner av distributioner och specifika versioner av skript.

Hur anvĂ€nder vi det? Vi har en Docker Hub, dĂ€r containern finns. Vi speglar den inuti vĂ„rt system för att bli av med externa beroenden. Resultatet Ă€r en container markerad med gult. Vi skapar en mall för att installera alla distributioner och skript vi behöver i containern. DĂ€refter bygger vi en fĂ€rdig avbildning: utvecklare lĂ€gger in kod och nĂ„gra av sina speciella beroenden i den. 

Vad Ă€r bra med den hĂ€r metoden? 

  • För det första, fullstĂ€ndig versionskontroll av byggverktyg – byggbehĂ„llare, versioner av skript och distributioner. 
  • För det andra har vi uppnĂ„tt standardisering: vi skapar mallar, mellanliggande och fĂ€rdiga bilder pĂ„ samma sĂ€tt. 
  • För det tredje ger containrar oss portabilitet. Idag anvĂ€nder vi Gitlab, och imorgon byter vi till TeamCity eller Jenkins och vi kan köra vĂ„ra containrar pĂ„ samma sĂ€tt. 
  • För det fjĂ€rde, minimering av beroenden. Det Ă€r inte av en slump att vi placerar distributioner i en container, eftersom det gör att vi inte behöver ladda ner dem frĂ„n internet varje gĂ„ng. 
  • För det femte har monteringshastigheten ökat - nĂ€rvaron av lokala kopior av bilder gör att du inte slösar tid pĂ„ nedladdning, 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 vilken container som helst med fullstĂ€ndig versionshantering. 

SÄ hÀr fungerar vÄr monteringsprocess

ProduktionsfÀrdiga bilder för k8s

Bygget startas med ett kommando, processen körs i bilden (markerad i rött). Utvecklaren har en Docker-fil (markerad i gult), vi renderar den och ersĂ€tter variabler med vĂ€rden. Och lĂ€ngs vĂ€gen lĂ€gger vi till sidhuvuden och sidfot – dessa Ă€r vĂ„ra agenter. 

Sidhuvudet lĂ€gger till distributioner frĂ„n motsvarande avbildningar. Och sidfoten installerar vĂ„ra tjĂ€nster inuti, konfigurerar starten av arbetsbelastningen, loggning och andra agenter, ersĂ€tter startpunkten etc. 

ProduktionsfÀrdiga bilder för k8s

Vi funderade lÀnge pÄ om vi skulle installera en supervisor. Till slut bestÀmde vi oss för att vi behövde en. Vi valde S6. Supervisorn tillhandahÄller containerhantering: den lÄter dig ansluta till den om huvudprocessen kraschar och ger manuell kontroll över containern utan att Äterskapa den. Loggar och mÀtvÀrden Àr processer som körs inuti containern. De mÄste ocksÄ kontrolleras pÄ nÄgot sÀtt, och vi gör detta med hjÀlp av supervisorn. Slutligen tar S6 hand om hushÄllning, signalbehandling och andra uppgifter.

Eftersom vi anvÀnder olika orkestreringssystem mÄste containern, efter att den byggt och körts, förstÄ vilken miljö den befinner sig i och agera dÀrefter. Till exempel:
Detta gör att vi kan bygga en avbildning och köra den i olika orkestreringssystem, och den kommer att lanseras med hÀnsyn till orkestreringssystemets specifika egenskaper.

 ProduktionsfĂ€rdiga bilder för k8s

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

ProduktionsfÀrdiga bilder för k8s

Nyttolasten exekveras under S6-supervisorn. Notera insamlaren och hĂ€ndelserna – dessa Ă€r vĂ„ra agenter som ansvarar för loggar och mĂ€tvĂ€rden. Kubernetes har dem inte, men Docker har dem. Varför? 

Om vi ​​tittar pĂ„ "pod"-specifikationen (nedan kallad Kubernetes pod) ser vi att hĂ€ndelsebehĂ„llaren exekveras i en pod, som har en separat insamlarbehĂ„llare som utför funktionen att samla in mĂ€tvĂ€rden och loggar. Vi kan anvĂ€nda Kubernetes funktioner: starta containrar i en pod, i en enda process och/eller nĂ€tverksutrymme. Faktum Ă€r att vi kan implementera vĂ„ra agenter och utföra vissa funktioner. Och om samma container startas i Docker kommer den att fĂ„ samma funktioner vid utgĂ„ngen, det vill sĂ€ga den kommer att kunna leverera loggar och mĂ€tvĂ€rden, eftersom agenterna kommer att startas inuti. 

MÀtvÀrden och loggar

Att leverera mÀtvÀrden och loggar Àr en komplex uppgift. Det finns flera aspekter involverade i att lösa den.
Infrastrukturen Ă€r byggd för att köra nyttolaster, inte för att leverera loggar i massor. Det betyder att det bör göras med minimala resurskrav för containrar. Vi vill hjĂ€lpa vĂ„ra utvecklare: "Ta en Docker Hub-container, kör den, sĂ„ kan vi leverera loggar." 

Den andra aspekten Ă€r att begrĂ€nsa loggvolymen. Om en loggvolymstopp intrĂ€ffar i flera containrar (applikationen matar ut ett stackspĂ„r i en loop) ökar belastningen pĂ„ processorn, kommunikationskanalerna och loggbehandlingssystemet, och detta pĂ„verkar driften av vĂ€rden som helhet och andra containrar pĂ„ vĂ€rden, vilket ibland leder till en "krasch" av vĂ€rden. 

Den tredje aspekten Àr att stödja sÄ mÄnga metoder för mÀtvÀrdensinsamling som möjligt direkt frÄn lÄdan. FrÄn att lÀsa filer och avfrÄga Prometheus-slutpunkten till att anvÀnda applikationsspecifika protokoll.

Och den sista aspekten Àr att det Àr nödvÀndigt att minimera resursförbrukningen.

Vi valde en öppen kĂ€llkodslösning pĂ„ Go som heter Telegraf. Det Ă€r en universell koppling som stöder mer Ă€n 140 typer av ingĂ„ngskanaler (ingĂ„ngsplugins) och 30 typer av utgĂ„ngsplugins. Vi har förbĂ€ttrat den och nu ska vi berĂ€tta hur vi anvĂ€nder den med Kubernetes som exempel. 

ProduktionsfÀrdiga bilder för k8s

LÄt oss sÀga att en utvecklare distribuerar en arbetsbelastning och Kubernetes fÄr en begÀran om att skapa en pod. Vid denna tidpunkt skapas en container som heter Collector automatiskt för varje pod (vi anvÀnder en mutationswebhook). Collector Àr vÄr agent. Vid start konfigurerar sig containern för att fungera med Prometheus och loggsamlingssystemet.

  • För att göra detta anvĂ€nder den pod-annoteringarna, och beroende pĂ„ deras innehĂ„ll skapar den, sĂ€g, en Prometheus-slutpunkt; 
  • Baserat pĂ„ Pod-specifikationen och behĂ„llarspecifika instĂ€llningar, bestĂ€mmer hur loggar ska levereras.

Vi samlar in loggar via Docker API: utvecklare behöver bara lĂ€gga dem i stdout eller stderr, sĂ„ sorterar Collector ut det. Loggar samlas in i bitar med viss fördröjning för att förhindra eventuell överbelastning av vĂ€rddatorn. 

MÀtvÀrden samlas in av arbetsbelastningsinstanser (processer) i containrar. Allt taggas: namnrymd, pod, etc., och konverteras sedan till Prometheus-format - och blir tillgÀngligt för insamling (förutom loggar). Vi skickar Àven loggar, mÀtvÀrden och hÀndelser till Kafka och vidare:

  • Loggar finns tillgĂ€ngliga i Graylog (för visuell analys);
  • Loggar, mĂ€tvĂ€rden och hĂ€ndelser skickas till Clickhouse för lĂ„ngtidslagring.

Allt fungerar exakt likadant i AWS, bara det att vi ersĂ€tter Graylog med Kafka och Cloudwatch. Vi skickar loggar dit, och allt blir vĂ€ldigt bekvĂ€mt: det Ă€r omedelbart tydligt vilket kluster och container de tillhör. Detsamma gĂ€ller för Google Stackdriver. Det vill sĂ€ga, vĂ„rt schema fungerar bĂ„de on-premise med Kafka och i molnet. 

Om vi ​​inte har Kubernetes med poddar Ă€r schemat lite mer komplicerat, men fungerar enligt samma principer.

ProduktionsfÀrdiga bilder för k8s

Samma processer exekveras inuti containern, de orkestreras med S6. Alla samma processer startas inuti samma container.

Som ett resultat,

Vi har skapat en komplett lösning för att bygga och lansera avbildningar i produktion, med alternativ för att samla in och leverera loggar och mÀtvÀrden:

  • Vi utvecklade en standardiserad metod för att bygga bilder, och baserat pĂ„ den utvecklade vi CI-mallar;
  • Datainsamlingsagenter Ă€r vĂ„ra Telegraf-tillĂ€gg. Vi har testat dem vĂ€l i produktion;
  • Vi anvĂ€nder mutationswebhook för att injicera behĂ„llare med agenter i poddar; 
  • Integrerad i Kubernetes/Rancher-ekosystemet;
  • Vi kan exekvera samma containrar i olika orkestreringssystem och fĂ„ det resultat vi förvĂ€ntar oss;
  • Skapade en helt dynamisk konfiguration för containerhantering. 

Medförfattare: Ilja Prudnikov

KĂ€lla: will.com

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