I dag planlegger jeg Ă„ snakke om hvordan du skriver sĂžknader og hva som er kravene for at sĂžknaden din skal fungere godt i Kubernetes. Slik at det ikke er noen hodepine med applikasjonen, slik at du ikke trenger Ă„ finne opp og bygge noen "riper" rundt den - og alt fungerer slik Kubernetes selv hadde tenkt.
Dette foredraget er en del av "" Du kan se de Äpne teoretiske forelesningene til Aftenskolen . For de som foretrekker tekst fremfor video, har vi utarbeidet denne artikkelen.
Mitt navn er Pavel Selivanov, for tiden er jeg den ledende DevOps-ingeniÞren hos Mail.ru Cloud Solutions, vi lager skyer, vi lager administrasjonskubernetes og sÄ videre. Mine oppgaver inkluderer nÄ bistand til utvikling, utrulling av disse skyene, utrulling av applikasjonene som vi skriver og direkte utvikling av verktÞyene som vi tilbyr brukerne vÄre.

Jeg har drevet med DevOps, tror jeg de siste, sannsynligvis, tre Ärene. Men i prinsippet har jeg gjort det DevOps gjÞr i omtrent fem Är nÄ. FÞr det var jeg mest involvert i admin-ting. Jeg begynte Ä jobbe med Kubernetes for lenge siden - det har sikkert gÄtt rundt fire Är siden jeg begynte Ä jobbe med det.
Generelt startet jeg da Kubernetes var versjon 1.3, sannsynligvis, og kanskje 1.2 - da den fortsatt var i sin spede begynnelse. NĂ„ er det ikke lenger i startfasen â og det er Ă„penbart at det er en enorm etterspĂžrsel i markedet etter ingeniĂžrer som gjerne vil kunne drive med Kubernetes. Og bedrifter har veldig stor etterspĂžrsel etter slike folk. Derfor dukket faktisk dette foredraget opp.
Hvis vi snakker i henhold til planen om det jeg skal snakke om, ser det slik ut, i parentes stÄr det skrevet (TL;DR) - "for lenge; ikke les". Presentasjonen min i dag vil bestÄ av uendelige lister.

Faktisk liker jeg ikke slike presentasjoner nÄr de lages, men dette er et slikt tema at da jeg forberedte denne presentasjonen, fant jeg rett og slett ikke ut hvordan jeg skulle organisere denne informasjonen annerledes.
For i det store og hele er denne informasjonen «ctrl+c, ctrl+v», fra blant annet vÄr Wiki i DevOps-delen, hvor vi har skrevet krav til utviklere: «gutta, slik at vi lanserer applikasjonen din i Kubernetes, det skal vÊre slik."
Det er derfor presentasjonen viste seg Ä vÊre en sÄ stor liste. Beklager. Jeg skal prÞve Ä fortelle sÄ mye som mulig slik at det ikke blir kjedelig om mulig.
Hva vi skal se pÄ nÄ:
- dette er for det fĂžrste logger (applikasjonslogger?), hva skal man gjĂžre med dem i Kubernetes, hva man skal gjĂžre med dem, hva de skal vĂŠre;
- hva du skal gjÞre med konfigurasjoner i Kubernetes, hva er de beste og verste mÄtene Ä konfigurere en applikasjon for Kubernetes pÄ;
- La oss snakke om hva tilgjengelighetssjekker generelt er, hvordan de skal se ut;
- la oss snakke om hva en grasiĂžs nedleggelse er;
- la oss snakke om ressurser igjen;
- La oss berĂžre temaet datalagring nok en gang;
- og til slutt vil jeg fortelle deg hva begrepet denne mystiske skybaserte applikasjonen er. Cloudnativeness, som et adjektiv for dette begrepet.
TĂžmmerstokker
Jeg foreslĂ„r at du starter med loggene - med hvor disse loggene mĂ„ skyves i Kubernetes. NĂ„ har du lansert en applikasjon i Kubernetes. I fĂžlge klassikerne skrev tidligere applikasjoner alltid logger et sted i en fil. DĂ„rlige applikasjoner skrev logger til en fil i hjemmekatalogen til utvikleren som startet applikasjonen. Gode ââapplikasjoner skrev logger til en fil et sted i /var/log.

FÞlgelig hadde gode administratorer noen ting konfigurert i infrastrukturene deres som disse loggene kunne rotere - den samme rsyslog, som ser pÄ disse loggene og nÄr noe skjer med dem, er det mange av dem, den lager sikkerhetskopier, legger logger der , sletter gamle filer, mer enn en uke, seks mÄneder og noen mer. I teorien bÞr vi ha bestemmelser slik at bare fordi applikasjonen skriver logger, gÄr ikke plassen pÄ produksjonsserverne (kampservere?) tom. Og fÞlgelig stoppet ikke hele produksjonen pÄ grunn av tÞmmerstokkene.
NÄr vi flytter til Kubernetes-verdenen og kjÞrer det samme der, er det fÞrste du kan vÊre oppmerksom pÄ det faktum at folk, mens de skrev logger i en fil, fortsetter Ä skrive dem.
Det viser seg at hvis vi snakker om Kubernetes, er det rette stedet Ä skrive logger et sted fra en docker-container ganske enkelt Ä skrive dem fra applikasjonen til den sÄkalte Stdout/Stderr, det vil si standard utdatastrÞmmene til operativsystemet, standard feilutgang. Dette er den mest korrekte, enkleste og mest logiske mÄten Ä legge logger i prinsippet i Docker og spesifikt i Kubernetis. For hvis applikasjonen din skriver logger til Stdout/Stderr, er det opp til Docker og Kubernetes-tillegget Ä bestemme hva de skal gjÞre med disse loggene. Docker vil som standard bygge sine spesialfiler i JSON-format.
Her oppstÄr spÞrsmÄlet, hva vil du gjÞre videre med disse loggene? Den enkleste mÄten er klar, vi har evnen til Ä gjÞre kubectl logs og se pÄ disse loggene over disse "podene". Men sannsynligvis er dette ikke et veldig godt alternativ - noe annet mÄ gjÞres med loggene.
For nÄ, la oss snakke pÄ samme tid, siden vi berÞrte emnet logger, om noe slikt som logger skal se ut. Det vil si at dette ikke gjelder direkte for Kubernetes, men nÄr vi begynner Ä tenke pÄ hva vi skal gjÞre med logger, vil det vÊre greit Ä tenke pÄ dette ogsÄ.
Vi trenger et slags verktĂžy, pĂ„ en vennskapelig mĂ„te, som tar disse loggene som vĂ„r docker legger inn i filene sine og sender dem et sted. I det store og hele lanserer vi vanligvis en slags agent inne i Kubernetes i form av et DaemonSet â en loggsamler, som enkelt blir fortalt hvor loggene som Docker samler inn befinner seg. Og denne innsamlingsagenten tar dem ganske enkelt, kanskje analyserer dem pĂ„ en eller annen mĂ„te underveis, beriker dem kanskje med litt ekstra metainformasjon og sender dem til slutt for lagring et sted. Variasjoner er allerede mulig der. Det vanligste er nok Elasticsearch, hvor du kan lagre logger og du enkelt kan hente dem derfra. Deretter, bruk en forespĂžrsel, bruk Kibana, for eksempel, bygg grafer basert pĂ„ dem, bygg varsler basert pĂ„ dem, og sĂ„ videre.
Den viktigste ideen, jeg vil gjenta den igjen, er at inne i Docker, spesielt inne i Kubernetes, er det en veldig dÄrlig idé Ä lagre loggene dine i en fil.
For det fÞrste er det vanskelig Ä fÄ loggene inn i beholderen i en fil. Du mÄ fÞrst gÄ inn i containeren, kjÞre der, og sÄ se pÄ loggene. Det neste punktet er at hvis du har logger i en fil, sÄ har containerne vanligvis et minimalistisk miljÞ og det er ingen verktÞy som vanligvis trengs for normalt arbeid med logger. Begrav dem, se pÄ dem, Äpne dem i et tekstredigeringsprogram. Det neste Þyeblikket er nÄr vi har logger i en fil inne i en container, hvis denne beholderen blir slettet, forstÄr du, vil loggene dÞ sammen med den. FÞlgelig betyr enhver omstart av beholderen at det ikke er flere logger. Igjen, dÄrlig alternativ.
Og det siste poenget er at inne i containere har du vanligvis sÞknaden din og det er det - det er vanligvis den eneste prosessen som kjÞrer. Det er ikke snakk om noen prosess som vil rotere filer med loggene dine. SÄ snart loggene begynner Ä bli skrevet til en fil, betyr dette at vi, unnskyld meg, begynner Ä miste produksjonsserveren. For det fÞrste er de vanskelige Ä finne, ingen sporer dem, pluss at ingen kontrollerer dem - fÞlgelig vokser filen uendelig til plassen pÄ serveren gÄr tom. Derfor sier jeg igjen at det er en dÄrlig idé Ä logge pÄ Docker, spesielt i Kubernetes, til en fil.
Neste punkt, her vil jeg snakke om dette igjen - siden vi berĂžrer emnet logger, ville det vĂŠre greit Ă„ snakke om hvordan logger skal se ut for Ă„ gjĂžre det praktisk Ă„ jobbe med dem. Emnet er som sagt ikke direkte relatert til Kubernetes, men det relaterer seg veldig godt til emnet DevOps. Om temaet utviklingskultur og vennskap mellom disse to forskjellige avdelingene - Dev og Ops, slik at alle er komfortable.
Dette betyr at i dag ideelt sett bÞr logger skrives i JSON-format. Hvis du har en egen uforstÄelig applikasjon, som skriver logger i uforstÄelige formater fordi du setter inn en slags utskrift eller noe sÄnt, sÄ er det pÄ tide Ä google et slags rammeverk, en slags innpakning som lar deg implementere normal logging; aktiver loggingsparametere i JSON der, fordi JSON er et enkelt format, er det enkelt Ä analysere det.
Hvis din JSON ikke fungerer i henhold til noen kriterier, ingen vet hva, sÄ skriv i det minste logger i et format som kan parses. Her er det heller verdt Ä tenke pÄ det faktum at hvis du for eksempel kjÞrer en haug med containere eller bare prosesser med nginx, og hver har sine egne logginnstillinger, sÄ ser det sannsynligvis ut til at det vil vÊre veldig upraktisk for deg Ä analysere dem. Fordi for hver nye nginx-forekomst mÄ du skrive din egen parser, fordi de skriver logger annerledes. Igjen, det var sannsynligvis verdt Ä tenke pÄ Ä sÞrge for at alle disse nginx-forekomstene hadde den samme loggingskonfigurasjonen og skrev alle loggene deres helt ensartet. Det samme gjelder absolutt alle sÞknader.
Til slutt vil jeg ogsÄ legge bensin pÄ bÄlet som ideelt sett bÞr unngÄ flerlinjeformatlogger. Her er tingen, hvis du noen gang har jobbet med logger, sÄ har du mest sannsynlig sett hva de lover deg, at de kan jobbe med flerlinjelogger, vet hvordan de skal samles inn, og sÄ videre. Faktisk, etter min mening, kan ikke en eneste samler i dag samle flerlinjelogger normalt, fullstendig og uten feil. PÄ en menneskelig mÄte, slik at det er praktisk og feilfritt.

