Kubernetes

Stateful vs Stateless Applications på Kubernetes

Stateful vs Stateless Applications på Kubernetes
viktige kriterier du bør vurdere før du kjører en ny applikasjon, i produksjon, er appens underliggende arkitektur. Et begrep som ofte brukes i denne sammenheng er at applikasjonen er 'statsløs' eller at applikasjonen er 'stateful'. Begge typene har sine egne fordeler og ulemper. Vi vil ha en Kubernetes-klynge i bakhodet når vi snakker om en applikasjon eller en tjeneste som kjører i produksjon. Du kan installere en egen Kubernetes-klynge på skyen, eller du kan få den til å kjøre som en enkelt node på PC-en din for å få litt øvelse med den.

La oss starte med en naiv definisjon av 'statsløshet' og deretter sakte utvikle oss til et strengere og virkeligere syn.

En statsløs applikasjon er en som avhenger av ingen vedvarende lagring. Det eneste klyngen din er ansvarlig for, er koden og annet statisk innhold som ligger på den. Det er det, ingen databaser som endres, ingen skrivinger og ingen gjenværende filer når pod'en slettes.

En stateful applikasjon, derimot, har flere andre parametere den skal passe på i klyngen. Det er dynamiske databaser som, selv når appen er frakoblet eller slettet, fortsetter på disken. På et distribuert system, som Kubernetes, reiser dette flere problemer. Vi vil se på dem i detalj, men la oss først avklare noen misforståelser.

Statsløse tjenester er faktisk ikke 'statsløse'

Hva betyr det når vi sier tilstanden til et system? Vel, la oss vurdere følgende enkle eksempel på en automatisk dør.

Døren åpnes når sensoren oppdager noen som nærmer seg, og den lukkes når sensoren ikke får noe relevant inngang.

I praksis ligner den statsløse appen din på denne mekanismen ovenfor. Det kan ha mange flere tilstander enn bare lukkede eller åpne, og mange forskjellige typer innganger gjør det også mer komplekst, men egentlig det samme.

Det kan løse kompliserte problemer ved å bare motta en inngang og utføre handlinger som avhenger av både inngangen og 'tilstanden' den er i. Antall mulige tilstander er forhåndsdefinerte.

Så statsløshet er en feilnavn.

Statsløse applikasjoner kan i praksis også jukse litt ved å lagre detaljer om for eksempel klientsesjonene på selve klienten (HTTP-informasjonskapsler er et godt eksempel) og fortsatt ha en fin statsløshet som vil få dem til å kjøre feilfritt på klyngen.

For eksempel kan en klients sesjonsdetaljer som hvilke produkter som ble lagret i handlekurven og ikke sjekket ut, lagres på klienten, og neste gang en økt begynner blir disse relevante detaljene også husket.

På en Kubernetes-klynge har et statsløst program ingen vedvarende lagring eller volum tilknyttet. Fra et operasjonsperspektiv er dette gode nyheter. Ulike pods over hele klyngen kan fungere uavhengig med flere forespørsler som kommer til dem samtidig. Hvis noe går galt, kan du bare starte programmet på nytt, og det vil gå tilbake til opprinnelig tilstand med lite nedetid.

Stateful services and the CAP theorem

De statelige tjenestene, derimot, må bekymre seg for mange og mange kantsaker og rare problemer. En pod er ledsaget av minst ett volum, og hvis dataene i det volumet er ødelagt, fortsetter det selv om hele klyngen blir startet om.

Hvis du for eksempel kjører en database på en Kubernetes-klynge, må alle podene ha et lokalt volum for lagring av databasen. Alle dataene må være i perfekt synkronisering.

Så hvis noen endrer en oppføring i databasen, og det ble gjort på pod A, og en leseanmodning kommer på pod B for å se de modifiserte dataene, må pod B vise de siste dataene eller gi deg en feilmelding. Dette er kjent som konsistens.

Konsistens, i sammenheng med en Kubernetes-klynge, betyr hver lesing mottar den siste skrivingen eller en feilmelding.

Men dette kutter mot tilgjengelighet, en av de viktigste årsakene til å ha et distribuert system. Tilgjengelighet innebærer at applikasjonen din fungerer så nær perfeksjon som mulig, døgnet rundt, med så lite feil som mulig.

Man kan hevde at du kan unngå alt dette hvis du bare har en sentralisert database som er ansvarlig for å håndtere alle de vedvarende lagringsbehovene. Nå er vi tilbake til å ha et eneste feilpunkt, noe som er enda et problem som en Kubernetes-klynger skal løse i utgangspunktet.

Du må ha en desentralisert måte å lagre vedvarende data i en klynge. Ofte referert til som nettverkspartisjonering. Videre må klyngen din være i stand til å overleve svikt i noder som kjører den stateful-applikasjonen. Dette er kjent som partisjonstoleranse.

Enhver stateful service (eller applikasjon), som kjøres på en Kubernetes-klynge, må ha en balanse mellom disse tre parametrene. I bransjen er det kjent som CAP-setningen der avveiningene mellom konsistens og tilgjengelighet vurderes i nærvær av nettverkspartisjonering.

Ytterligere referanser

For ytterligere innsikt i CAP-setningen vil du kanskje se denne utmerkede talen holdt av Bryan Cantrill, som ser mye nærmere på å kjøre distribuerte systemer i produksjon.

Hvordan vise OSD-overlegg i fullskjerm Linux-apper og spill
Å spille fullskjermspill eller bruke apper i distraksjonsfri fullskjermmodus kan avskrekke deg fra relevant systeminformasjon som er synlig i et panel...
Topp 5 spillfangstkort
Vi har alle sett og elsket streaming av spill på YouTube. PewDiePie, Jakesepticye og Markiplier er bare noen av de beste spillerne som har tjent milli...
Hvordan utvikle et spill på Linux
For et tiår siden ville ikke mange Linux-brukere forutsi at deres favorittoperativsystem en dag ville være en populær spillplattform for kommersielle ...