Krav för att utveckla en applikation i Kubernetes

Idag tÀnker jag prata om hur man skriver ansökningar och vilka krav som krÀvs för att din ansökan ska fungera bra i Kubernetes. SÄ att det inte finns nÄgon huvudvÀrk med applikationen, sÄ att du inte behöver uppfinna och bygga nÄgra "spÄr" runt den - och allt fungerar som Kubernetes sjÀlv tÀnkt.

Denna förelÀsning Àr en del av "Slurm Night School pÄ Kubernetes" Du kan se KvÀllsskolans öppna teoretiska förelÀsningar pÄ Youtube, grupperade i en spellista. För dem som föredrar text snarare Àn video har vi förberett den hÀr artikeln.

Jag heter Pavel Selivanov, för nÀrvarande Àr jag den ledande DevOps-ingenjören pÄ Mail.ru Cloud Solutions, vi gör moln, vi gör management-kubernetes och sÄ vidare. Mina arbetsuppgifter inkluderar nu assistans vid utveckling, utrullning av dessa moln, utrullning av de applikationer som vi skriver och direktutveckling av de verktyg som vi tillhandahÄller vÄra anvÀndare.

Krav för att utveckla en applikation i Kubernetes

Jag har gjort DevOps, tror jag de senaste tre Ären. Men i princip har jag gjort vad DevOps gör i ungefÀr fem Är nu. Innan dess var jag mest involverad i admin-grejer. Jag började jobba med Kubernetes för lÀnge sedan - det har sÀkert gÄtt ungefÀr fyra Är sedan jag började jobba med det.

I allmĂ€nhet började jag nĂ€r Kubernetes var version 1.3, förmodligen, och kanske 1.2 - nĂ€r det fortfarande var i sin linda. Nu Ă€r det inte lĂ€ngre i sin linda – och det Ă€r uppenbart att det finns en enorm efterfrĂ„gan pĂ„ marknaden pĂ„ ingenjörer som skulle vilja kunna göra Kubernetes. Och företag har en mycket stor efterfrĂ„gan pĂ„ sĂ„dana mĂ€nniskor. DĂ€rför dök faktiskt denna förelĂ€sning upp.

Om vi ​​talar enligt planen för vad jag ska prata om, ser det ut sĂ„ hĂ€r, inom parentes stĂ„r det (TL;DR) - "för lĂ€nge; lĂ€s inte". Min presentation idag kommer att bestĂ„ av oĂ€ndliga listor.

Krav för att utveckla en applikation i Kubernetes

Faktum Àr att jag sjÀlv inte gillar sÄdana presentationer nÀr de görs, men det hÀr Àr ett sÄdant Àmne att nÀr jag förberedde den hÀr presentationen kom jag helt enkelt inte pÄ hur jag skulle organisera denna information annorlunda.

För i stort sett Àr denna information "ctrl+c, ctrl+v", frÄn bland annat vÄr Wiki i DevOps-sektionen, dÀr vi har skrivna krav pÄ utvecklare: "killar, sÄ att vi lanserar din applikation i Kubernetes, det borde vara sÄ hÀr."

Det Àr dÀrför presentationen visade sig vara en sÄ stor lista. FörlÄt. Jag ska försöka berÀtta sÄ mycket som möjligt sÄ att det inte blir trÄkigt om möjligt.

Vad vi ska titta pÄ nu:

  • dessa Ă€r, för det första, loggar (applikationsloggar?), vad ska man göra med dem i Kubernetes, vad man ska göra med dem, vad de ska vara;
  • vad man ska göra med konfigurationer i Kubernetes, vilka Ă€r de bĂ€sta och sĂ€msta sĂ€tten att konfigurera en applikation för Kubernetes;
  • LĂ„t oss prata om vad tillgĂ€nglighetskontroller Ă€r i allmĂ€nhet, hur de ska se ut;
  • lĂ„t oss prata om vad en graciös avstĂ€ngning Ă€r;
  • lĂ„t oss prata om resurser igen;
  • LĂ„t oss Ă„terigen beröra Ă€mnet datalagring;
  • och i slutet kommer jag att berĂ€tta vad termen för denna mystiska molnbaserade applikation Ă€r. Cloudnativeness, som ett adjektiv för denna term.

Loggar

Jag föreslÄr att man börjar med loggarna - med var dessa stockar mÄste skjutas in i Kubernetes. Nu har du startat en applikation i Kubernetes. Enligt klassikerna skrev tidigare applikationer alltid loggar nÄgonstans i en fil. DÄliga applikationer skrev loggar till en fil i hemkatalogen för utvecklaren som startade applikationen. Bra applikationer skrev loggar till en fil nÄgonstans i /var/log.

Krav för att utveckla en applikation i Kubernetes

Följaktligen hade bra administratörer dessutom vissa saker konfigurerade i sina infrastrukturer som dessa loggar kunde rotera - samma rsyslog, som tittar pÄ dessa loggar och nÀr nÄgot hÀnder med dem, det finns mÄnga av dem, den skapar sÀkerhetskopior, lÀgger loggar dÀr , raderar gamla filer, mer Àn en vecka, sex mÄnader och nÄgra till. I teorin borde vi ha bestÀmmelser sÄ att utrymmet pÄ produktionsservrarna (stridsservrarna?) inte tar slut bara för att applikationen skriver loggar. Och följaktligen stannade inte hela produktionen pÄ grund av stockarna.

NÀr vi flyttar till Kubernetes-vÀrlden och kör samma sak dÀr, Àr det första du kan uppmÀrksamma det faktum att mÀnniskor, nÀr de skrev loggar i en fil, fortsÀtter att skriva dem.

Det visar sig att om vi pratar om Kubernetes, Àr rÀtt stÀlle att skriva loggar nÄgonstans frÄn en dockningsbehÄllare helt enkelt att skriva dem frÄn applikationen till den sÄ kallade Stdout/Stderr, det vill sÀga operativsystemets standardutgÄngsströmmar, standardfel utgÄng . Detta Àr det mest korrekta, enklaste och mest logiska sÀttet att lÀgga loggar i princip i Docker och specifikt i Kubernetis. För om din applikation skriver loggar till Stdout/Stderr, Àr det upp till Docker och Kubernetes-tillÀgget att bestÀmma vad de ska göra med dessa loggar. Docker kommer som standard att bygga sina specialfiler i JSON-format.

HÀr uppstÄr frÄgan, vad ska du göra hÀrnÀst med dessa loggar? Det enklaste sÀttet Àr tydligt, vi har förmÄgan att göra kubectl logs och titta pÄ dessa loggar över dessa "pods". Men förmodligen Àr detta inte ett sÀrskilt bra alternativ - nÄgot annat mÄste göras med loggarna.

För nu, lÄt oss prata samtidigt, eftersom vi berörde Àmnet loggar, om en sÄdan sak som loggar ska se ut. Det vill sÀga, detta gÀller inte direkt för Kubernetes, men nÀr vi börjar fundera pÄ vad vi ska göra med loggar skulle det vara bra att tÀnka pÄ detta ocksÄ.

Vi behöver nĂ„got slags verktyg, pĂ„ ett vĂ€nskapligt sĂ€tt, som tar dessa loggar som vĂ„r hamnarbetare lĂ€gger in i sina filer och skickar dem nĂ„gonstans. I det stora hela brukar vi lansera nĂ„gon form av agent inne i Kubernetes i form av ett DaemonSet – en loggsamlare, som helt enkelt fĂ„r veta var loggarna som Docker samlar in finns. Och den hĂ€r insamlingsagenten tar dem helt enkelt, kanske till och med pĂ„ nĂ„got sĂ€tt analyserar dem pĂ„ vĂ€gen, kanske berikar dem med lite extra metainformation och, i slutĂ€ndan, skickar dem för lagring nĂ„gonstans. Variationer Ă€r redan möjliga dĂ€r. Det vanligaste Ă€r nog Elasticsearch, dĂ€r du kan lagra loggar och du kan bekvĂ€mt hĂ€mta dem dĂ€rifrĂ„n. Sedan, med hjĂ€lp av en begĂ€ran, med hjĂ€lp av Kibana, till exempel, bygga grafer baserade pĂ„ dem, skapa varningar baserade pĂ„ dem, och sĂ„ vidare.

Den viktigaste idén, jag vill upprepa det igen, Àr att inuti Docker, i synnerhet inuti Kubernetes, Àr det en mycket dÄlig idé att lagra dina loggar i en fil.