Men stack trace er alltid multi-line logger og hvordan unngÄ dem. SpÞrsmÄlet her er at en logg er en registrering av en hendelse, og stactrace er faktisk ikke en logg. Hvis vi samler logger og legger dem et sted i Elasticsearch og deretter tegner grafer fra dem, bygger noen rapporter om brukeraktivitet pÄ nettstedet ditt, sÄ nÄr du fÄr en stabelsporing, betyr det at noe uventet skjer, en uhÄndtert situasjon i applikasjonen din. Og det er fornuftig Ä automatisk laste opp en stabelsporing et sted inn i et system som kan spore dem.
Dette er programvare (samme Sentry) som er laget spesielt for Ä jobbe med stack trace. Den kan umiddelbart lage automatiserte oppgaver, tilordne dem til noen, varsle nÄr stacttraces oppstÄr, gruppere disse stacttraces etter én type, og sÄ videre. I prinsippet gir det ikke mye mening Ä snakke om stactraces nÄr vi snakker om logger, fordi dette tross alt er forskjellige ting med forskjellige formÄl.
Konfigurasjon
Deretter snakker vi om konfigurasjon i Kubernetes: hva du skal gjĂžre med den og hvordan applikasjoner inne i Kubernetes skal konfigureres. Generelt pleier jeg Ă„ si at Docker ikke handler om containere. Alle vet at Docker handler om containere, selv de som ikke har jobbet mye med Docker. Jeg gjentar, Docker handler ikke om containere.
Docker, etter min mening, handler om standarder. Og det finnes standarder for praktisk talt alt: standarder for Ă„ bygge applikasjonen din, standarder for installasjon av applikasjonen.

