För varje Kubernetes-resurs Ă€r det möjligt att stĂ€lla in tvĂ„ typer av krav â Requests och Limits. Den första beskriver de minimala kraven pĂ„ tillgĂ„ngen till fria resurser pĂ„ noden, som behövs för att starta en container eller pod, den andra sĂ€tter en strikt grĂ€ns för de resurser som Ă€r tillgĂ€ngliga för containern.
NÀr Kubernetes planerar en pod Àr det mycket viktigt att containrarna har tillrÀckligt med resurser för att fungera normalt. Om du planerar att distribuera en stor applikation pÄ en nod med begrÀnsade resurser, Àr det mycket möjligt att den inte kommer att fungera pÄ grund av att noden fÄr slut pÄ minne eller saknar processorkraft. I den hÀr artikeln kommer vi att undersöka hur man kan lösa problem med brist pÄ datorkraft genom att anvÀnda resursförfrÄgningar och begrÀnsningar.
Requests och Limits Àr mekanismer som Kubernetes anvÀnder för att hantera resurser som processor och minne. Requests Àr det som gör att containern garanterat fÄr den begÀrda resursen. Om en container begÀr en resurs kommer Kubernetes endast att schemalÀgga den pÄ den nod som kan tillhandahÄlla den. BegrÀnsningar Limits kontrollerar att resurserna som begÀrs av containern aldrig överstiger ett visst vÀrde.

En container kan öka berĂ€kningskraften endast upp till en viss grĂ€ns, efter vilken den kommer att begrĂ€nsas. LĂ„t oss titta pĂ„ hur detta fungerar. SĂ„, det finns tvĂ„ typer av resurser â processor och minne. Kubernetes schemalĂ€ggare anvĂ€nder data om dessa resurser för att ta reda pĂ„ var du ska köra dina pods. En typisk resurs specification för en pod ser ut sĂ„ hĂ€r.

Varje container i en pod kan stÀlla in sina egna krav och begrÀnsningar, allt detta Àr additivt. CPU-resurser anges i millikÀrnor. Om din container krÀver tvÄ fulla kÀrnor för att köra, anger du vÀrdet 2000m. Om containment endast behöver kraften frÄn 1/4 kÀrna, kommer vÀrdet att vara 250m. TÀnk pÄ att om du anger en resursallokering som Àr högre Àn antalet kÀrnor i den största noden, kommer din pod inte att schemalÀggas överhuvudtaget. En liknande situation uppstÄr om du har en pod som krÀver fyra kÀrnor, medan Kubernetes-klustret endast bestÄr av tvÄ huvud virtuella maskiner.
Om inte din applikation Àr specifikt utvecklad för att utnyttja fördelarna med flera kÀrnor (exempelvis komplicerade vetenskapliga berÀkningar och databashantering), Àr det bÀsta praxis att stÀlla in CPU-requests pÄ 1 eller lÀgre, och sedan köra fler repliker för skalbarhet. Detta beslut ger systemet större flexibilitet och pÄlitlighet.
NÀr det kommer till begrÀnsningar av CPU blir allt mer intressant eftersom det anses vara en komprimerbar resurs. Om din applikation börjar nÀrma sig grÀnsen för CPU-kraft, kommer Kubernetes att börja dÀmpa din container med hjÀlp av CPU Throttling - en sÀnkning av processorfrekvensen. Det innebÀr att processorn kommer att begrÀnsas artificiellt, vilket kan ge applikationen en potentiellt sÀmre prestanda, men processen kommer inte att stoppas eller avslutas.
Minne resurser anges i byte. Vanligtvis mÀts vÀrdet i instÀllningarna i mebibyte (MiB), men du kan ange vilket vÀrde som helst, frÄn byte till petabyte. HÀr gÀller samma situation som för CPU - om du begÀr mer minne Àn mÀngden minne i dina noder, kommer körningen av denna pod inte att schemalÀggas. Men till skillnad frÄn CPU-resurser kan minne inte komprimeras, eftersom det inte finns nÄgot sÀtt att begrÀnsa dess anvÀndning. DÀrför kommer körningen av containern att stoppas sÄ snart den överskrider det tilldelade minnet.

