Mönster för datalagring i Kubernetes

Mönster för datalagring i Kubernetes
Hej, Habr!

Vi pÄminner om att vi har slÀppt en ny, extremt intressant och anvÀndbar en bok om mönster för Kubernetes. Allt började med "Mönster" av Brendan Burns, och för övrigt Àr vÄrt arbete inom detta omrÄde intensivt. Idag erbjuder vi dig att lÀsa ett inlÀgg frÄn MinIO:s blogg som kortfattat redogör för trenderna och specifikationen av datalagringsmönster i Kubernetes.

Kubernetes har fundamentalt förĂ€ndrat de traditionella mönstren för utveckling och distribution av applikationer. Teamet kan nu ta bara nĂ„gra dagar för att utveckla, testa och distribuera en applikation – i olika miljöer, allt inom Kubernetes-kluster. Ett sĂ„dant arbete med tidigare generationers teknik tog vanligtvis flera veckor, om inte mĂ„nader.

Denna acceleration blev möjlig tack vare den abstraktion som Kubernetes erbjuder — det vill sĂ€ga, tack vare att Kubernetes sjĂ€lv hanterar interaktionen med de lĂ„gnivĂ„detaljer av fysiska eller virtuella maskiner, vilket gör att anvĂ€ndarna kan specificera bland annat den önskade processorn, den önskade mĂ€ngden minne och antalet instanser av containrar. Eftersom en enorm gemenskap Ă€r engagerad i att stödja Kubernetes och anvĂ€ndningen av Kubernetes stĂ€ndigt vĂ€xer, leder den med stor marginal bland alla plattformar för orkestrering av containrar.

I takt med att anvÀndningen av Kubernetes ökar, vÀxer ocksÄ förvirringen kring de datalagringsmönster som anvÀnds i den..

Vid den allmÀnna konkurrensen om en bit av kakan (dvs. datalagring), nÀr det kommer till datalagring, drunknar signalen i ett starkt brus.
Kubernetes representerar den moderna modellen för utveckling och distribution av applikationer samt hanteringen av dem. Denna moderna modell frikopplar datalagring frÄn berÀkningar. För att helt förstÄ denna frikoppling i samband med Kubernetes Àr det ocksÄ nödvÀndigt att förstÄ vad som menas med applikationer som arbetar med och utan tillstÄnd, samt hur datalagring passar in i detta. HÀr har REST API-ansatsen, som anvÀnds av S3, tydliga fördelar jÀmfört med den POSIX/CSI-ansats som Àr typisk för andra lösningar.

I den hÀr artikeln kommer vi att prata om mönster för datalagring i Kubernetes och vi kommer sÀrskilt att beröra diskussionen om applikationer som arbetar med och utan bestÄende tillstÄnd, för att verkligen förstÄ vad som skiljer dem Ät och varför det Àr viktigt. HÀrefter kommer applikationer och de mönster för datalagring som anvÀnds i dem att diskuteras utifrÄn bÀsta praxis för arbete med containrar och Kubernetes.

Containrar utan bestÄende tillstÄnd

Containrar Ă€r per definition lĂ€tta och efemĂ€ra. De kan lĂ€tt stoppas, tas bort eller distribueras pĂ„ en annan nod – allt detta tar bara nĂ„gra sekunder. I stora system för orkestrering av containrar sker sĂ„dana operationer hela tiden, och anvĂ€ndarna lĂ€gger knappt mĂ€rke till dessa förĂ€ndringar. Emellertid Ă€r flyttningar möjliga endast om containern inte har nĂ„gra beroenden frĂ„n den nod dĂ€r den Ă€r placerad. SĂ„dana containrar sĂ€gs arbeta utan bestĂ„ende tillstĂ„nd.

Containrar med bestÄende tillstÄnd

Om en container lagrar data pĂ„ lokalt anslutna enheter (eller pĂ„ blockenheter), mĂ„ste datalagret som det ligger pĂ„ flyttas till en ny nod tillsammans med sjĂ€lva containern – vid ett fel. Detta Ă€r viktigt, eftersom annars kan inte applikationen som körs i containern fungera korrekt, eftersom den mĂ„ste komma Ă„t data som lagras pĂ„ lokala medium. SĂ„dana containrar sĂ€gs arbeta med bestĂ„ende tillstĂ„nd.