Og denne tingen - vi brukte den fÞr, den ble bare spesielt populÊr med ankomsten av containere - denne tingen kalles ENV (miljÞ) variabler, det vil si miljÞvariabler som er i operativsystemet ditt. Dette er generelt en ideell mÄte Ä konfigurere applikasjonen din pÄ, for hvis du har applikasjoner i JAVA, Python, Go, Perl, Gud forby, og de alle kan lese databaseverten, databasebrukeren, databasepassordvariablene, sÄ er det ideelt. Du har applikasjoner pÄ fire forskjellige sprÄk konfigurert i databaseplanen pÄ samme mÄte. Det er ikke flere forskjellige konfigurasjoner.
Alt kan konfigureres ved hjelp av ENV-variabler. NÄr vi snakker om Kubernetes, er det en fin mÄte Ä deklarere ENV-variabler rett inne i Deployment. FÞlgelig, hvis vi snakker om hemmelige data, kan vi umiddelbart skyve hemmelige data fra ENV-variabler (passord til databaser, etc.) inn i en hemmelighet, opprette en hemmelig klynge og indikere i ENV-beskrivelsen i Deployment at vi ikke direkte erklÊrer verdien av denne variabelen, og verdien til denne databasepassordvariabelen vil bli lest fra hemmeligheten. Dette er standard Kubernetes-adferd. Og dette er det mest ideelle alternativet for Ä konfigurere applikasjonene dine. Bare pÄ kodenivÄ, igjen gjelder dette utviklere. Hvis du er DevOps, kan du spÞrre: «Gutter, vennligst lÊr applikasjonen din Ä lese miljÞvariabler. Og vi vil alle vÊre glade.»
Hvis alle i selskapet leser de samme navngitte miljÞvariablene, sÄ er det flott. Slik at det ikke skjer at noen venter pÄ postgres-databasen, andre venter pÄ databasenavnet, andre venter pÄ noe annet, andre venter pÄ en dbn av noe slag, slik at det fÞlgelig blir ensartethet.
Problemet kommer nĂ„r du har sĂ„ mange miljĂžvariabler at du bare Ă„pner Deployment - og det er fem hundre linjer med miljĂžvariabler. I dette tilfellet har du ganske enkelt vokst ut av miljĂžvariabler â og du trenger ikke lenger Ă„ torturere deg selv. I dette tilfellet vil det vĂŠre fornuftig Ă„ begynne Ă„ bruke konfigurasjoner. Det vil si, tren applikasjonen din til Ă„ bruke konfigurasjoner.
SpÞrsmÄlet er bare at konfigurasjoner ikke er det du tror. Config.pi er ikke en config som er praktisk Ä bruke. Eller noen konfig i ditt eget format, alternativt begavet - dette er heller ikke konfigurasjonen jeg mener.
Det jeg snakker om er konfigurasjon i akseptable formater, det vil si at den desidert mest populĂŠre standarden er .yaml-standarden. Det er tydelig hvordan man leser det, det er lesbart for mennesker, det er tydelig hvordan man leser det fra applikasjonen.
FÞlgelig kan du i tillegg til YAML ogsÄ for eksempel bruke JSON, parsing er omtrent like praktisk som YAML nÄr det gjelder Ä lese applikasjonskonfigurasjonen derfra. Det er merkbart mer upraktisk for folk Ä lese. Du kan prÞve formatet, a la ini. Det er ganske praktisk Ä lese, fra et menneskelig synspunkt, men det kan vÊre upraktisk Ä behandle det automatisk, i den forstand at hvis du noen gang vil generere dine egne konfigurasjoner, kan ini-formatet allerede vÊre upraktisk Ä generere.
Men uansett hvilket format du velger, er poenget at fra et Kubernetes-synspunkt er det veldig praktisk. Du kan legge hele konfigurasjonen din i Kubernetes, i ConfigMap. Og sÄ ta dette konfigurasjonskartet og be det monteres inne i poden din i en bestemt katalog, der programmet vil lese konfigurasjonen fra denne konfigurasjonskartet som om det bare var en fil. Dette er faktisk det som er bra Ä gjÞre nÄr du har mange konfigurasjonsmuligheter i applikasjonen din. Eller det er bare en slags kompleks struktur, det er hekking.
Hvis du har et configmap, sÄ kan du godt lÊre applikasjonen din, for eksempel Ä automatisk spore endringer i filen der configmap er montert, og ogsÄ automatisk laste inn applikasjonen pÄ nytt nÄr konfigurasjonene endres. Dette vil generelt vÊre et ideelt alternativ.
Igjen, jeg har allerede snakket om dette - hemmelig informasjon er ikke i konfigurasjonskartet, hemmelig informasjon er ikke i variabler, hemmelig informasjon er ikke i hemmeligheter. Derfra kobler du denne hemmelige informasjonen til diplomati. Vanligvis lagrer vi alle beskrivelser av Kubernetes-objekter, distribusjoner, configmaps, tjenester i git. FÞlgelig er det en dÄrlig idé Ä legge passordet til databasen i git, selv om det er din git, som du har internt i selskapet. Fordi git som et minimum husker alt, og det er ikke sÄ lett Ä fjerne passord derfra.
Helsesjekk
Det neste punktet er denne tingen som heter helsesjekk. Generelt er en helsesjekk ganske enkelt Ă„ sjekke at applikasjonen din fungerer. Samtidig snakker vi oftest om visse nettapplikasjoner, som fĂžlgelig fra et helsesjekksynspunkt (det er bedre Ă„ ikke oversette her og videre) vil vĂŠre en spesiell URL, som de behandler som en standard, gjĂžr de vanligvis /health.
NÄr du fÄr tilgang til denne nettadressen, sier applikasjonen vÄr enten "ja, ok, alt er bra med meg, 200" eller "nei, alt er ikke bra med meg, rundt 500." FÞlgelig, hvis applikasjonen vÄr ikke er http, ikke en nettapplikasjon, snakker vi nÄ om en slags demon, vi kan finne ut hvordan vi gjÞr helsesjekker. Det vil si at det ikke er nÞdvendig, hvis applikasjonen ikke er http, sÄ fungerer alt uten helsesjekk og dette kan ikke gjÞres pÄ noen mÄte. Du kan periodisk oppdatere noe informasjon i filen, du kan komme opp med en spesiell kommando for daemonen din, som, daemon status, som vil si "ja, alt er bra, demonen fungerer, den er i live."
Hva er den til? Det fĂžrste og mest Ă„penbare er nok hvorfor det trengs en helsesjekk â for Ă„ forstĂ„ at applikasjonen fungerer. Jeg mener, det er bare dumt, nĂ„r det er oppe nĂ„, ser det ut som det fungerer, sĂ„ du kan vĂŠre sikker pĂ„ at det fungerer. Og det viser seg at applikasjonen kjĂžrer, beholderen kjĂžrer, instansen fungerer, alt er bra - og sĂ„ har brukerne allerede kuttet alle telefonnumrene fra teknisk stĂžtte og sagt "hva er du..., du sovnet, ingenting fungerer."
En helsesjekk er nettopp en slik mÄte Ä se fra brukerens synspunkt at den fungerer. En av metodene. La oss si det slik. Fra Kubernetes synspunkt er dette ogsÄ en mÄte Ä forstÄ nÄr applikasjonen starter, fordi vi forstÄr at det er forskjell pÄ nÄr beholderen ble lansert, opprettet og startet, og nÄr applikasjonen ble lansert direkte i denne beholderen. For hvis vi tar en gjennomsnittlig java-applikasjon og prÞver Ä starte den i dokken, kan den starte helt fint i fÞrti sekunder, eller til og med et minutt eller ti. I dette tilfellet kan du i det minste banke pÄ portene, den vil ikke svare der, det vil si at den ennÄ ikke er klar til Ä motta trafikk.
Igjen, ved hjelp av en helsesjekk og ved hjelp av det faktum at vi snur oss hit, kan vi forstÄ i Kubernetes at ikke bare beholderen har steget i applikasjonen, men selve applikasjonen har startet, den svarer allerede pÄ helsesjekk, som betyr at vi kan sende trafikk dit.