För det första Ă€r det svĂ„rt att fĂ„ in stockarna i behĂ„llaren i en fil. Du mĂ„ste först gĂ„ in i behĂ„llaren, köra dĂ€r och sedan titta pĂ„ loggarna. NĂ€sta punkt Ă€r att om du har loggar i en fil sĂ„ har behĂ„llarna oftast en minimalistisk miljö och det finns inga verktyg som vanligtvis behövs för normalt arbete med loggar. Begrav dem, titta pĂ„ dem, öppna dem i en textredigerare. NĂ€sta ögonblick Ă€r nĂ€r vi har loggar i en fil inuti en behĂ„llare, om den hĂ€r behĂ„llaren raderas, förstĂ„r du, kommer loggarna att dö tillsammans med den. Följaktligen innebĂ€r varje omstart av behĂ„llaren att det inte finns fler loggar. Återigen, dĂ„ligt alternativ.

Och den sista punkten Àr att inne i containrar har du vanligtvis din ansökan och det Àr allt - det Àr vanligtvis den enda processen som körs. Det talas inte alls om nÄgon process som skulle rotera filer med dina loggar. SÄ fort loggarna börjar skrivas till en fil betyder det att vi, ursÀkta, kommer att börja förlora produktionsservern. För det första Àr de svÄra att hitta, ingen spÄrar dem, plus att ingen kontrollerar dem - följaktligen vÀxer filen oÀndligt tills utrymmet pÄ servern helt enkelt tar slut. DÀrför sÀger jag igen att det Àr en dÄlig idé att logga in i Docker, sÀrskilt i Kubernetes, till en fil.

NĂ€sta punkt, hĂ€r vill jag prata om detta igen - eftersom vi berör Ă€mnet loggar skulle det vara bra att prata om hur stockar ska se ut för att göra det bekvĂ€mt att arbeta med dem. Ämnet Ă€r som sagt inte direkt relaterat till Kubernetes, men det relaterar vĂ€ldigt bra till Ă€mnet DevOps. PĂ„ Ă€mnet utvecklingskultur och vĂ€nskap mellan dessa tvĂ„ olika avdelningar - Dev och Ops, sĂ„ att alla Ă€r bekvĂ€ma.

Detta innebÀr att loggar helst bör skrivas i JSON-format idag. Om du har nÄgon egen obegriplig applikation, som skriver loggar i obegripliga format för att du sÀtter in nÄgon form av tryck eller liknande, dÄ Àr det dags att googla pÄ nÄgon form av ramverk, nÄgon form av omslag som lÄter dig implementera normal loggning; aktivera loggningsparametrar i JSON dÀr, eftersom JSON Àr ett enkelt format, Àr det enkelt att analysera det.

Om din JSON inte fungerar enligt vissa kriterier, ingen vet vad, sĂ„ skriv Ă„tminstone loggar i ett format som gĂ„r att tolka. HĂ€r Ă€r det snarare vĂ€rt att tĂ€nka pĂ„ det faktum att om du till exempel kör ett gĂ€ng containrar eller bara processer med nginx, och var och en har sina egna loggningsinstĂ€llningar, sĂ„ verkar det förmodligen vara vĂ€ldigt obekvĂ€mt för dig att analysera dem. För för varje ny nginx-instans mĂ„ste du skriva din egen parser, eftersom de skriver loggar pĂ„ olika sĂ€tt. Återigen var det förmodligen vĂ€rt att tĂ€nka pĂ„ att se till att alla dessa nginx-instanser hade samma loggningskonfiguration och skrev alla sina loggar absolut enhetligt. Detsamma gĂ€ller absolut alla applikationer.

I slutÀndan vill jag ocksÄ lÀgga brÀnsle pÄ elden för att helst bör man undvika loggar i flerradsformat. HÀr Àr grejen, om du nÄgonsin har arbetat med stockinsamlare, sÄ har du troligen sett vad de lovar dig, att de kan arbeta med flerradiga loggar, vet hur man samlar in dem, och sÄ vidare. I sjÀlva verket, enligt min mening, kan inte en enda samlare idag samla flerradiga loggar normalt, fullstÀndigt och utan fel. PÄ ett mÀnskligt sÀtt, sÄ att det Àr bekvÀmt och felfritt.

Krav för att utveckla en applikation i Kubernetes

Men stack trace Ă€r alltid flerradiga loggar och hur man undviker dem. FrĂ„gan hĂ€r Ă€r att en logg Ă€r en registrering av en hĂ€ndelse, och stactrace Ă€r egentligen inte en logg. Om vi ​​samlar in loggar och lĂ€gger dem nĂ„gonstans i Elasticsearch och sedan ritar grafer frĂ„n dem, bygger nĂ„gra rapporter om anvĂ€ndaraktivitet pĂ„ din sida, sĂ„ nĂ€r du fĂ„r en stackspĂ„rning betyder det att nĂ„got ovĂ€ntat hĂ€nder, en ohanterad situation i din applikation. Och det Ă€r vettigt att automatiskt ladda upp en stackspĂ„rning nĂ„gonstans till ett system som kan spĂ„ra dem.

Detta Àr programvara (samma Sentry) som Àr gjord speciellt för att fungera med stack trace. Det kan omedelbart skapa automatiserade uppgifter, tilldela dem till nÄgon, varna nÀr stacttraces intrÀffar, gruppera dessa stacttraces efter en typ, och sÄ vidare. I princip Àr det inte mycket meningsfullt att prata om stactraces nÀr vi pratar om stockar, eftersom det trots allt Àr olika saker med olika syften.

konfiguration

DÀrefter pratar vi om konfiguration i Kubernetes: vad man ska göra med den och hur applikationer inuti Kubernetes ska konfigureras. Generellt brukar jag sÀga att Docker inte handlar om containrar. Alla vet att Docker handlar om containrar, Àven de som inte har arbetat mycket med Docker. Jag upprepar, Docker handlar inte om containrar.

Docker, enligt min mening, handlar om standarder. Och det finns standarder för praktiskt taget allt: standarder för att bygga din applikation, standarder för att installera din applikation.

Krav för att utveckla en applikation i Kubernetes

Och den hÀr saken - vi anvÀnde den förut, den blev bara sÀrskilt populÀr med tillkomsten av behÄllare - den hÀr saken kallas ENV (miljö) variabler, det vill sÀga miljövariabler som finns i ditt operativsystem. Detta Àr generellt sett ett idealiskt sÀtt att konfigurera din applikation, för om du har applikationer i JAVA, Python, Go, Perl, Gud förbjude, och de alla kan lÀsa databasvÀrden, databasanvÀndaren, databasens lösenordsvariabler, sÄ Àr det idealiskt. Du har applikationer pÄ fyra olika sprÄk konfigurerade i databasplanen pÄ samma sÀtt. Det finns inga fler olika konfigurationer.

Allt kan konfigureras med ENV-variabler. NÀr vi pratar om Kubernetes finns det ett utmÀrkt sÀtt att deklarera ENV-variabler direkt i Deployment. Följaktligen, om vi talar om hemliga data, sÄ kan vi omedelbart skjuta hemlig data frÄn ENV-variabler (lösenord till databaser, etc.) till en hemlighet, skapa ett hemligt kluster och ange i ENV-beskrivningen i Deployment att vi inte direkt deklarerar vÀrdet pÄ denna variabel och vÀrdet pÄ denna databaslösenordsvariabel kommer att lÀsas frÄn hemligheten. Detta Àr Kubernetes standardbeteende. Och detta Àr det mest idealiska alternativet för att konfigurera dina applikationer. Bara pÄ kodnivÄ, Äterigen gÀller detta utvecklare. Om du Àr DevOps kan du frÄga: "Killar, snÀlla lÀr din applikation att lÀsa miljövariabler. Och vi kommer alla att vara glada."

Om alla i företaget lÀser samma namngivna miljövariabler, sÄ Àr det bra. SÄ att det inte hÀnder att vissa vÀntar pÄ postgres-databasen, andra vÀntar pÄ databasnamnet, andra vÀntar pÄ nÄgot annat, andra vÀntar pÄ en dbn av nÄgot slag, sÄ att det följaktligen blir enhetlighet.