Ur en rent teknisk synvinkel kan containrar med bestÄende tillstÄnd ocksÄ flyttas till andra noder. Detta uppnÄs vanligtvis genom distribuerade filsystem eller blocklagringssystem knutna till alla noder dÀr containrarna körs. PÄ sÄ sÀtt fÄr containrarna Ätkomst till volymer för bestÄende datalagring, och informationen lagras pÄ diskar som finns spridda över hela nÀtverket. Denna metod kommer jag att kalla "containeranslaget med bestÄende tillstÄnd", och i resten av artikeln kommer jag att referera till det pÄ detta sÀtt för enhetlighet.

Mönster för datalagring i Kubernetes

Vid en typisk containeransats med behĂ„llning av tillstĂ„nd binds alla applikationens pods till ett distribuerat filsystem – det blir en slags delad lagring dĂ€r all applikationsdata finns. Även om det kan finnas vissa variationer, Ă€r detta en hög nivĂ„ av tillvĂ€gagĂ„ngssĂ€tt.

LÄt oss nu utforska varför behÄllande av tillstÄnd i en containeransats i en molncentrerad vÀrld Àr ett antipattern.

Molncentrerad applikationsdesign

Traditionellt anvÀnde applikationer databaser för strukturerad informationslagring och lokala enheter eller distribuerade filsystem dÀr all icke-strukturerad eller halvstrukturerad data sparades. I takt med att volymen av icke-strukturerad data ökade, insÄg utvecklarna att POSIX var alltför "pratsam", med betydande kostnader och, i slutÀndan, hindrade applikationens funktionalitet nÀr det kom till verkligt stora skalor.

Detta bidrog huvudsakligen till framvÀxten av en ny datalagringsstandard, det vill sÀga molncentrerade lagringssystem som frÀmst fungerar via REST API och avlastar applikationen frÄn bördan av att underhÄlla lokal datalagring. I det hÀr fallet arbetar applikationen faktiskt i ett tillstÄndslöst lÀge (eftersom tillstÄndet finns i det fjÀrrlagrade systemet). Moderna applikationer byggs frÄn grunden med hÀnsyn till denna faktor. Generellt sett Àr varje modern applikation som hanterar data av olika slag (loggar, metadata, blobs etc.) konstruerad utifrÄn en molncentrerad paradigm dÀr tillstÄndet flyttas till ett specifikt programvarusystem avsett för dess lagring.

Den containerbaserade ansatsen med behÄllning av tillstÄnd tvingar hela denna paradigm att ÄtervÀnda till exakt det dÀr det började!

NÀr man anvÀnder POSIX-grÀnssnitt för lagring av data fungerar applikationerna pÄ samma sÀtt som om de sparade tillstÄnd, och pÄ grund av detta avviker de frÄn de mest grundlÀggande postulaten för molnorienterad design, det vill sÀga möjligheten att variera storlekarna pÄ applikationens arbetsflöden beroende pÄ den inkommande belastningen, flytta till en ny nod sÄ snart den aktuella noden misslyckas, och sÄ vidare.