Det jeg snakker om nÄ kalles Readiness/Liveness-tester i Kubernetes; fÞlgelig er beredskapstestene vÄre ansvarlige for tilgjengeligheten til applikasjonen i balansering. Det vil si at hvis beredskapstester utfÞres i applikasjonen, sÄ er alt ok, klienttrafikk gÄr til applikasjonen. Hvis beredskapstester ikke utfÞres, deltar ganske enkelt ikke applikasjonen, denne spesielle forekomsten deltar ikke i balansering, den fjernes fra balansering, klienttrafikk flyter ikke. FÞlgelig er Liveness-tester i Kubernetes nÞdvendig, slik at hvis applikasjonen setter seg fast, kan den startes pÄ nytt. Hvis liveness-testen ikke fungerer for en applikasjon som er deklarert i Kubernetes, blir applikasjonen ikke bare fjernet fra balansering, den startes pÄ nytt.
Og her er et viktig poeng som jeg vil nevne: fra et praktisk synspunkt brukes beredskapstesten vanligvis oftere og er oftere nĂždvendig enn livlighetstesten. Det vil si, Ă„ bare tankelĂžst erklĂŠre bĂ„de beredskaps- og liveness-tester, fordi Kubernetes kan gjĂžre det, og la oss bruke alt det kan gjĂžre, er ikke en veldig god idĂ©. Jeg skal forklare hvorfor. For punkt nummer to i testing er at det vil vĂŠre en god idĂ© Ă„ sjekke den underliggende tjenesten i helsesjekkene dine. Dette betyr at hvis du har en nettapplikasjon som gir ut noe informasjon, som den igjen, naturligvis, mĂ„ ta fra et sted. I en database, for eksempel. Vel, det lagrer informasjonen som kommer inn i denne REST API i samme database. FĂžlgelig, hvis helsesjekken din svarer ganske enkelt som kontaktet slashhealth, sier applikasjonen "200, ok, alt er bra", og samtidig er applikasjonens database utilgjengelig, og helsesjekk-applikasjonen sier "200, ok, alt er i orden" â â Dette er en dĂ„rlig helsesjekk. Det er ikke slik det skal fungere.
Det vil si sÞknaden din, nÄr en forespÞrsel kommer til den /health, den svarer ikke bare, "200, ok", den gÄr fÞrst, for eksempel til databasen, prÞver Ä koble til den, gjÞr noe veldig grunnleggende der, som Ä velge en, bare sjekker at det er en forbindelse i databasen, og du kan spÞrre databasen. Hvis alt dette var vellykket, sÄ er svaret "200, ok." Hvis det ikke lykkes, stÄr det at det er en feil, databasen er utilgjengelig.
Derfor, i denne forbindelse, gĂ„r jeg igjen tilbake til beredskaps-/livetestene - hvorfor du mest sannsynlig trenger en beredskapstest, men det er snakk om en livenesstest. For hvis du beskriver helsesjekker akkurat som jeg sa, sĂ„ vil det vise seg at det ikke er tilgjengelig i instansdelenĐČ ĐžĐ»Đž ŃĐŸ ĐČŃĐ”Ń
instancei en database, for eksempel. Da du erklÊrte en beredskapstest, begynte helsesjekkene vÄre Ä mislykkes, og fÞlgelig blir alle applikasjonene som databasen ikke er tilgjengelige fra, ganske enkelt slÄtt av fra balansering og faktisk "henger" bare i en forsÞmt tilstand og venter pÄ at databasene deres skal arbeid.
Hvis vi har erklÊrt en liveness-test, sÄ tenk deg at databasen vÄr har gÄtt i stykker, og i Kubernetes begynner halvparten av alt Ä starte pÄ nytt fordi liveness-testen mislykkes. Dette betyr at du mÄ starte pÄ nytt. Dette er slett ikke det du Þnsker, jeg hadde til og med personlig erfaring i praksis. Vi hadde en chat-applikasjon som ble skrevet i JS og matet inn i en Mongo-database. Og problemet var at det var i begynnelsen av arbeidet mitt med Kubernetes, vi beskrev beredskapen, livligheten til tester pÄ prinsippet om at Kubernetes kan gjÞre det, sÄ vi vil bruke det. FÞlgelig ble Mongo pÄ et tidspunkt litt "kjedelig" og prÞven begynte Ä mislykkes. FÞlgelig, ifÞlge regntesten, begynte belgene Ä "drepe".
Som du forstÄr, nÄr de blir "drept", er dette en chat, det vil si at det er mange forbindelser fra klienter som henger pÄ den. De blir ogsÄ "drept" - nei, ikke klienter, bare forbindelser - ikke alle pÄ samme tid, og pÄ grunn av det faktum at de ikke blir drept samtidig, noen tidligere, noen senere, starter de ikke samtidig tid. Pluss standard tilfeldig, vi kan ikke forutsi med millisekunders nÞyaktighet starttidspunktet for applikasjonen hver gang, sÄ de gjÞr det en forekomst om gangen. Ett infopunkt reiser seg, legges til i balanseringen, alle klienter kommer dit, den tÄler ikke en slik belastning, fordi den er alene, og grovt sett er det et titalls av dem som jobber der, og det faller. Den neste reiser seg, hele lasset er pÄ ham, han faller ogsÄ. Vel, disse fossene fortsetter bare Ä fosse. Til slutt, hvordan dette ble lÞst - vi mÄtte bare strengt tatt stoppe brukertrafikken til denne applikasjonen, la alle forekomster stige og deretter starte all brukertrafikk pÄ en gang slik at den allerede var fordelt pÄ alle ti forekomstene.
Hvis det ikke var for at denne liveness-testen ble annonsert, som ville tvinge det hele til Ä starte pÄ nytt, ville applikasjonen ha taklet det helt fint. Men alt fra balansering er deaktivert for oss, fordi databasene er utilgjengelige og alle brukere har "falt av". SÄ, nÄr denne databasen blir tilgjengelig, er alt inkludert i balanseringen, men applikasjoner trenger ikke Ä starte pÄ nytt, og det er ingen grunn til Ä kaste bort tid og ressurser pÄ dette. De er alle her allerede, de er klare for trafikk, sÄ trafikken Äpner bare, alt er i orden - applikasjonen er pÄ plass, alt fortsetter Ä fungere.
Derfor er beredskaps- og livlighetstester forskjellige, dessuten kan man teoretisk gjÞre forskjellige helsesjekker, en type radier, en type liv, for eksempel, og sjekke forskjellige ting. Under beredskapstester, sjekk backends. Og pÄ en liveness-test, for eksempel, sjekker du ikke fra synspunktet at liveness-testen generelt bare er en applikasjon som svarer, hvis den er i stand til Ä svare i det hele tatt.
Fordi livlighetstesten i det store og hele er nÄr vi "stÄr fast". En endelÞs loop har startet eller noe annet - og ingen flere forespÞrsler behandles. Derfor er det fornuftig Ä til og med skille dem - og implementere annen logikk i dem.
AngÄende hva du skal svare nÄr du har en test, nÄr du gjÞr helsesjekker. Det er bare virkelig vondt. De som er kjent med dette vil nok le - men seriÞst, jeg har sett tjenester i mitt liv som svarer "200" i XNUMX % av tilfellene. Det vil si hvem som er vellykket. Men samtidig skriver de i selve svaret «en slik og slik feil».
Det vil si at svarstatusen kommer til deg - alt er vellykket. Men samtidig mÄ du analysere kroppen, fordi kroppen sier "beklager, forespÞrselen endte med en feil", og dette er bare virkeligheten. Jeg sÄ dette i virkeligheten.
Og slik at noen mennesker ikke synes det er morsomt, og andre synes det er veldig smertefullt, er det fortsatt verdt Ă„ fĂžlge en enkel regel. I helsesjekker, og i prinsippet ved arbeid med webapplikasjoner.
Hvis alt gikk bra, sÄ svar med to hundredels svar. I prinsippet vil ethvert to hundredels svar passe deg. Hvis du leser ragsy veldig godt og vet at noen svarstatuser er forskjellige fra andre, kan du svare med de passende: 204, 5, 10, 15, hva som helst. Hvis det ikke er veldig bra, sÄ bare "to null null." Hvis alt gÄr dÄrlig og helsesjekken ikke svarer, sÄ svar med en hvilken som helst femhundredel. Igjen, hvis du forstÄr hvordan du skal svare, hvordan forskjellige responsstatuser skiller seg fra hverandre. Hvis du ikke forstÄr, er 502 alternativet ditt til Ä svare pÄ helsesjekker hvis noe gÄr galt.
Dette er et annet poeng, jeg vil komme tilbake litt om Ă„ sjekke de underliggende tjenestene. Hvis du for eksempel begynner Ă„ sjekke alle de underliggende tjenestene som stĂ„r bak sĂžknaden din â alt generelt. Det vi fĂ„r fra synspunktet til mikrotjenestearkitektur, har vi et konsept som "lav kobling" - det vil si nĂ„r tjenestene dine er minimalt avhengige av hverandre. Hvis en av dem mislykkes, vil alle de andre uten denne funksjonaliteten ganske enkelt fortsette Ă„ fungere. Noe av funksjonaliteten fungerer rett og slett ikke. FĂžlgelig, hvis du knytter alle helsesjekkene til hverandre, vil du ende opp med at en ting faller i infrastrukturen, og fordi den falt, begynner ogsĂ„ alle helsesjekkene til alle tjenester Ă„ mislykkes - og det er mer infrastruktur generelt for hele mikrotjenestearkitekturen nr. Alt ble mĂžrkt der.
Derfor vil jeg gjenta dette igjen at du mÄ sjekke de underliggende tjenestene, de som sÞknaden din i hundre prosent av tilfellene ikke kan gjÞre jobben sin uten. Det vil si at det er logisk at hvis du har en REST API som brukeren lagrer til databasen eller henter fra databasen, sÄ kan du i fravÊr av en database ikke garantere arbeid med brukerne dine.
Men hvis brukerne dine, nÄr du tar dem ut av databasen, i tillegg er beriket med noen andre metadata, fra en annen backend, som du skriver inn fÞr du sender et svar til frontend - og denne backend ikke er tilgjengelig, betyr dette at du gir din svare uten noen del av metadataene.
Deretter har vi ogsÄ et av de smertefulle problemene nÄr vi starter applikasjoner.
Dette gjelder faktisk ikke bare Kubernetes i det store og hele, det skjedde at kulturen med en slags masseutvikling og spesielt DevOps begynte Ä spre seg omtrent samtidig som Kubernetes. Derfor viser det seg i det store og hele at du mÄ stenge applikasjonen din elegant uten Kubernetes. Allerede fÞr Kubernetes gjorde folk dette, men med bruken av Kubernetes begynte vi Ä snakke om det massevis.
GrasiĂžs nedleggelse
Generelt, hva er Graceful Shutdown og hvorfor er det nÞdvendig? Dette handler om nÄr programmet krasjer av en eller annen grunn, mÄ du gjÞre app stop - eller du mottar for eksempel et signal fra operativsystemet, applikasjonen din mÄ forstÄ det og gjÞre noe med det. Det verste tilfellet er selvfÞlgelig nÄr sÞknaden din mottar en SIGTERM og er som "SIGTERM, la oss henge pÄ, jobbe, ikke gjÞre noe." Dette er et direkte dÄrlig alternativ.