Problemet kommer nÀr du har sÄ mÄnga miljövariabler att du bara öppnar Deployment - och det finns femhundra rader med miljövariabler. I det hÀr fallet har du helt enkelt vuxit ur miljövariabler - och du behöver inte lÀngre tortera dig sjÀlv. I det hÀr fallet skulle det vara vettigt att börja anvÀnda konfigurationer. Det vill sÀga trÀna din applikation att anvÀnda konfigurationer.

FrÄgan Àr bara att konfigurationer inte Àr vad du tror. Config.pi Àr inte en konfiguration som Àr bekvÀm att anvÀnda. Eller nÄgon config i ditt eget format, alternativt begÄvad - det Àr inte heller den config jag menar.

Det jag pratar om Àr konfiguration i acceptabla format, det vill sÀga den överlÀgset mest populÀra standarden Àr .yaml-standarden. Det Àr tydligt hur man lÀser det, det Àr lÀsbart för mÀnniskor, det Àr tydligt hur man lÀser det frÄn applikationen.

Följaktligen kan du förutom YAML Àven till exempel anvÀnda JSON, parsning Àr ungefÀr lika bekvÀmt som YAML nÀr det gÀller att lÀsa applikationskonfigurationen dÀrifrÄn. Det Àr mÀrkbart mer obekvÀmt för folk att lÀsa. Du kan prova formatet, a la ini. Det Àr ganska bekvÀmt att lÀsa, ur mÀnsklig synvinkel, men det kan vara obekvÀmt att bearbeta det automatiskt, i den meningen att om du nÄgonsin vill skapa dina egna konfigurationer, kan ini-formatet redan vara obekvÀmt att generera.

Men i vilket fall som helst, vilket format du Àn vÀljer, Àr poÀngen att det ur Kubernetes synvinkel Àr vÀldigt bekvÀmt. Du kan placera hela din konfiguration i Kubernetes, i ConfigMap. Och ta sedan den hÀr configmap och be den att monteras inuti din pod i nÄgon specifik katalog, dÀr din applikation kommer att lÀsa konfigurationen frÄn denna configmap som om det bara vore en fil. Detta Àr faktiskt vad som Àr bra att göra nÀr du har mÄnga konfigurationsalternativ i din applikation. Eller sÄ Àr det bara nÄgon form av komplex struktur, det finns hÀckning.

Om du har en configmap kan du mycket vÀl lÀra din applikation att till exempel automatiskt spÄra Àndringar i filen dÀr configmap Àr monterad, och Àven automatiskt ladda om din applikation nÀr konfigurationerna Àndras. Detta skulle i allmÀnhet vara ett idealiskt alternativ.

Återigen, jag har redan pratat om detta - hemlig information finns inte i configmap, hemlig information finns inte i variabler, hemlig information finns inte i hemligheter. DĂ€rifrĂ„n kopplar du denna hemliga information till diplomati. Vanligtvis lagrar vi alla beskrivningar av Kubernetes-objekt, distributioner, configmaps, tjĂ€nster i git. Att lĂ€gga lösenordet till databasen i git, Ă€ven om det Ă€r din git, som du har internt i företaget, Ă€r dĂ€rför en dĂ„lig idĂ©. För git kommer Ă„tminstone ihĂ„g allt och att helt enkelt ta bort lösenord dĂ€rifrĂ„n Ă€r inte sĂ„ lĂ€tt.

HĂ€lsokontroll

NÀsta punkt Àr det hÀr som kallas Health check. I allmÀnhet Àr en hÀlsokontroll helt enkelt att kontrollera att din applikation fungerar. Samtidigt pratar vi oftast om vissa webbapplikationer, för vilka det, ur hÀlsokontrollsynpunkt (det Àr bÀttre att inte översÀtta hÀr och lÀngre), kommer att vara en speciell URL, som de bearbetar som en standard brukar de göra /health.

NÀr vi kommer Ät den hÀr webbadressen sÀger vÄr applikation antingen "ja, okej, allt Àr bra med mig, 200" eller "nej, allt Àr inte bra med mig, ungefÀr 500." Följaktligen, om vÄr applikation inte Àr http, inte en webbapplikation, talar vi nu om nÄgon slags demon, vi kan ta reda pÄ hur man gör hÀlsokontroller. Dvs det Àr inte nödvÀndigt, om applikationen inte Àr http sÄ fungerar allt utan hÀlsokontroll och detta kan inte göras pÄ nÄgot sÀtt. Du kan med jÀmna mellanrum uppdatera viss information i filen, du kan komma med nÄgot speciellt kommando för din demon, som, daemon status, som kommer att sÀga "ja, allt Àr bra, demonen fungerar, den lever."

Vad Ă€r det för? Det första och mest uppenbara Ă€r nog varför det behövs en hĂ€lsokontroll – för att förstĂ„ att applikationen fungerar. Jag menar, det Ă€r bara dumt, nĂ€r det Ă€r uppe nu ser det ut som att det fungerar, sĂ„ du kan vara sĂ€ker pĂ„ att det fungerar. Och det visar sig att applikationen körs, behĂ„llaren körs, instansen fungerar, allt Ă€r bra - och sedan har anvĂ€ndarna redan stĂ€ngt av alla telefonnummer frĂ„n teknisk support och sagt "vad Ă€r du..., du somnade, ingenting fungerar.”

En hÀlsokontroll Àr bara ett sÄdant sÀtt att se frÄn anvÀndarens synvinkel att det fungerar. En av metoderna. LÄt oss uttrycka det sÄ hÀr. Ur Kubernetes synvinkel Àr detta ocksÄ ett sÀtt att förstÄ nÀr applikationen startar, eftersom vi förstÄr att det Àr skillnad pÄ nÀr behÄllaren lanserades, skapades och startade, och nÀr applikationen lanserades direkt i denna behÄllare. För om vi tar en genomsnittlig java-applikation och försöker starta den i dockan, sÄ kan den börja i fyrtio sekunder, eller till och med en minut, eller till och med tio, bra. I det hÀr fallet kan du Ätminstone knacka pÄ dess portar, det kommer inte att svara dÀr, det vill sÀga det Àr Ànnu inte redo att ta emot trafik.

Återigen, med hjĂ€lp av en hĂ€lsokontroll och med hjĂ€lp av det faktum att vi vĂ€nder oss hit, kan vi förstĂ„ i Kubernetes att inte bara behĂ„llaren har stigit i applikationen, utan sjĂ€lva applikationen har startat, den svarar redan pĂ„ hĂ€lsokontroll, vilket innebĂ€r att vi kan skicka trafik dit.

Krav för att utveckla en applikation i Kubernetes

Det jag pratar om nu kallas Readiness/Liveness-tester inom Kubernetes; följaktligen Àr vÄra beredskapstester ansvariga för tillgÀngligheten av applikationen i balansering. Det vill sÀga, om beredskapstester utförs i applikationen sÄ Àr allt ok, klienttrafiken gÄr till applikationen. Om beredskapstester inte utförs deltar helt enkelt inte applikationen, just den hÀr instansen deltar inte i balansering, den tas bort frÄn balansering, klienttrafik flyter inte. Följaktligen behövs Liveness-tester inom Kubernetes sÄ att om applikationen fastnar kan den startas om. Om liveness-testet inte fungerar för en applikation som deklareras i Kubernetes, sÄ tas inte applikationen bara bort frÄn balansering, den startas om.

Och hĂ€r Ă€r en viktig punkt som jag skulle vilja nĂ€mna: ur praktisk synvinkel anvĂ€nds beredskapstestet oftast oftare och behövs oftare Ă€n livlighetstestet. Det vill sĂ€ga att helt enkelt tanklöst deklarera bĂ„de beredskaps- och livlighetstester, eftersom Kubernetes kan göra det, och lĂ„t oss anvĂ€nda allt det kan göra, Ă€r inte en sĂ€rskilt bra idĂ©. Jag ska förklara varför. För punkt nummer tvĂ„ i testning Ă€r att det skulle vara en bra idĂ© att kontrollera den underliggande tjĂ€nsten i dina hĂ€lsokontroller. Det betyder att om du har en webbapplikation som ger ut en del information, som den i sin tur naturligtvis mĂ„ste ta nĂ„gonstans ifrĂ„n. I en databas till exempel. Tja, den sparar informationen som kommer in i detta REST API i samma databas. Sedan, om din hĂ€lsokontroll svarar helt enkelt som kontaktad slashhealth, sĂ€ger applikationen "200, okej, allt Ă€r bra", och samtidigt Ă€r din applikations databas otillgĂ€nglig, och hĂ€lsokontrollapplikationen sĂ€ger "200, okej, allt Ă€r bra ” – Det hĂ€r Ă€r en dĂ„lig hĂ€lsokontroll. Det Ă€r inte sĂ„ det ska fungera.