NÀr vi granskar denna situation mer noggrant upptÀcker vi att vi vid valet av datalagring gÄng pÄ gÄng stÀlls inför dilemmat "POSIX kontra REST API", MEN med en ytterligare förvÀrring av POSIX-problemen, vilket beror pÄ den distribuerade naturen hos Kubernetes-miljöer. Specifikt,

  • POSIX pratsam: semantiken för POSIX krĂ€ver att associera metadata och filhandtag med varje operation, vilket hjĂ€lper till att upprĂ€tthĂ„lla operationens tillstĂ„nd. Detta leder till betydande kostnader utan nĂ„got verkligt vĂ€rde. API:er för objektlagring, sĂ€rskilt S3 API, har tagit bort dessa krav, vilket gör att applikationen kan fungera och sedan "glömma" anropet. Svar frĂ„n datalagringssystemet indikerar om denna Ă„tgĂ€rd utfördes framgĂ„ngsrikt eller inte. Vid misslyckande kan applikationen göra ett försök igen.
  • NĂ€tverksbegrĂ€nsningar: I ett distribuerat system innebĂ€r det att det kan finnas mĂ„nga applikationer som försöker skriva data pĂ„ samma bifogade lagringsmedium. DĂ€rför, inte bara kommer applikationer att konkurrera med varandra om bandbredd (för att skicka data till lagringsmediet), utan sjĂ€lva lagringssystemet kommer ocksĂ„ att konkurrera om denna bandbredd, samtidigt som det distribuerar data över fysiska diskar. PĂ„ grund av POSIX:s pratighet ökar antalet nĂ€tverksanrop flera gĂ„nger. Å andra sidan erbjuder S3 API en tydlig uppdelning av nĂ€tverksanrop mellan de som kommer frĂ„n klienten till servern och de som förekommer inom servern.
  • SĂ€kerhet: POSIX-sĂ€kerhetsmodellen Ă€r utformad för aktivt mĂ€nniskoinvolvering: administratörer konfigurerar specifika Ă„tkomstnivĂ„er för varje anvĂ€ndare eller grupp. En sĂ„dan paradigm Ă€r svĂ„r att anpassa till en molnorienterad vĂ€rld. Moderna applikationer Ă€r beroende av sĂ€kerhetsmodeller kopplade till API:er, dĂ€r Ă„tkomstrĂ€ttigheter definieras som en uppsĂ€ttning policyer, tjĂ€nstekonton, tillfĂ€lliga autentiseringar osv.
  • Hantera: TillstĂ„ndshanterande containrar medför vissa kostnader i samband med hanteringen. Det handlar om att synkronisera parallell Ă„tkomst till data, att sĂ€kerstĂ€lla datakonsistens – allt detta krĂ€ver att noggrant övervĂ€ga vilka datĂ„tkomstmönster som anvĂ€nds. Ytterligare program mĂ„ste installeras, kontrolleras och konfigureras, för att inte nĂ€mna den extra arbetsinsats som krĂ€vs för utveckling.

Containernas datalagringsgrÀnssnitt

Medan det containerbaserade datalagringsgrÀnssnittet (CSI) har bidragit till spridningen av volymlagret i Kubernetes, delvis genom att överföra det till tredjeparts datalagringsleverantörer, har det ocksÄ oavsiktligt bidragit till övertygelsen om att en containerbaserad tillstÄndshantering Àr den rekommenderade metoden för datalagring i Kubernetes.

CSI utvecklades som en standard för att tillhandahÄlla godtyckliga block- och filbaserade datalagringssystem till Àrvda applikationer i samband med Kubernetes. Och som visats i denna artikel Àr den enda situation dÀr en containerbaserad tillstÄndshantering (och CSI i dess nuvarande form) Àr rimlig nÀr sjÀlva applikationen Àr en Àrvd system dÀr det Àr omöjligt att lÀgga till stöd för API:er för objektlagring.

Det Àr viktigt att förstÄ att nÀr vi anvÀnder CSI i dess nuvarande form, det vill sÀga monterar volymer nÀr vi arbetar med moderna applikationer, kommer vi att stöta pÄ ungefÀr samma problem som uppstod i system dÀr datalagringen organiserades i POSIX-stil.

En mer kvalitativ strategi

I det hÀr fallet Àr det viktigt att förstÄ att de flesta applikationer i grunden inte Àr designade för att fungera med enhetligt tillstÄnd eller utan bevarande av tillstÄnd. Detta beteende beror pÄ systemets övergripande arkitektur och de specifika val som gjorts vid designen. LÄt oss prata lite om applikationer som bevarar tillstÄnd.

I princip kan alla applikationsdata delas in i flera breda typer:

  • Loggdata
  • TidsstĂ€mpeldatan
  • Transaktionsdata
  • Metadat
  • Containermallar
  • Blobdata (stora binĂ€ra objekt)