Et nesten like dÄrlig alternativ er nÄr applikasjonen din mottar en SIGTERM og er som "de sa segterm, det betyr at vi slutter, jeg har ikke sett, jeg kjenner ikke til noen brukerforespÞrsler, jeg vet ikke hva slags forespÞrsler jeg jobber med akkurat nÄ, sa de SIGTERM, det betyr at vi avslutter " Dette er ogsÄ et dÄrlig alternativ.
Hvilket alternativ er bra? Det fĂžrste punktet er Ă„ ta hensyn til ferdigstillelse av operasjoner. Et godt alternativ er at serveren din fortsatt tar hensyn til hva den gjĂžr hvis den mottar en SIGTERM.
SIGTERM er en myk nedleggelse, den er spesialdesignet, den kan avskjÊres pÄ kodenivÄ, den kan behandles, si at nÄ, vent, vi vil fÞrst fullfÞre arbeidet vi har, sÄ vil vi avslutte.
Fra et Kubernetes-perspektiv er det slik det ser ut. NÄr vi sier til en pod som kjÞrer i en Kubernetes-klynge, «vÊr sÄ snill, stopp, gÄ bort», eller en omstart skjer, eller en oppdatering skjer nÄr Kubernetes gjenskaper podene, sender Kubernetes akkurat den samme SIGTERM-meldingen til poden, venter pÄ litt tid, og , dette er tiden han venter, den er ogsÄ konfigurert, det er en slik spesiell parameter i diplomer og den kalles Graceful ShutdownTimeout. Som du forstÄr, heter det ikke det for ingenting, og det er ikke for ingenting vi snakker om det nÄ.
Der kan vi spesifikt si hvor lenge vi mĂ„ vente fra vi sender SIGTERM til sĂžknaden og nĂ„r vi forstĂ„r at sĂžknaden ser ut til Ă„ ha blitt gal for noe eller sitter fast og ikke kommer til Ă„ ta slutt - og vi mĂ„ send den SIGKILL, det vil si hardt fullfĂžre arbeidet. Det vil si, fĂžlgelig har vi en slags demon i gang, den behandler operasjoner. Vi forstĂ„r at operasjonene vĂ„re som demonen jobber med i gjennomsnitt ikke varer mer enn 30 sekunder om gangen. FĂžlgelig, nĂ„r SIGTERM ankommer, forstĂ„r vi at demonen vĂ„r maksimalt kan fullfĂžre 30 sekunder etter SIGTERM. Vi skriver det for eksempel 45 sekunder for sikkerhets skyld og sier at SIGTERM. Etter det venter vi 45 sekunder. I teorien skulle demonen i lĂžpet av denne tiden ha fullfĂžrt sitt arbeid og avsluttet seg selv. Men hvis det plutselig ikke kunne, betyr det at det mest sannsynlig sitter fast â det behandler ikke lenger forespĂžrslene vĂ„re normalt. Og pĂ„ 45 sekunder kan du trygt, faktisk, spikre ham fast.
Og her kan faktisk til og med 2 aspekter tas i betraktning. For det fÞrste, forstÄ at hvis du mottok en forespÞrsel, begynte du Ä jobbe med den pÄ en eller annen mÄte og ga ikke et svar til brukeren, men du mottok for eksempel SIGTERM. Det er fornuftig Ä avgrense det og gi et svar til brukeren. Dette er punkt nummer én i denne forbindelse. Punkt nummer to her er at hvis du skriver din egen applikasjon, generelt bygger arkitekturen pÄ en slik mÄte at du mottar en forespÞrsel om applikasjonen din, sÄ starter du litt arbeid, begynner Ä laste ned filer fra et sted, laste ned en database og sÄnt. - At. Generelt, brukeren din, henger forespÞrselen din i en halv time og venter pÄ at du skal svare ham - da, mest sannsynlig, mÄ du jobbe med arkitekturen. Det vil si, bare ta hensyn til sunn fornuft at hvis operasjonene dine er korte, er det fornuftig Ä ignorere SIGTERM og endre den. Hvis operasjonene dine er lange, gir det ingen mening Ä ignorere SIGTERM i dette tilfellet. Det er fornuftig Ä redesigne arkitekturen for Ä unngÄ sÄ lange operasjoner. Slik at brukerne ikke bare henger og venter. Jeg vet ikke, lag en slags websocket der, lag reverse hooks som serveren din allerede vil sende til klienten, noe annet, men ikke tving brukeren til Ä henge i en halvtime og bare vente pÄ en Þkt til du svar ham. Fordi det er uforutsigbart hvor det kan gÄ i stykker.
NÄr applikasjonen din avsluttes, bÞr du returnere en slags rimelig avslutningskode. Det vil si at hvis applikasjonen din ble bedt om Ä lukkes, stoppes, og den klarte Ä stoppe normalt pÄ egenhÄnd, er det ikke nÞdvendig Ä returnere en slags avslutningskode som 1, 5, 255 og sÄ videre. Alt som ikke er null, i hvert fall ikke i Linux I systemer er jeg helt sikker pÄ dette, det regnes som mislykket. Det vil si at applikasjonen din regnes som avsluttet med en feil. FÞlgelig, hvis applikasjonen din ble avsluttet uten en feil, ville du rapportere en 0-avslutning. Hvis applikasjonen din ble avsluttet med en feil av en eller annen grunn, ville du ikke rapportere en 0-avslutning. Og du kan jobbe med denne informasjonen.
Og det siste alternativet. Det er dÄrlig nÄr brukeren din sender en forespÞrsel og henger i en halv time mens du behandler den. Men generelt vil jeg ogsÄ si om hva som generelt sett er verdt det fra klientens side. Det spiller ingen rolle om du har en mobilapplikasjon, front-end osv. Det er nÞdvendig Ä ta hensyn til at brukerens Þkt generelt kan avsluttes, alt kan skje. En forespÞrsel kan sendes, for eksempel underbehandlet og ingen svar returnert. Frontend-en din eller mobilapplikasjonen din - hvilken som helst grensesnitt generelt, la oss si det sÄnn - bÞr ta hensyn til dette. Hvis du jobber med websockets, er dette generelt den verste smerten jeg noen gang har hatt.
NÄr utviklerne av noen vanlige chatter ikke vet det, viser det seg at websocket kan gÄ i stykker. For dem, nÄr noe skjer pÄ proxyen, endrer vi bare konfigurasjonen, og den laster pÄ nytt. Naturligvis er alle langvarige Þkter revet i dette tilfellet. Utviklere kommer lÞpende til oss og sier: «Gutter, hva gjÞr dere, chatten har gÄtt i stykker for alle vÄre kunder!» Vi sier til dem: «Hva gjÞr dere? Klarer ikke kundene dine Ä koble til igjen? De sier: «Nei, vi trenger at Þktene ikke blir revet.» Kort sagt, dette er faktisk tull. Kundesiden mÄ tas i betraktning. Spesielt, som jeg sier, med langvarige Þkter som websockets, kan den gÄ i stykker, og ubemerket av brukeren mÄ du kunne installere slike Þkter pÄ nytt. Og sÄ er alt perfekt.
Đ Đ”ŃŃŃŃŃ
Faktisk, her skal jeg bare fortelle deg en rett historie. Igjen fra det virkelige liv. Det sykeste jeg har hĂžrt om ressurser.
Ressurser i dette tilfellet mener jeg, en slags forespÞrsler, begrensninger som du kan sette pÄ pods i Kubernetes-klyngene dine. Det morsomste jeg hÞrte fra en utvikler ... En av mine medutviklere pÄ et tidligere arbeidssted sa en gang: "Min applikasjon vil ikke starte i klyngen." Jeg sÄ for Ä se at den ikke startet, men enten passet den ikke inn i ressursene, eller sÄ hadde de satt veldig smÄ grenser. Kort sagt, applikasjonen kan ikke starte pÄ grunn av ressurser. Jeg sier: "Det vil ikke starte pÄ grunn av ressurser, du bestemmer hvor mye du trenger og setter en tilstrekkelig verdi." Han sier: "Hva slags ressurser?" Jeg begynte Ä forklare ham at Kubernetes, grenser for forespÞrsler og bla, bla, bla mÄ settes. Mannen lyttet i fem minutter, nikket og sa: «Jeg kom hit for Ä jobbe som utvikler, jeg vil ikke vite noe om noen ressurser. Jeg kom hit for Ä skrive kode, og det er det.» Det er trist. Dette er et veldig trist konsept fra en utviklers synspunkt. Spesielt i den moderne verden, sÄ Ä si, av progressive devops.
Hvorfor trengs det ressurser i det hele tatt? Det er 2 typer ressurser i Kubernetes. Noen kalles forespÞrsler, andre kalles grenser. Med ressurser vil vi forstÄ at det i utgangspunktet alltid bare er to grunnleggende begrensninger. Det vil si CPU-tidsgrenser og RAM-grenser for en beholder som kjÞrer i Kubernetes.
En grense setter en Þvre grense for hvordan en ressurs kan brukes i applikasjonen din. Det vil si at hvis du sier 1 GB RAM i grensene, vil ikke applikasjonen din kunne bruke mer enn 1 GB RAM. Og hvis han plutselig vil og prÞver Ä gjÞre dette, sÄ vil en prosess kalt oom killer, uten hukommelse, det vil si, komme og drepe applikasjonen din - det vil si at den ganske enkelt starter pÄ nytt. Applikasjoner vil ikke starte pÄ nytt basert pÄ CPU. NÄr det gjelder CPU, hvis et program prÞver Ä bruke mye, mer enn spesifisert i grensene, vil CPU ganske enkelt bli strengt valgt. Dette fÞrer ikke til omstart. Dette er grensen - dette er den Þvre grensen.
Og det er en forespÞrsel. En forespÞrsel er hvordan Kubernetes forstÄr hvordan nodene i Kubernetes-klyngen din er fylt med applikasjoner. Det vil si at en forespÞrsel er en slags commit av sÞknaden din. Det stÄr det jeg vil bruke: "Jeg vil at du skal reservere sÄ mye CPU og sÄ mye minne for meg." En sÄ enkel analogi. Hva om vi har en node som har, jeg vet ikke, 8 CPUer totalt. Og en pod kommer dit, hvis forespÞrsler sier 1 CPU, noe som betyr at noden har 7 CPUer igjen. Det vil si at sÄ snart 8 pods ankommer denne noden, som hver har 1 CPU i forespÞrslene sine, har noden, som fra Kubernetes synspunkt, gÄtt tom for CPU og flere pods med forespÞrsler kan ikke lansert pÄ denne noden. Hvis alle nodene gÄr tom for CPU, vil Kubernetes begynne Ä si at det ikke er noen egnede noder i klyngen for Ä kjÞre podene dine fordi CPU-en har gÄtt tom.
Hvorfor trengs forespÞrsler og hvorfor uten forespÞrsler, jeg tror det ikke er nÞdvendig Ä lansere noe i Kubernetes? La oss forestille oss en hypotetisk situasjon. Du starter applikasjonen din uten forespÞrsler, Kubernetes vet ikke hvor mye av det du har, hvilke noder du kan presse det til. Vel, han dytter, dytter, dytter inn pÄ nodene. PÄ et tidspunkt vil du begynne Ä fÄ trafikk til applikasjonen din. Og en av applikasjonene begynner plutselig Ä bruke ressurser opp til grensene den har i henhold til grensene. Det viser seg at det er en annen applikasjon i nÊrheten, og den trenger ogsÄ ressurser. Noden begynner faktisk Ä gÄ tom for ressurser, for eksempel OP. Noden begynner faktisk Ä gÄ tom for ressurser, for eksempel RAM (Random Access Memory). NÄr en node gÄr tom for strÞm, vil fÞrst av alt docker slutte Ä svare, deretter kubelet, deretter OS. De vil rett og slett bli bevisstlÞse og ALT vil definitivt slutte Ä fungere for deg. Det vil si at dette vil fÞre til at noden din blir sittende fast og du mÄ starte den pÄ nytt. Kort sagt, situasjonen er ikke sÊrlig god.
Og nÄr du har forespÞrsler, grensene er ikke veldig forskjellige, i hvert fall ikke mange ganger mer enn grensene eller forespÞrslene, da kan du ha en slik normal, rasjonell fylling av sÞknader pÄ tvers av nodene til Kubernetes-klynger. Samtidig er Kubernetes omtrent klar over hvor mye av det den legger hvor, hvor mye av det som brukes hvor. Det vil si, det er akkurat et slikt Þyeblikk. Det er viktig Ä forstÄ det. Og det er viktig Ä kontrollere at dette er indikert.
Datalagring
VÄrt neste punkt handler om datalagring. Hva skal man gjÞre med dem og generelt, hva skal man gjÞre med utholdenhet i Kubernetes?
Jeg tror igjen, innenfor vÄrt , var det et emne om databasen i Kubernetes. Og det ser ut til at jeg til og med omtrent vet hva kollegene dine sa til deg da de ble spurt: "Er det mulig Ä kjÞre en database i Kubernetes?" Av en eller annen grunn ser det ut til at kollegene dine burde ha fortalt deg at hvis du stiller spÞrsmÄlet om det er mulig Ä kjÞre en database i Kubernetes, sÄ er det umulig.
Logikken her er enkel. Bare i tilfelle, jeg skal forklare nok en gang, hvis du er en veldig kul fyr som kan bygge et ganske feiltolerant system med distribuert nettverkslagring, forstÄ hvordan du passer en database inn i dette tilfellet, hvordan cloud native i containere skal fungere i en database generelt. Mest sannsynlig har du ingen spÞrsmÄl om hvordan du kjÞrer den. Hvis du har et slikt spÞrsmÄl, og du vil forsikre deg om at det hele utfolder seg og stÄr rett til dÞden i produksjonen og aldri faller, sÄ skjer ikke dette. Du vil garantert skyte deg selv i foten med denne tilnÊrmingen. SÄ det er bedre Ä la vÊre.
Hva skal vi gjÞre med dataene som applikasjonen vÄr Þnsker Ä lagre, noen bilder som brukere laster opp, noen ting som applikasjonen vÄr genererer under driften, for eksempel ved oppstart? Hva skal jeg gjÞre med dem i Kubernetes?
Generelt, ideelt sett, ja, selvfĂžlgelig, er Kubernetes veldig godt utformet og ble vanligvis opprinnelig utviklet for statslĂžse applikasjoner. Det vil si for de applikasjonene som ikke lagrer informasjon i det hele tatt. Dette er ideelt.
Men det ideelle alternativet eksisterer selvfÞlgelig ikke alltid. Hva sÄ? Det fÞrste og enkleste punktet er Ä ta en slags S3, bare ikke en hjemmelaget, som ogsÄ er uklart hvordan den fungerer, men fra en eller annen leverandÞr. En god, normal leverandÞr - og lÊr applikasjonen din Ä bruke S3. Det vil si at nÄr brukeren din vil laste opp en fil, si "her, vÊr sÄ snill, last den opp til S3." NÄr han vil motta den, si: "Her er en lenke til S3 tilbake og ta den herfra." Dette er ideelt.
Hvis dette ideelle alternativet plutselig av en eller annen grunn ikke er egnet, du har en applikasjon du ikke har skrevet, du ikke utvikler, eller det er en slags forferdelig arv, den kan ikke bruke S3-protokollen, men mÄ fungere med lokale kataloger i lokale mapper. Ta noe mer eller mindre enkelt, distribuer Kubernetes. Det vil si Ä umiddelbart gjerde Ceph for noen minimale oppgaver, virker det som en dÄrlig idé. Fordi Ceph, selvfÞlgelig, er god og moteriktig. Men hvis du egentlig ikke forstÄr hva du gjÞr, sÄ nÄr du fÞrst har satt noe pÄ Ceph, kan du veldig enkelt og rett og slett aldri fÄ det ut derfra igjen. Fordi, som du vet, lagrer Ceph data i sin klynge i binÊr form, og ikke i form av enkle filer. Derfor, hvis plutselig Ceph-klyngen bryter sammen, sÄ er det en fullstendig og hÞy sannsynlighet for at du aldri fÄr dataene dine derfra igjen.
Vi skal ha et kurs om Ceph, det kan du .
Derfor er det bedre Ä gjÞre noe enkelt som en NFS-server. Kubernetes kan jobbe med dem, du kan montere en katalog under en NFS-server - applikasjonen din er akkurat som en lokal katalog. Samtidig mÄ du naturligvis forstÄ at du igjen mÄ gjÞre noe med NFS-en din, du mÄ forstÄ at noen ganger kan den bli utilgjengelig og vurdere spÞrsmÄlet om hva du vil gjÞre i dette tilfellet. Kanskje det bÞr sikkerhetskopieres et sted pÄ en egen maskin.
Det neste punktet jeg snakket om er hva du skal gjÞre hvis applikasjonen din genererer noen filer under drift. For eksempel, nÄr den starter, genererer den en statisk fil, som er basert pÄ noe informasjon som applikasjonen mottar bare pÄ tidspunktet for lansering. For et Þyeblikk. Hvis det ikke er mye slike data, trenger du ikke Ä bry deg i det hele tatt, bare installer denne applikasjonen for deg selv og jobb. Det eneste spÞrsmÄlet her er hva, se. SvÊrt ofte, alle slags eldre systemer, som WordPress og sÄ videre, spesielt med modifiserte noen slags utspekulerte plugins, utspekulerte PHP-utviklere, vet de ofte hvordan de skal lage det slik at de genererer en slags fil for seg selv. FÞlgelig genererer man én fil, den andre genererer en andre fil. De er forskjellige. Balansering skjer i kundenes Kubernetes-klynge ganske enkelt ved en tilfeldighet. FÞlgelig viser det seg at de for eksempel ikke vet hvordan de skal samarbeide. Den ene gir én informasjon, den andre gir brukeren en annen informasjon. Det er dette du bÞr unngÄ. Det vil si at i Kubernetes vil alt du lanserer garantert kunne fungere i flere instanser. Fordi Kubernetes er en gripende ting. FÞlgelig kan han flytte hva som helst, nÄr han vil, uten Ä spÞrre noen i det hele tatt. Derfor mÄ du regne med dette. Alt som lanseres i én instans vil fÞr eller siden mislykkes. Jo flere reservasjoner du har, jo bedre. Men igjen, sier jeg, hvis du har noen fÄ slike filer, sÄ kan du legge dem rett under deg, de veier en liten mengde. Hvis det er litt flere av dem, bÞr du sannsynligvis ikke skyve dem inn i beholderen.
Jeg vil anbefale at det er en sÄ fantastisk ting i Kubernetes, du kan bruke volum. Spesielt er det et volum av typen tomme dir. Det vil si, det er bare at Kubernetes automatisk oppretter en katalog i tjenestekatalogene pÄ serveren der du startet. Og han vil gi det til deg slik at du kan bruke det. Det er bare ett viktig poeng. Det vil si at dataene dine ikke blir lagret inne i beholderen, men heller pÄ verten du kjÞrer pÄ. Dessuten kan Kubernetes kontrollere slike tomme dirs under normal konfigurasjon og er i stand til Ä kontrollere deres maksimale stÞrrelse og ikke tillate at den overskrides. Det eneste poenget er at det du har skrevet i tom dir ikke gÄr tapt under omstart av pod. Det vil si at hvis poden din faller ved en feil og reiser seg igjen, vil ikke informasjonen i den tomme katalogen gÄ noen vei. Han kan bruke den igjen pÄ en ny start - og det er bra. Hvis poden din drar et sted, vil han naturligvis dra uten data. Det vil si at sÄ snart poden fra noden der den ble lansert med tom dir forsvinner, slettes tom dir.
Hva annet er bra med tomme dir? For eksempel kan den brukes som en cache. La oss forestille oss at applikasjonen vÄr genererer noe pÄ farten, gir det til brukerne og gjÞr det i lang tid. Derfor genererer applikasjonen for eksempel og gir den til brukerne, og lagrer den samtidig et sted, slik at neste gang brukeren kommer for det samme, vil det gÄ raskere Ä gi den umiddelbart generert. Tom katalog kan bes Kubernetes om Ä opprette i minnet. Og dermed kan cachene dine generelt fungere lynraskt - nÄr det gjelder disktilgangshastighet. Det vil si at du har en tom dir i minnet, i OS er det lagret i minnet, men for deg, for brukeren inne i poden, ser det ut som bare en lokal katalog. Du trenger ikke appen for spesifikt Ä lÊre bort magi. Du bare tar og legger filen direkte i en katalog, men faktisk i minnet pÄ operativsystemet. Dette er ogsÄ en veldig praktisk funksjon nÄr det gjelder Kubernetes.
Hvilke problemer har Minio? Hovedproblemet med Minio er at for at denne tingen skal fungere, mÄ den kjÞres et sted, og det mÄ vÊre et slags filsystem, det vil si lagring. Og her mÞter vi de samme problemene som Ceph har. Det vil si at Minio mÄ lagre filene sine et sted. Det er rett og slett et HTTP-grensesnitt til filene dine. Dessuten er funksjonaliteten klart dÄrligere enn Amazons S3. Tidligere var det ikke i stand til Ä autorisere brukeren pÄ riktig mÄte. NÄ kan den, sÄ vidt jeg vet, allerede lage bÞtter med ulike autorisasjoner, men igjen virker det for meg som om hovedproblemet sÄ Ä si er det underliggende lagringssystemet i det minste.
Hvordan pÄvirker Empty dir i minnet grensene? PÄvirker ikke grenser pÄ noen mÄte. Det ligger i minnet til verten, og ikke i minnet til beholderen din. Det vil si at beholderen din ikke ser den tomme mappen i minnet som en del av det okkuperte minnet. Verten ser dette. FÞlgelig, ja, fra kubernetes synspunkt, nÄr du begynner Ä bruke dette, ville det vÊre godt Ä forstÄ at du bruker en del av minnet ditt til tom dir. Og derfor mÄ du forstÄ at minnet kan gÄ tom ikke bare pÄ grunn av applikasjoner, men ogsÄ fordi noen skriver til disse tomme dirs.
Cloudnativeness
Og det siste underemnet er hva Cloudnative er. Hvorfor trengs det? Cloudnativeness og sÄ videre.
Det vil si de applikasjonene som er kapable og skrevet for Ä fungere i en moderne skyinfrastruktur. Men faktisk har Cloudnative et annet slikt aspekt. At dette ikke bare er en applikasjon som tar hensyn til alle kravene til en moderne skyinfrastruktur, men ogsÄ vet hvordan man jobber med denne moderne skyinfrastrukturen, dra nytte av fordelene og ulempene ved at det fungerer i disse skyene. Ikke bare gÄ over bord og arbeid i skyene, men dra nytte av fordelene ved Ä jobbe i skyen.