Det vill sÀga din ansökan, nÀr en förfrÄgan kommer till den /health, den svarar inte bara "200, ok", den gÄr först till till exempel databasen, försöker ansluta till den, gör nÄgot vÀldigt grundlÀggande dÀr, som att vÀlja en, kontrollerar bara att det finns en anslutning i databasen och du kan frÄga databasen. Om allt detta lyckades Àr svaret "200, ok." Om det inte lyckas stÄr det att det finns ett fel, databasen Àr inte tillgÀnglig.

DĂ€rför, i detta avseende, Ă„terkommer jag igen till beredskaps-/livetesterna - varför du med största sannolikhet behöver ett beredskapstest, men ett livhetstest Ă€r i frĂ„ga. För om du beskriver hĂ€lsokontroller precis som jag nyss sa, sĂ„ kommer det att visa sig att det inte Ă€r tillgĂ€ngligt i instansdelenĐČ ĐžĐ»Đž ŃĐŸ ĐČсДх instancei en databas till exempel. NĂ€r du deklarerade ett beredskapstest började vĂ„ra hĂ€lsokontroller misslyckas, och följaktligen stĂ€ngs alla applikationer frĂ„n vilka databasen inte Ă€r tillgĂ€nglig, de helt enkelt avstĂ€ngda frĂ„n balansering och "hĂ€nger" i sjĂ€lva verket bara i ett försummat tillstĂ„nd och vĂ€ntar pĂ„ att deras databaser ska arbete.

Om vi ​​har deklarerat ett livhetstest, tĂ€nk dig att vĂ„r databas har gĂ„tt sönder, och i din Kubernetes börjar hĂ€lften av allt att starta om eftersom livenesstestet misslyckas. Det betyder att du mĂ„ste starta om. Det hĂ€r Ă€r inte alls vad du vill, jag hade till och med personlig erfarenhet i praktiken. Vi hade en chattapplikation som skrevs i JS och matades in i en Mongo-databas. Och problemet var att det var i början av mitt arbete med Kubernetes, vi beskrev beredskapen, livligheten av tester pĂ„ principen att Kubernetes kan göra det, sĂ„ vi kommer att anvĂ€nda det. Följaktligen blev Mongo vid nĂ„got tillfĂ€lle lite "trĂ„kig" och provet började misslyckas. Följaktligen, enligt regntestet, började baljorna "döda".

Som du förstÄr, nÀr de "dödas", Àr detta en chatt, det vill sÀga det finns mÄnga kopplingar frÄn klienter som hÀnger pÄ den. De Àr ocksÄ "dödade" - nej, inte klienter, bara anslutningar - inte alla samtidigt, och pÄ grund av att de inte dödas samtidigt, vissa tidigare, vissa senare, börjar de inte samtidigt tid. Plus standard slumpmÀssigt, vi kan inte förutsÀga med millisekunders noggrannhet starttiden för applikationen varje gÄng, sÄ de gör det en instans i taget. En infospot reser sig, lÀggs till i balanseringen, alla klienter kommer dit, den klarar inte en sÄdan belastning, eftersom den Àr ensam, och grovt sett Àr det ett dussin av dem som jobbar dÀr, och det faller. NÀsta reser sig, hela lasset ligger pÄ honom, han faller ocksÄ. Tja, de hÀr fallen fortsÀtter bara att falla. Till slut, hur detta löstes - vi var bara tvungna att strikt stoppa anvÀndartrafiken till den hÀr applikationen, lÄta alla instanser stiga och sedan starta all anvÀndartrafik pÄ en gÄng sÄ att den redan var fördelad pÄ alla tio instanser.

Om det inte vore för att det hÀr livenesstestet tillkÀnnagavs, vilket skulle tvinga det hela att starta om, skulle applikationen ha klarat det bra. Men allt frÄn balansering Àr inaktiverat för oss, eftersom databaserna Àr otillgÀngliga och alla anvÀndare har "fallit av". Sedan, nÀr denna databas blir tillgÀnglig, ingÄr allt i balanseringen, men applikationer behöver inte starta om, och det finns ingen anledning att slösa tid och resurser pÄ detta. De Àr alla redan hÀr, de Àr redo för trafik, sÄ trafiken bara öppnar, allt Àr bra - applikationen Àr pÄ plats, allt fortsÀtter att fungera.

DÀrför Àr beredskaps- och livhetstest olika, dessutom kan man teoretiskt göra olika hÀlsokontroller, en typ radier, en typ liv till exempel och kolla olika saker. Under beredskapstester, kontrollera dina backends. Och pÄ ett livhetstest, till exempel, kontrollerar man inte ur synvinkeln att livenesstestet i allmÀnhet bara Àr en applikation som svarar, om den överhuvudtaget kan svara.

Eftersom livlighetstestet i stort sett Àr nÀr vi "fastnar". En oÀndlig loop har startat eller nÄgot annat - och inga fler förfrÄgningar behandlas. DÀrför Àr det vettigt att till och med separera dem - och implementera olika logik i dem.

AngÄende vad man behöver svara pÄ nÀr man har prov, nÀr man gör hÀlsokontroller. Det Àr bara riktigt jobbigt. De som Àr bekanta med detta kommer förmodligen att skratta - men seriöst, jag har sett tjÀnster i mitt liv som svarar "200" i XNUMX% av fallen. Det vill sÀga vem som Àr framgÄngsrik. Men samtidigt skriver de i sjÀlva svaret "ett sÄdant och sÄdant fel."

Det vill sÀga, svarsstatusen kommer till dig - allt Àr framgÄngsrikt. Men samtidigt mÄste du analysera kroppen, eftersom kroppen sÀger "förlÄt, begÀran slutade med ett fel" och detta Àr bara verkligheten. Jag sÄg det hÀr i verkligheten.

Och sÄ att vissa mÀnniskor inte tycker att det Àr roligt, och andra tycker att det Àr vÀldigt smÀrtsamt, Àr det fortfarande vÀrt att följa en enkel regel. I hÀlsokontroller, och i princip nÀr man arbetar med webbapplikationer.

Om allt gick bra, svara dĂ„ med det tvĂ„hundrade svaret. I princip kommer vilket tvĂ„hundradelssvar som helst att passa dig. Om du lĂ€ser raggy mycket bra och vet att vissa svarsstatusar skiljer sig frĂ„n andra, svara med lĂ€mpliga: 204, 5, 10, 15, vad som helst. Om det inte Ă€r sĂ€rskilt bra, dĂ„ bara "tvĂ„ noll noll." Om allt gĂ„r dĂ„ligt och hĂ€lsokontrollen inte svarar, svara dĂ„ med valfri femhundradel. Återigen, om du förstĂ„r hur du ska svara, hur olika svarsstatusar skiljer sig frĂ„n varandra. Om du inte förstĂ„r Ă€r 502 ditt alternativ att svara pĂ„ hĂ€lsokontroller om nĂ„got gĂ„r fel.

Det hĂ€r Ă€r en annan punkt, jag vill Ă„terkomma lite om att kontrollera de underliggande tjĂ€nsterna. Om du till exempel börjar kolla alla underliggande tjĂ€nster som stĂ„r bakom din ansökan – allt i stort. Vad vi fĂ„r ur mikrotjĂ€nstarkitekturens synvinkel har vi ett sĂ„dant koncept som "lĂ„g koppling" - det vill sĂ€ga nĂ€r dina tjĂ€nster Ă€r minimalt beroende av varandra. Om en av dem misslyckas kommer alla andra utan denna funktion helt enkelt att fortsĂ€tta att fungera. En del av funktionerna fungerar helt enkelt inte. Följaktligen, om du knyter alla hĂ€lsokontroller till varandra, kommer du att sluta med att en sak faller i infrastrukturen, och eftersom den föll, börjar alla hĂ€lsokontroller av alla tjĂ€nster ocksĂ„ misslyckas - och det finns mer infrastruktur i allmĂ€nhet för hela mikrotjĂ€nstarkitekturen nr. Allt blev mörkt dĂ€r.