Det Àr viktigt att komma ihÄg att du inte kan konfigurera begÀrningar som överskrider de resurser som dina noder kan tillhandahÄlla. Specifikationerna för gemensamma resurser för GKE-virtuella maskiner finns i lÀnkarna som finns under denna video.
I en perfekt vÀrld skulle standardinstÀllningarna för containern vara tillrÀckliga för att arbetsflödena ska flyta smidigt. Men verkligheten Àr en annan; mÀnniskor kan lÀtt glömma att konfigurera resursanvÀndning eller sÄ kan hackare stÀlla in begÀrningar och begrÀnsningar som överstiger infrastrukturens verkliga kapacitet. För att förhindra sÄdana scenarier kan du konfigurera resurskvoter med ResourceQuota och begrÀnsningsintervall med LimitRange.
Efter att namnrymder har skapats kan de blockeras med hjÀlp av kvoter. Till exempel, om du har namnrymderna prod och dev, anvÀnds en mall dÀr kvoter för produktion helt saknas medan kvoter för utveckling Àr mycket strikta. Detta gör att prod, vid en plötslig trafikökning, kan ta hela den tillgÀngliga resursen och helt blockera dev.
Resurskvoten kan se ut pĂ„ följande sĂ€tt. I det hĂ€r exemplet finns det 4 sektioner â det Ă€r de 4 nedersta raderna av kod.

LÄt oss titta pÄ var och en av dem. Requests.cpu Àr det maximala antalet sammanlagda begÀrningar om processorkraft som kan komma frÄn alla containrar i namnrymden. I det hÀr exemplet kan du ha 50 containrar med begÀrningar pÄ 10m, fem containrar med begÀrningar pÄ 100m, eller bara en container med en begÀran pÄ 500m. SÄ lÀnge det totala antalet requests.cpu för namnrymden Àr mindre Àn 500m kommer allt att fungera.
BegÀrd minne, requests.memory, Àr den maximala mÀngden sammanlagda begÀrningar om minne som alla containrar i namnrymden kan ha. Som i föregÄende fall kan du ha 50 containrar med 2 MiB, fem containrar med 20 MiB, eller en enda container med 100 MiB, sÄ lÀnge den totala mÀngden begÀrt minne i namnrymden Àr mindre Àn 100 mebibyte.
Limits.cpu Àr det maximala sammanlagda vÀrdet av processorkraft som alla containrar i namnrymden kan anvÀnda. Det kan betraktas som en grÀns för begÀrningar om processorkraft.
Slutligen anger limits.memory det maximala beloppet av total minne som alla containrar inom namnutrymmet kan anvÀnda. Detta Àr en begrÀnsning för det totala minnesanvÀndandet.
SĂ„, som standard arbetar containrar i Kubernetes-klustret med obegrĂ€nsade berĂ€kningsresurser. Genom resurskvoter kan klusteradministratörer begrĂ€nsa resursanvĂ€ndningen och skapandet baserat pĂ„ namnutrymmet. Inom namnutrymmet kan en pod eller container anvĂ€nda sĂ„ mycket CPU och minne som definieras av resurskvoten för namnutrymmet. Det finns dock en oro för att en pod eller container kan monopolera alla tillgĂ€ngliga resurser. För att förhindra en sĂ„dan situation anvĂ€nds limit Range â en policy för resursfördelningsbegrĂ€nsning (för pods eller containrar) inom namnutrymmet.
Limit Range tillhandahÄller begrÀnsningar som kan:
- sÀkerstÀlla minimalt och maximalt utnyttjande av berÀkningsresurser för varje pod eller container inom namnutrymmet;
- tvinga fram minimum och maximum Storage Request för varje PersistentVolumeClaim inom namnutrymmet;
- tvinga fram förhÄllandet mellan Request och Limit för en resurs inom namnutrymmet;
- stÀlla in standard Requests/Limits för berÀkningsresurser inom namnutrymmet och automatiskt införa dem i containrar under körning.
SÄledes kan du skapa en limit Range i ditt namnutrymme. Till skillnad frÄn kvoten, som gÀller för hela namnutrymmet, anvÀnds Limit Range för vissa containrar. Detta kan förhindra att anvÀndare skapar mycket smÄ eller Ä andra sidan, gigantiska containrar inom namnutrymmet. Limit Range kan se ut sÄ hÀr.

Liksom i det tidigare fallet finns hÀr fyra sektioner. LÄt oss titta pÄ var och en.
I avsnittet default stÀlls standardbegrÀnsningar för containern i podden. Om du anger dessa vÀrden i limit range, kommer alla containrar för vilka dessa vÀrden inte har angetts uttryckligen att följa standardvÀrdena.
I avsnittet defaultRequest stÀlls standardförfrÄgningar in för containern i podden. à terigen, om du sÀtter dessa vÀrden inom det maximala intervallet kommer alla containrar som inte explicit har dessa parametrar angivna att anvÀnda dessa vÀrden som standard.
I avsnittet max anges de maximala begrÀnsningar som kan stÀllas in för containern i podden. VÀrdena i avsnittet default och begrÀnsningar för containern kan inte stÀllas in högre Àn denna grÀns. Det Àr viktigt att notera att om ett max-vÀrde Àr angivet och avsnittet default saknas, blir max-vÀrdet standardvÀrdet.
I avsnittet min anges de minimala förfrÄgningarna som kan stÀllas in för containern i podden. VÀrdena i avsnittet default och förfrÄgningar för containern kan inte stÀllas in under denna grÀns.
Det Àr Äterigen viktigt att notera att om detta vÀrde Àr angivet och default-vÀrdet saknas, blir det minimi-vÀrdet standardförfrÄgan.
I slutÀndan anvÀnds dessa resursförfrÄgningar av Kubernetes schemalÀggare för att köra dina arbetsbelastningar. För att du ska kunna konfigurera dina containrar korrekt Àr det mycket viktigt att förstÄ hur detta fungerar. LÄt oss sÀga att du vill köra flera moduler i din kluster. Förutsatt att pod-specifikationerna Àr giltiga kommer Kubernetes schemalÀggare att anvÀnda cyklisk belastningsutjÀmning för att vÀlja en nod för att utföra arbetsbelastningen.