Alla dessa datatyper stöds mycket vÀl pÄ moderna datalagringsplattformar, och det finns flera molnbaserade plattformar anpassade för att leverera data i vart och ett av dessa specifika format. Till exempel kan transaktionsdata och metadata finnas i en modern molnbaserad databas, sÄsom CockroachDB, YugaByte osv. Containermallar eller blobdata kan lagras i en docker-register baserat pÄ MinIO. TidsstÀmpeldatan kan lagras i en tidsseriedatabas, exempelvis InfluxDB osv. Vi kommer inte att gÄ in pÄ detaljer om varje datatyp och motsvarande applikationer hÀr, men den övergripande idén Àr att undvika persistent datalagring baserat pÄ lokal montering av diskar.

Mönster för datalagring i Kubernetes

Dessutom visar det sig ofta vara effektivt att tillhandahÄlla en nivÄ av tillfÀllig caching, som fungerar som ett slags lagring för temporÀra filer för applikationer, men applikationerna bör inte vara beroende av denna nivÄ som en sanningens kÀlla.

Lagring för applikationer med tillstÄnd

NĂ€r det i de flesta fall Ă€r anvĂ€ndbart att hĂ„lla applikationer utan tillstĂ„nd, bör de applikationer som Ă€r avsedda för datalagring – som databaser, objektlagringssystem, nyckel-vĂ€rde-lagringssystem – bevara tillstĂ„nd. LĂ„t oss förstĂ„ varför dessa applikationer deployeras pĂ„ Kubernetes. Som exempel kan vi ta MinIO, men liknande principer gĂ€ller för alla andra stora molnbaserade datalagringssystem.

Molnbaserade applikationer designas för att maximalt utnyttja flexibiliteten hos containrar. Detta innebÀr att inga antaganden görs om den miljö dÀr de kommer att distribueras. Till exempel anvÀnder MinIO en inbyggd mekanism för redundant kodning (erasure coding), vilket ger systemet tillrÀcklig motstÄndskraft för att förbli operativt Àven om hÀlften av diskarna gÄr ner. Dessutom hanterar MinIO integriteten och sÀkerheten hos data genom att anvÀnda egen hashning och kryptering pÄ serversidan.

För sÄdana molnbaserade applikationer Àr lokala persistenta volymer (PV) det mest praktiska valet som backup-lagringslösning. En lokal PV ger möjlighet att lagra rÄdata, medan applikationer som körs ovanpÄ dessa PV: er sjÀlvstÀndigt samlar information för att möjliggöra dataskalering och hantering av ökande datakrav.

Denna strategi Àr mycket enklare och skalar betydligt bÀttre jÀmfört med PV baserade pÄ CSI, som introducerar sina egna datastyrnings- och redundansnivÄer i systemet; problemet Àr att dessa nivÄer vanligtvis krockar med applikationer designade för att vara stateful.

SÀker rörelse mot avkopplade data frÄn berÀkningar

I denna artikel har vi diskuterat hur applikationer omformuleras för att arbeta utan att vara stateful, eller med andra ord, hur datalagring avskiljs frÄn berÀkningar. Avslutningsvis kommer vi att titta pÄ nÄgra verkliga exempel pÄ denna trend.

Spark, den berömda plattformen för dataanalys, har traditionellt anvÀnts med stateful driftsÀttning i filsystemet HDFS. Men i takt med att Spark gÄr mot en molnbaserad vÀrld anvÀnds denna plattform alltmer utan stateful hantering med hjÀlp av `s3a`. Spark anvÀnder s3a för att överföra tillstÄnd till andra system, medan sjÀlva Spark-containrarna arbetar helt utan att spara tillstÄnd. Andra stora aktörer inom analys av stora data, sÀrskilt Vertica, Teradata, Greenplum , övergÄr ocksÄ till att arbeta med separation av datalagring och berÀkningar.

Liknande mönster Äterfinns ocksÄ pÄ andra stora analytiska plattformar, sÄsom Presto, Tensorflow till R, Jupyter. Genom att exportera tillstÄndet till fjÀrrmolnlagringssystem blir det mycket enklare att hantera din applikation och skala den. Dessutom bidrar detta till applikationens portabilitet i olika miljöer.

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