DÀrför vill jag upprepa detta igen att du behöver kontrollera de underliggande tjÀnsterna, de utan vilka din ansökan i hundra procent av fallen inte kan göra sitt jobb. Det vill sÀga, det Àr logiskt att om du har ett REST API genom vilket anvÀndaren sparar till databasen eller hÀmtar frÄn databasen, sÄ kan du i frÄnvaro av en databas inte garantera arbete med dina anvÀndare.

Men om dina anvÀndare, nÀr du tar ut dem ur databasen, dessutom berikas med lite annan metadata, frÄn en annan backend, som du anger innan du skickar ett svar till frontend - och denna backend inte Àr tillgÀnglig, betyder det att du ger din svara utan nÄgon del av metadata.

DÀrefter har vi ocksÄ ett av de smÀrtsamma problemen nÀr vi startar applikationer.

Faktum Àr att detta inte bara gÀller Kubernetes i stort sett, det hÀnde sig att kulturen med nÄgon form av massutveckling och DevOps i synnerhet började spridas ungefÀr samtidigt som Kubernetes. DÀrför visar det sig i stort sett att du behöver stÀnga ner din applikation pÄ ett graciöst sÀtt utan Kubernetes. Redan innan Kubernetes gjorde folk detta, men med tillkomsten av Kubernetes började vi prata om det i massor.

Graciös avstÀngning

I allmĂ€nhet, vad Ă€r Graceful Shutdown och varför behövs det? Det hĂ€r handlar om nĂ€r din applikation kraschar av nĂ„gon anledning mĂ„ste du göra app stop – eller sĂ„ fĂ„r du till exempel en signal frĂ„n operativsystemet, din applikation mĂ„ste förstĂ„ det och göra nĂ„got Ă„t ​​det. Det vĂ€rsta scenariot Ă€r naturligtvis nĂ€r din ansökan fĂ„r en SIGTERM och Ă€r som "SIGTERM, lĂ„t oss hĂ€nga pĂ„, jobba, gör ingenting." Detta Ă€r ett rent dĂ„ligt alternativ.

Krav för att utveckla en applikation i Kubernetes

Ett nÀstan lika dÄligt alternativ Àr nÀr din applikation fÄr en SIGTERM och Àr som "de sa segterm, det betyder att vi slutar, jag har inte sett, jag kÀnner inte till nÄgra anvÀndarförfrÄgningar, jag vet inte vilken typ av förfrÄgningar jag jobbar pÄ just nu, sa de SIGTERM, det betyder att vi slutar " Detta Àr ocksÄ ett dÄligt alternativ.

Vilket alternativ Àr bra? Den första punkten Àr att ta hÀnsyn till slutförandet av operationer. Ett bra alternativ Àr att din server fortfarande tar hÀnsyn till vad den gör om den tar emot en SIGTERM.

SIGTERM Àr en mjuk avstÀngning, den Àr specialdesignad, den kan avlyssnas pÄ kodnivÄ, den kan bearbetas, sÀg att nu, vÀnta, vi kommer först att avsluta det arbete vi har, sedan kommer vi att avsluta.

Ur ett Kubernetes-perspektiv Àr det sÄ hÀr det ser ut. NÀr vi sÀger till en pod som körs i ett Kubernetes-kluster, "snÀlla sluta, gÄ ivÀg", eller en omstart sker, eller en uppdatering sker nÀr Kubernetes Äterskapar podarna, skickar Kubernetes precis samma SIGTERM-meddelande till podden, vÀntar pÄ lite tid, och , det hÀr Àr tiden som han vÀntar, den Àr ocksÄ konfigurerad, det finns en sÄdan speciell parameter i diplom och den kallas Graceful ShutdownTimeout. Som du förstÄr heter det inte sÄ för ingenting, och det Àr inte för inte som vi pratar om det nu.

DĂ€r kan vi specifikt sĂ€ga hur lĂ€nge vi behöver vĂ€nta mellan det att vi skickar SIGTERM till applikationen och nĂ€r vi förstĂ„r att applikationen verkar ha blivit galen för nĂ„got eller har "fastnat" och inte kommer att avslutas - och vi mĂ„ste skicka det SIGKILL, det vill sĂ€ga hĂ„rt slutföra sitt arbete. Det vill sĂ€ga, följaktligen har vi nĂ„gon form av demon igĂ„ng, den bearbetar operationer. Vi förstĂ„r att vĂ„ra operationer som demonen arbetar med i genomsnitt inte varar mer Ă€n 30 sekunder Ă„t gĂ„ngen. Följaktligen, nĂ€r SIGTERM anlĂ€nder förstĂ„r vi att vĂ„r demon högst kan sluta 30 sekunder efter SIGTERM. Vi skriver det till exempel 45 sekunder för sĂ€kerhets skull och sĂ€ger att SIGTERM. Efter det vĂ€ntar vi 45 sekunder. I teorin borde demonen under denna tid ha slutfört sitt arbete och tagit slut. Men om det plötsligt inte kunde, betyder det att det med största sannolikhet har fastnat – det behandlar inte lĂ€ngre vĂ„ra förfrĂ„gningar normalt. Och pĂ„ 45 sekunder kan du faktiskt sĂ€kert spika fast honom.

Och hÀr kan faktiskt Àven 2 aspekter beaktas. För det första, förstÄ att om du fick en förfrÄgan började du arbeta med den pÄ nÄgot sÀtt och gav inget svar till anvÀndaren, men du fick till exempel SIGTERM. Det Àr vettigt att förfina det och ge ett svar till anvÀndaren. Detta Àr punkt nummer ett i detta avseende. Punkt nummer tvÄ hÀr Àr att om du skriver din egen applikation, i allmÀnhet bygger arkitekturen pÄ ett sÄdant sÀtt att du fÄr en förfrÄgan om din applikation, sÄ börjar du lite arbete, börjar ladda ner filer nÄgonstans, laddar ner en databas och sÄnt. - Den dÀr. I allmÀnhet, din anvÀndare, din förfrÄgan hÀnger i en halvtimme och vÀntar pÄ att du ska svara honom - dÄ mÄste du troligen arbeta med arkitekturen. Det vill sÀga, ta bara hÀnsyn till sunt förnuft att om dina operationer Àr korta, sÄ Àr det vettigt att ignorera SIGTERM och modifiera det. Om dina operationer Àr lÄnga, Àr det ingen mening att ignorera SIGTERM i det hÀr fallet. Det Àr vettigt att göra om arkitekturen för att undvika sÄ lÄnga operationer. SÄ att anvÀndarna inte bara hÀnger och vÀntar. Jag vet inte, gör nÄgon form av websocket dÀr, gör reverse hooks som din server redan kommer att skicka till klienten, nÄgot annat, men tvinga inte anvÀndaren att hÀnga i en halvtimme och bara vÀnta pÄ en session tills du svara honom. För det Àr oförutsÀgbart var det kan gÄ sönder.

NÀr din ansökan avslutas bör du ange en lÀmplig exit-kod. Det vill sÀga, om din ansökan ombads att stÀnga, stoppa, och den kunde stoppa sig sjÀlv normalt, sÄ behöver du inte returnera nÄgon form av exit-kod 1,5,255 och sÄ vidare. Allt som inte Àr nollkod, Ätminstone i Linux-system, jag Àr sÀker pÄ detta, anses misslyckat. Dvs det anses att din ansökan i detta fall slutade med ett fel. Följaktligen, pÄ ett vÀnskapligt sÀtt, om din ansökan slutfördes utan ett fel, sÀger du 0 pÄ utgÄngen. Om din applikation misslyckas av nÄgon anledning sÀger du icke-0 i utgÄngen. Och du kan arbeta med denna information.

Och det sista alternativet. Det Àr dÄligt nÀr din anvÀndare skickar en förfrÄgan och hÀnger sig i en halvtimme medan du bearbetar den. Men generellt skulle jag ocksÄ vilja sÀga om vad som generellt Àr vÀrt det frÄn kundens sida. Det spelar ingen roll om du har en mobilapplikation, front-end, etc. Det Àr nödvÀndigt att ta hÀnsyn till att i allmÀnhet kan anvÀndarens session avslutas, vad som helst kan hÀnda. En förfrÄgan kan skickas, till exempel underbehandlad och inget svar returneras. Ditt grÀnssnitt eller din mobilapplikation - vilket grÀnssnitt som helst i allmÀnhet, lÄt oss uttrycka det sÄ - bör ta hÀnsyn till detta. Om du arbetar med websockets Àr detta i allmÀnhet den vÀrsta smÀrtan jag nÄgonsin har haft.