Kubernetes kommer att kontrollera om Node 1 har tillrÀckligt med resurser för att hantera förfrÄgningarna frÄn containrarna i podden, och om inte, gÄr den vidare till nÀsta nod. Om ingen av noderna i systemet kan tillfredsstÀlla förfrÄgningarna, kommer poddarna att gÄ in i vÀntande tillstÄnd. Med funktioner som autoskalning av noder i Google Kubernetes Engine (GKE) kan GKE automatiskt identifiera det vÀntande tillstÄndet och skapa fler extra noder.
Om det senare uppstÄr överflöd av noder, kommer autoskalningsfunktionen att minska antalet för att spara pengar. Det Àr dÀrför Kubernetes planerar poddar baserat pÄ förfrÄgningar. Men grÀnsen kan vara högre Àn förfrÄgningarna, och i vissa fall kan en nod faktiskt uttömma resurser. Vi kallar detta tillstÄnd för överkommittment-tillstÄnd.

Som jag redan nÀmnt, nÀr det gÀller processorer kommer Kubernetes att börja begrÀnsa pods. Varje pod fÄr sÄ mycket som den har begÀrt, men om den inte nÄr sin grÀns, kommer throttling att tillÀmpas.
NÀr det kommer till minnesresurser mÄste Kubernetes ta beslut om vilka pods som ska tas bort och vilka som ska behÄllas, tills ni frigör systemresurser; annars kollapsar hela systemet.
LĂ„t oss förestĂ€lla oss ett scenario dĂ€r ni har en maskin som har nĂ„tt sitt minnesgrĂ€ns â hur kommer Kubernetes att agera dĂ„?
Kubernetes kommer att leta efter pods som anvÀnder mer resurser Àn de har begÀrt. SÄ om era containrar överhuvudtaget inte har nÄgra begÀrningar (Requests), betyder det att de per standard anvÀnder mer Àn de har begÀrt, helt enkelt för att de inte har begÀrt nÄgot! SÄdana containrar blir de frÀmsta kandidaterna för avstÀngning. Följande kandidater Àr containrar som har uppfyllt alla sina begÀrningar men fortfarande ligger under den maximala grÀnsen.
Om Kubernetes hittar nÄgra pods som har överskridit sina begÀrningar, kommer de att sorteras efter prioritet och sedan kommer de med lÀgst prioritet att tas bort. Om alla pods har samma prioritet kommer Kubernetes att stoppa de pods som har överskridit sina begÀrningar mer Àn de andra.
I mycket sÀllsynta fall kan Kubernetes avbryta pods som fortfarande ligger inom sina begÀrningar. Detta kan hÀnda nÀr kritiska systemkomponenter, som Kubelet-agenten eller Docker, börjar anvÀnda mer resurser Àn vad som var reserverat för dem.
SÄ i början av arbetet för smÄ företag kan en Kubernetes-kluster fungera utmÀrkt utan att stÀlla in resursbegÀrningar och begrÀnsningar, men nÀr era team och projekt börjar vÀxa, riskerar ni att stöta pÄ problem pÄ detta omrÄde. Att lÀgga till begÀrningar och begrÀnsningar i era moduler och namnrymder krÀver vÀldigt lite ytterligare insats och kan spara er frÄn mycket besvÀr.

Lite reklam đ
Tack för att ni stannar kvar hos oss. Gillar ni vÄra artiklar? Vill ni se fler intressanta material? Stöd oss genom att göra en bestÀllning eller rekommendera oss till era vÀnner, , en unik motsvarighet till entry-level servrar som vi har skapat för er: (alternativ med RAID1 och RAID10 finns tillgÀngliga, upp till 24 kÀrnor och upp till 40GB DDR4).
Dell R730xd Ă€r tvĂ„ gĂ„nger billigare i datacentret Equinix Tier IV i Amsterdam? Bara hos oss i NederlĂ€nderna! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â frĂ„n $99! LĂ€s om
KĂ€lla: habr.com