La oss bare ta Kubernetes som et eksempel. Applikasjonen din kjÞrer i Kubernetes. Applikasjonen din kan alltid, eller snarere administratorene for applikasjonen din, alltid opprette en tjenestekonto. Det vil si en konto for autorisasjon i Kubernetes selv pÄ serveren. Legg til noen rettigheter vi trenger der. Og du kan fÄ tilgang til Kubernetes fra applikasjonen din. Hva kan du gjÞre pÄ denne mÄten? For eksempel, fra applikasjonen, motta data om hvor de andre applikasjonene dine, andre lignende instanser er plassert, og sammen pÄ en eller annen mÄte klynge pÄ toppen av Kubernetes, hvis det er et slikt behov.
Igjen, vi hadde bokstavelig talt en sak nylig. Vi har én kontrollÞr som overvÄker kÞen. Og nÄr noen nye oppgaver dukker opp i denne kÞen, gÄr den til Kubernetes - og inne i Kubernetes lager den en ny pod. Gir denne poden en ny oppgave og innenfor rammen av denne poden utfÞrer poden oppgaven, sender et svar til kontrolleren selv, og kontrolleren gjÞr sÄ noe med denne informasjonen. For eksempel legger den sammen en database. Det vil si, igjen, dette er et pluss ved at applikasjonen vÄr kjÞrer i Kubernetes. Vi kan bruke selve den innebygde Kubernetes-funksjonaliteten for pÄ en eller annen mÄte Ä utvide og gjÞre funksjonaliteten til applikasjonen vÄr mer praktisk. Det vil si, ikke skjul en slags magi om hvordan du starter en applikasjon, hvordan du starter en arbeider. I Kubernetes sender du ganske enkelt en forespÞrsel i appen hvis applikasjonen er skrevet i Python.
Det samme gjelder hvis vi gĂ„r utover Kubernetes. Vi har vĂ„re Kubernetes kjĂžrende et sted â det er bra hvis det er i en slags sky. Igjen, vi kan bruke, og bĂžr til og med, tror jeg, bruke mulighetene til selve skyen der vi kjĂžrer. Fra de elementĂŠre tingene som skyen gir oss. Balansering, det vil si at vi kan lage skybalansere og bruke dem. Dette er en direkte fordel av det vi kan bruke. Fordi skybalansering, for det fĂžrste, ganske enkelt dumt fjerner ansvaret fra oss for hvordan det fungerer, hvordan det er konfigurert. I tillegg er det veldig praktisk, fordi vanlige Kubernetes kan integreres med skyer.
Det samme gjelder for skalering. Vanlige Kubernetes kan integreres med skyleverandÞrer. Vet hvordan du skal forstÄ at hvis klyngen gÄr tom for noder, det vil si at nodeplassen er tom, sÄ mÄ du legge til - Kubernetes selv vil legge til nye noder til klyngen din og begynne Ä lansere pods pÄ dem. Det vil si at nÄr lasten din kommer, begynner antallet ildsteder Ä Þke. NÄr nodene i klyngen gÄr tom for disse podene, lanserer Kubernetes nye noder, og fÞlgelig kan antallet pods fortsatt Þke. Og det er veldig praktisk. Dette er en direkte mulighet til Ä skalere klyngen i farten. Ikke veldig raskt, i den forstand at det ikke er et sekund, det er mer som et minutt for Ä legge til nye noder.
Men fra min erfaring, igjen, er det det kuleste jeg noen gang har sett. NÄr Cloudnative-klyngen skalert basert pÄ tid pÄ dagen. Det var en backend-tjeneste som ble brukt av folk i backoffice. Det vil si at de kommer pÄ jobb klokken 9, begynner Ä logge pÄ systemet, og fÞlgelig begynner Cloudnative-klyngen, der alt kjÞrer, Ä svulme opp, og lanserer nye pods slik at alle som kommer pÄ jobb kan jobbe med applikasjonen. NÄr de gÄr fra jobb kl. 8 eller 6, merker Kubernetes-klyngene at ingen bruker applikasjonen lenger og begynner Ä krympe. Besparelser pÄ opptil 30 prosent er garantert. Det fungerte i Amazon pÄ den tiden; pÄ den tiden var det ingen i Russland som kunne gjÞre det sÄ bra.
Jeg skal si deg rett ut, besparelsene er 30 prosent bare fordi vi bruker Kubernetes og drar nytte av mulighetene til skyen. NĂ„ kan dette gjĂžres i Russland. Jeg vil selvfĂžlgelig ikke annonsere for noen, men la oss bare si at det er leverandĂžrer som kan gjĂžre dette, gi det rett ut av boksen med en knapp.
Det er et siste punkt som jeg ogsÄ vil gjÞre deg oppmerksom pÄ. For at applikasjonen din, infrastrukturen din skal vÊre Cloudnative, er det fornuftig Ä endelig begynne Ä tilpasse tilnÊrmingen kalt Infrastructure as a Code. Det vil si at dette betyr at applikasjonen din, eller snarere infrastrukturen din, er nÞdvendig pÄ nÞyaktig samme mÄte som kode Beskriv din applikasjon, din forretningslogikk i form av kode. Og jobb med den som kode, det vil si test den, rull den ut, lagre den i git, bruk CICD pÄ den.
Og det er nettopp dette som lar deg, for det fÞrste, alltid ha kontroll over infrastrukturen din, alltid forstÄ hvilken tilstand den er i. For det andre, unngÄ manuelle operasjoner som forÄrsaker feil. For det tredje, unngÄ rett og slett det som kalles omsetning, nÄr du hele tiden trenger Ä utfÞre de samme manuelle oppgavene. For det fjerde lar den deg komme deg mye raskere i tilfelle feil. I Russland, hver gang jeg snakker om dette, er det alltid et stort antall mennesker som sier: "Ja, det er klart, men du har tilnÊrminger, kort sagt, det er ikke nÞdvendig Ä fikse noe." Men det er sant. Hvis noe er Þdelagt i infrastrukturen din, sÄ fra synspunktet til Cloudnative-tilnÊrmingen og fra synspunktet til infrastruktur som en kode, i stedet for Ä fikse det, gÄ til serveren, finne ut hva som er Þdelagt og fikse det, er det enklere for Ä slette serveren og opprette den pÄ nytt. Og jeg vil fÄ alt dette gjenopprettet.
Alle disse spÞrsmÄlene diskuteres mer detaljert pÄ . Ved Ä fÞlge lenken kan du gjÞre deg kjent med programmet og betingelsene. Det praktiske er at du kan mestre Kubernetes ved Ä studere hjemmefra eller jobbe 1-2 timer om dagen.
Kilde: www.habr.com