NÀr utvecklarna av vissa vanliga chattar inte vet det, visar det sig att webbsocket kan gÄ sönder. För dem, nÀr nÄgot hÀnder vid proxyn, Àndrar vi bara konfigurationen och den laddar om. Naturligtvis slits alla lÄnglivade sessioner i detta fall. Utvecklare kommer springande till oss och sÀger: "Gubbar, vad gör ni, chatten har gÄtt sönder för alla vÄra kunder!" Vi sÀger till dem: "Vad gör ni? Kan dina kunder inte Äteransluta? De sÀger: "Nej, vi behöver att sessionerna inte slits sönder." Kort sagt, detta Àr faktiskt nonsens. Kundsidan mÄste beaktas. Speciellt, som jag sÀger, med lÄnglivade sessioner som websockets kan den gÄ sönder och obemÀrkt för anvÀndaren mÄste du kunna installera om sÄdana sessioner. Och dÄ Àr allt perfekt.

Đ Đ”ŃŃƒŃ€ŃŃ‹

Egentligen, hĂ€r ska jag bara berĂ€tta en rak historia. Återigen frĂ„n verkliga livet. Det sjukaste jag nĂ„gonsin hört om resurser.

Resurser i det hÀr fallet, jag menar, nÄgon form av förfrÄgningar, grÀnser som du kan sÀtta pÄ poddar i dina Kubernetes-kluster. Det roligaste jag hörde frÄn en utvecklare... En av mina andra utvecklare pÄ en tidigare arbetsplats sa en gÄng: "Min applikation startar inte i klustret." Jag tittade för att se att det inte startade, men antingen passade det inte in i resurserna, eller sÄ hade de satt vÀldigt smÄ grÀnser. Kort sagt, applikationen kan inte starta pÄ grund av resurser. Jag sÀger: "Det kommer inte att starta pÄ grund av resurser, du bestÀmmer hur mycket du behöver och sÀtter ett adekvat vÀrde." Han sÀger: "Vilken typ av resurser?" Jag började förklara för honom att Kubernetes, grÀnser för förfrÄgningar och bla, bla, bla mÄste stÀllas. Mannen lyssnade i fem minuter, nickade och sa: "Jag kom hit för att jobba som utvecklare, jag vill inte veta nÄgot om nÄgra resurser. Jag kom hit för att skriva kod och det Àr allt." Det Àr sorgligt. Detta Àr ett vÀldigt trÄkigt koncept ur en utvecklares synvinkel. SÀrskilt i den moderna vÀrlden, sÄ att sÀga, av progressiva devops.

Varför behövs resurser överhuvudtaget? Det finns tvÄ typer av resurser i Kubernetes. Vissa kallas för förfrÄgningar, andra kallas grÀnser. Med resurser förstÄr vi att det i princip alltid bara finns tvÄ grundlÀggande begrÀnsningar. Det vill sÀga CPU-tidsgrÀnser och RAM-grÀnser för en behÄllare som körs i Kubernetes.

En grÀns sÀtter en övre grÀns för hur en resurs kan anvÀndas i din applikation. Det vill sÀga, följaktligen, om du sÀger 1 GB RAM i grÀnserna, kommer din applikation inte att kunna anvÀnda mer Àn 1 GB RAM. Och om han plötsligt vill och försöker göra detta, kommer en process som kallas oom killer, utan minne, det vill sÀga, att komma och döda din applikation - det vill sÀga, den kommer helt enkelt att starta om. Applikationer startar inte om baserat pÄ CPU. NÀr det gÀller CPU, om ett program försöker anvÀnda mycket, mer Àn vad som anges i grÀnserna, kommer CPU:n helt enkelt att vÀljas strikt. Detta leder inte till omstarter. Detta Àr grÀnsen - detta Àr den övre grÀnsen.

Och det finns en begÀran. En begÀran Àr hur Kubernetes förstÄr hur noderna i ditt Kubernetes-kluster Àr fyllda med applikationer. Det vill sÀga, en begÀran Àr ett slags commit av din ansökan. Det stÄr vad jag vill anvÀnda: "Jag skulle vilja att du reserverar sÄ mycket CPU och sÄ mycket minne Ät mig." SÄ enkel analogi. TÀnk om vi har en nod som har, jag vet inte, 8 processorer totalt. Och en pod kommer dit, vars förfrÄgningar sÀger 1 CPU, vilket betyder att noden har 7 CPU:er kvar. Det vill sÀga, följaktligen, sÄ snart 8 pods anlÀnder till denna nod, som var och en har 1 CPU i sina förfrÄgningar, har noden, som om frÄn Kubernetes synvinkel, slut pÄ CPU och fler pods med förfrÄgningar kan inte startas pÄ denna nod. Om alla noder tar slut pÄ CPU, kommer Kubernetes att börja sÀga att det inte finns nÄgra lÀmpliga noder i klustret för att köra dina pods eftersom CPU:n har tagit slut.

Varför behövs förfrÄgningar och varför utan förfrÄgningar, jag tror att det inte finns nÄgot behov av att lansera nÄgot i Kubernetes? LÄt oss förestÀlla oss en hypotetisk situation. Du startar din applikation utan förfrÄgningar, Kubernetes vet inte hur mycket av det du har, vilka noder du kan pusha den till. Tja, han trycker, knuffar, knuffar pÄ noderna. Vid nÄgot tillfÀlle kommer du att börja fÄ trafik till din applikation. Och en av applikationerna börjar plötsligt anvÀnda resurser upp till de grÀnser som den har enligt grÀnserna. Det visar sig att det finns en annan applikation i nÀrheten och den behöver ocksÄ resurser. Noden börjar faktiskt fÄ slut pÄ resurser, till exempel OP. Noden börjar faktiskt fÄ slut pÄ resurser, till exempel RAM (Random Access Memory). NÀr en nod fÄr slut pÄ ström slutar dockern först svara, sedan kuben och sedan operativsystemet. De kommer helt enkelt att bli medvetslösa och ALLT kommer definitivt att sluta fungera för dig. Det vill sÀga, detta kommer att leda till att din nod fastnar och du mÄste starta om den. Kort sagt, lÀget Àr inte sÀrskilt bra.

Och nÀr du har förfrÄgningar Àr grÀnserna inte sÀrskilt olika, Ätminstone inte mÄnga gÄnger mer Àn grÀnserna eller förfrÄgningarna, dÄ kan du ha en sÄdan normal, rationell fyllning av ansökningar över noderna i Kubernetes-kluster. Samtidigt Àr Kubernetes ungefÀr medveten om hur mycket av det man lÀgger var, hur mycket av det som anvÀnds var. Det vill sÀga, det Àr bara ett sÄdant ögonblick. Det Àr viktigt att förstÄ det. Och det Àr viktigt att kontrollera att detta indikeras.

Datalagring

VÄr nÀsta punkt handlar om datalagring. Vad ska man göra med dem och i allmÀnhet vad man ska göra med uthÄllighet i Kubernetes?

Jag tror, ​​Äterigen, inom vĂ„r KvĂ€llskola, det fanns ett Ă€mne om databasen i Kubernetes. Och det verkar för mig som att jag till och med ungefĂ€r vet vad dina kollegor sa till dig nĂ€r de frĂ„gade: "Är det möjligt att köra en databas i Kubernetes?" Av nĂ„gon anledning verkar det som om dina kollegor borde ha sagt till dig att om du stĂ€ller frĂ„gan om det Ă€r möjligt att köra en databas i Kubernetes, sĂ„ Ă€r det omöjligt.

Logiken hÀr Àr enkel. För sÀkerhets skull, jag ska förklara Ànnu en gÄng, om du Àr en riktigt cool kille som kan bygga ett ganska feltolerant system för distribuerad nÀtverkslagring, förstÄ hur man passar in en databas i det hÀr fallet, hur cloud native i behÄllare ska fungera i en databas i allmÀnhet. Troligtvis har du inga frÄgor om hur du kör det. Om du har en sÄdan frÄga, och du vill försÀkra dig om att det hela utspelar sig och stÄr rÀtt till döden i produktionen och aldrig faller, sÄ hÀnder det inte. Du kommer garanterat att skjuta dig sjÀlv i foten med detta tillvÀgagÄngssÀtt. SÄ det Àr bÀttre att lÄta bli.

Vad ska vi göra med den data som vÄr applikation skulle vilja lagra, nÄgra bilder som anvÀndare laddar upp, nÄgra saker som vÄr applikation genererar under driften, till exempel vid uppstart? Vad ska man göra med dem i Kubernetes?

I allmÀnhet, idealiskt, ja, naturligtvis, Àr Kubernetes mycket vÀl utformad och var i allmÀnhet tÀnkt för statslösa applikationer. Det vill sÀga för de applikationer som inte lagrar information alls. Detta Àr idealiskt.

Men det ideala alternativet finns naturligtvis inte alltid. Än sen dĂ„? Den första och enklaste punkten Ă€r att ta nĂ„gon form av S3, bara inte en hemmagjord, som ocksĂ„ Ă€r oklart hur den fungerar, utan frĂ„n nĂ„gon leverantör. En bra, normal leverantör - och lĂ€r din applikation att anvĂ€nda S3. Det vill sĂ€ga nĂ€r din anvĂ€ndare vill ladda upp en fil, sĂ€g "hĂ€r, snĂ€lla, ladda upp den till S3." NĂ€r han vill ta emot det, sĂ€g: "HĂ€r Ă€r en lĂ€nk till S3 tillbaka och ta den hĂ€rifrĂ„n." Detta Ă€r idealiskt.

Om det hÀr idealiska alternativet plötsligt av nÄgon anledning inte Àr lÀmpligt, du har en applikation som du inte skrev, du inte utvecklar, eller sÄ Àr det nÄgot slags hemskt arv, det kan inte anvÀnda S3-protokollet, utan mÄste fungera med lokala kataloger i lokala mappar. Ta nÄgot mer eller mindre enkelt, distribuera Kubernetes. Det vill sÀga att omedelbart fÀkta Ceph för nÄgra minimala uppgifter, förefaller det mig, Àr en dÄlig idé. För Ceph Àr förstÄs bra och moderiktig. Men om du inte riktigt förstÄr vad du gör, nÀr du vÀl har lagt nÄgot pÄ Ceph, kan du mycket enkelt och helt enkelt aldrig fÄ det dÀrifrÄn igen. Eftersom, som ni vet, lagrar Ceph data i sitt kluster i binÀr form, och inte i form av enkla filer. DÀrför, om plötsligt Ceph-klustret gÄr sönder, sÄ Àr det en fullstÀndig och hög sannolikhet att du aldrig kommer att fÄ din data dÀrifrÄn igen.

Vi ska ha en kurs om Ceph, det kan du bekanta dig med programmet och skicka in en ansökan.

DÀrför Àr det bÀttre att göra nÄgot enkelt som en NFS-server. Kubernetes kan arbeta med dem, du kan montera en katalog under en NFS-server - din applikation Àr precis som en lokal katalog. Samtidigt mÄste du förstÄs förstÄ att du Äterigen mÄste göra nÄgot med din NFS, du mÄste förstÄ att den ibland kan bli otillgÀnglig och övervÀga frÄgan om vad du kommer att göra i det hÀr fallet. Kanske borde sÀkerhetskopieras nÄgonstans pÄ en separat maskin.

NÀsta punkt jag pratade om Àr vad du ska göra om din applikation genererar nÄgra filer under drift. Till exempel, nÀr den startar, genererar den nÄgon statisk fil, som Àr baserad pÄ viss information som applikationen fÄr först vid starttillfÀllet. Vilket ögonblick. Om det inte finns mycket sÄdan data, behöver du inte bry dig alls, installera bara den hÀr applikationen för dig sjÀlv och arbeta. Den enda frÄgan hÀr Àr vad, titta. Mycket ofta, alla möjliga Àldre system, som WordPress och sÄ vidare, speciellt med modifierade nÄgon form av smarta plugins, smarta PHP-utvecklare, de vet ofta hur de ska göra det sÄ att de genererar nÄgon form av fil för sig sjÀlva. Följaktligen genererar en en fil, den andra genererar en andra fil. De Àr olika. Balansering sker i kundernas Kubernetes-kluster helt enkelt av en slump. Följaktligen visar det sig att de till exempel inte vet hur de ska samarbeta. Den ena ger en information, den andra ger anvÀndaren en annan information. Detta Àr nÄgot du bör undvika. Det vill sÀga, i Kubernetes kommer allt du lanserar garanterat att kunna fungera i flera instanser. Eftersom Kubernetes Àr en grej som rör sig. Följaktligen kan han flytta vad som helst, nÀr han vill, utan att frÄga nÄgon alls. DÀrför mÄste du rÀkna med detta. Allt som lanseras i en instans kommer förr eller senare att misslyckas. Ju fler reservationer du har, desto bÀttre. Men Äterigen, sÀger jag, om du har nÄgra sÄdana filer, dÄ kan du lÀgga dem direkt under dig, de vÀger en liten mÀngd. Om det finns lite fler av dem bör du förmodligen inte trycka in dem i behÄllaren.

Jag skulle rÄda dig att det finns en sÄdan underbar sak i Kubernetes, du kan anvÀnda volym. I synnerhet finns det en volym av typen tom dir. Det vill sÀga, det Àr bara sÄ att Kubernetes automatiskt skapar en katalog i sina tjÀnstkataloger pÄ servern dÀr du började. Och han kommer att ge det till dig sÄ att du kan anvÀnda det. Det finns bara en viktig punkt. Det vill sÀga, dina data kommer inte att lagras inuti behÄllaren, utan snarare pÄ den vÀrd som du kör pÄ. Dessutom kan Kubernetes kontrollera sÄdana tomma kataloger under normal konfiguration och kan kontrollera deras maximala storlek och inte tillÄta att den överskrids. Den enda poÀngen Àr att det du har skrivit i tom dir inte gÄr förlorat under omstarter av podden. Det vill sÀga, om din pod faller av misstag och reser sig igen, kommer informationen i den tomma katalogen inte att gÄ nÄgonstans. Han kan anvÀnda den igen vid en ny start - och det Àr bra. Om din pod lÀmnar nÄgonstans, sÄ kommer han naturligtvis att lÀmna utan data. Det vill sÀga, sÄ snart podden frÄn noden dÀr den lanserades med tom dir försvinner, raderas tom dir.

Vad mer Àr bra med tom dir? Den kan till exempel anvÀndas som en cache. LÄt oss förestÀlla oss att vÄr applikation genererar nÄgot i farten, ger det till anvÀndarna och gör det under lÄng tid. DÀrför genererar applikationen till exempel och ger den till anvÀndarna, och lagrar den samtidigt nÄgonstans, sÄ att nÀsta gÄng anvÀndaren kommer för samma sak kommer det att gÄ snabbare att ge den omedelbart genererad. Tom katalog kan uppmanas Kubernetes att skapa i minnet. Och dÀrmed kan dina cachar i allmÀnhet fungera blixtsnabbt - nÀr det gÀller diskÄtkomsthastighet. Det vill sÀga, du har en tom dir i minnet, i OS Àr den lagrad i minnet, men för dig, för anvÀndaren inuti podden, ser det ut som bara en lokal katalog. Du behöver inte appen för att specifikt lÀra ut nÄgon magi. Du tar bara direkt och lÀgger din fil i en katalog, men i sjÀlva verket i minnet pÄ operativsystemet. Detta Àr ocksÄ en mycket bekvÀm funktion nÀr det gÀller Kubernetes.

Vilka problem har Minio? Det största problemet med Minio Àr att för att den hÀr saken ska fungera mÄste den köras nÄgonstans, och det mÄste finnas nÄgot slags filsystem, det vill sÀga lagring. Och hÀr möter vi samma problem som Ceph har. Det vill sÀga att Minio mÄste lagra sina filer nÄgonstans. Det Àr helt enkelt ett HTTP-grÀnssnitt till dina filer. Funktionaliteten Àr dessutom klart sÀmre Àn hos Amazons S3. Tidigare kunde den inte auktorisera anvÀndaren korrekt. Nu kan den, sÄ vitt jag vet, redan skapa hinkar med olika behörigheter, men Äterigen, det verkar för mig som att huvudproblemet sÄ att sÀga Àr det underliggande lagringssystemet Ätminstone.

Hur pÄverkar Empty dir i minnet grÀnserna? PÄverkar inte grÀnserna pÄ nÄgot sÀtt. Det ligger i vÀrdens minne och inte i minnet av din behÄllare. Det vill sÀga, din behÄllare ser inte den tomma katalogen i minnet som en del av dess upptagna minne. VÀrden ser detta. Följaktligen, ja, ur kubernetes synvinkel, nÀr du börjar anvÀnda detta, skulle det vara bra att förstÄ att du Àgnar en del av ditt minne till tomma dir. Och dÀrför förstÄ att minnet kan ta slut inte bara pÄ grund av applikationer, utan ocksÄ för att nÄgon skriver till dessa tomma dirs.

Cloudnativeness

Och det sista underÀmnet Àr vad Cloudnative Àr. Varför behövs det? Cloudnativeness och sÄ vidare.

Det vill sÀga de applikationer som Àr kapabla och skrivna för att fungera i en modern molninfrastruktur. Men i sjÀlva verket har Cloudnative en annan sÄdan aspekt. Att detta inte bara Àr en applikation som tar hÀnsyn till alla krav som en modern molninfrastruktur stÀller, utan ocksÄ vet hur man arbetar med denna moderna molninfrastruktur, dra nytta av fördelarna och nackdelarna med att det fungerar i dessa moln. GÄ inte bara överbord och arbeta i molnen, utan dra nytta av fördelarna med att arbeta i molnet.

Krav för att utveckla en applikation i Kubernetes

LÄt oss bara ta Kubernetes som ett exempel. Din applikation körs i Kubernetes. Din applikation kan alltid, eller snarare administratörerna för din applikation, alltid skapa ett tjÀnstekonto. Det vill sÀga ett konto för auktorisering i Kubernetes sjÀlv pÄ sin server. LÀgg till nÄgra rÀttigheter som vi behöver dÀr. Och du kan komma Ät Kubernetes frÄn din applikation. Vad kan du göra pÄ det hÀr sÀttet? Till exempel, frÄn applikationen, ta emot data om var dina andra applikationer, andra liknande instanser finns, och tillsammans pÄ nÄgot sÀtt klustera ovanpÄ Kubernetes, om det finns ett sÄdant behov.

Återigen, vi hade bokstavligen ett fall nyligen. Vi har en kontrollant som övervakar kön. Och nĂ€r nĂ„gra nya uppgifter dyker upp i den hĂ€r kön gĂ„r den till Kubernetes - och inne i Kubernetes skapar den en ny pod. Ger denna pod en ny uppgift och inom ramen för denna pod utför podden uppgiften, skickar ett svar till kontrollenheten sjĂ€lv, och kontrollenheten gör sedan nĂ„got med denna information. Till exempel lĂ€gger den ihop en databas. Det vill sĂ€ga, Ă„terigen, detta Ă€r ett plus med det faktum att vĂ„r applikation körs i Kubernetes. Vi kan anvĂ€nda sjĂ€lva den inbyggda Kubernetes-funktionaliteten för att pĂ„ nĂ„got sĂ€tt utöka och göra funktionaliteten i vĂ„r applikation mer bekvĂ€m. Det vill sĂ€ga, dölj inte nĂ„gon form av magi om hur man startar en applikation, hur man startar en arbetare. I Kubernetes skickar du helt enkelt en förfrĂ„gan i appen om applikationen Ă€r skriven i Python.

Detsamma gĂ€ller om vi gĂ„r bortom Kubernetes. Vi har vĂ„ra Kubernetes igĂ„ng nĂ„gonstans - det Ă€r bra om det Ă€r i nĂ„got slags moln. Återigen, vi kan anvĂ€nda, och till och med bör, tror jag, anvĂ€nda funktionerna i sjĂ€lva molnet dĂ€r vi kör. FrĂ„n de elementĂ€ra saker som molnet ger oss. Balansering, det vill sĂ€ga vi kan skapa molnbalanserare och anvĂ€nda dem. Detta Ă€r en direkt fördel med vad vi kan anvĂ€nda. Eftersom molnbalansering, för det första, helt enkelt dumt tar bort ansvaret frĂ„n oss för hur det fungerar, hur det Ă€r konfigurerat. Dessutom Ă€r det vĂ€ldigt bekvĂ€mt, eftersom vanliga Kubernetes kan integreras med moln.

Detsamma gÀller skalning. Vanliga Kubernetes kan integreras med molnleverantörer. Vet hur man förstÄr att om klustret tar slut pÄ noder, det vill sÀga nodutrymmet har tagit slut, dÄ mÄste du lÀgga till - Kubernetes kommer sjÀlv att lÀgga till nya noder till ditt kluster och börja starta pods pÄ dem. Det vill sÀga nÀr din last kommer börjar antalet hÀrdar att öka. NÀr noderna i klustret tar slut för dessa pods, lanserar Kubernetes nya noder och följaktligen kan antalet pods fortfarande öka. Och det Àr vÀldigt bekvÀmt. Detta Àr en direkt möjlighet att skala klustret i farten. Inte sÀrskilt snabbt, i den meningen att det inte Àr en sekund, det Àr mer som en minut för att lÀgga till nya noder.

Men av min erfarenhet, igen, Àr det det coolaste jag nÄgonsin sett. NÀr Cloudnative-klustret skalade baserat pÄ tid pÄ dygnet. Det var en backend-tjÀnst som anvÀndes av personer i backoffice. Det vill sÀga, de kommer till jobbet klockan 9, börjar logga in i systemet, och följaktligen börjar Cloudnative-klustret, dÀr allt Àr igÄng, att svÀlla och lanserar nya pods sÄ att alla som kommer till jobbet kan arbeta med applikationen. NÀr de lÀmnar jobbet klockan 8 eller 6 mÀrker Kubernetes-klustren att ingen lÀngre anvÀnder programmet och börjar krympa. Besparingar pÄ upp till 30 procent garanteras. Det fungerade i Amazon vid den tiden; pÄ den tiden fanns det ingen i Ryssland som kunde göra det sÄ bra.

Jag ska sÀga dig rakt av, besparingarna Àr 30 procent helt enkelt för att vi anvÀnder Kubernetes och drar fördel av molnets möjligheter. Nu kan detta göras i Ryssland. Jag kommer inte att annonsera för nÄgon, naturligtvis, men lÄt oss bara sÀga att det finns leverantörer som kan göra detta, tillhandahÄlla det direkt ur lÄdan med en knapp.

Det finns en sista punkt som jag ocksÄ skulle vilja fÀsta er uppmÀrksamhet pÄ. För att din applikation, din infrastruktur ska vara Cloudnative, Àr det vettigt att Àntligen börja anpassa tillvÀgagÄngssÀttet som kallas Infrastructure as a Code. Det betyder att din applikation, eller snarare din infrastruktur, behövs pÄ exakt samma sÀtt som kod Beskriv din applikation, din affÀrslogik i form av kod. Och arbeta med den som kod, det vill sÀga testa den, rulla ut den, lagra den i git, applicera CICD pÄ den.

Och det Àr just detta som gör att du, för det första, alltid kan ha kontroll över din infrastruktur, att alltid förstÄ vilket tillstÄnd den Àr i. För det andra, undvik manuella operationer som orsakar fel. För det tredje, undvik helt enkelt det som kallas omsÀttning, nÀr du hela tiden behöver utföra samma manuella uppgifter. För det fjÀrde lÄter det dig ÄterhÀmta dig mycket snabbare i hÀndelse av ett fel. I Ryssland, varje gÄng jag pratar om detta, finns det alltid ett stort antal mÀnniskor som sÀger: "Ja, det Àr klart, men du har tillvÀgagÄngssÀtt, kort sagt, det finns inget behov av att fixa nÄgonting." Men det Àr sant. Om nÄgot Àr trasigt i din infrastruktur Àr det enklare ur Cloudnatives synvinkel och ur infrastrukturen som en kod, snarare Àn att fixa det, gÄ till servern, ta reda pÄ vad som Àr trasigt och fixa det. för att ta bort servern och skapa den igen. Och jag kommer att fÄ allt detta ÄterstÀllt.

Alla dessa frÄgor diskuteras mer ingÄende pÄ Kubernetes videokurser: Junior, Basic, Mega. Genom att följa lÀnken kan du bekanta dig med programmet och villkoren. Det bekvÀma Àr att du kan bemÀstra Kubernetes genom att studera hemifrÄn eller arbeta 1-2 timmar om dagen.

KĂ€lla: will.com

LĂ€gg en kommentar