Kā piekļūt Kubernetes Pod resursiem

Kā piekļūt Kubernetes Pod resursiemTohada balva

Sākot darbu ar Kubernetes, parasti aizmirst par konteinera resursu iestatÄ«Å”anu. Å ajā brÄ«dÄ« pietiek ar to, lai nodroÅ”inātu Docker attēla darbÄ«bu un to var izvietot Kubernetes klasterÄ«.

Taču vēlāk lietojumprogramma ir jāizvieto ražoÅ”anas klasterÄ« kopā ar citām lietojumprogrammām. Lai to izdarÄ«tu, jums ir jāpieŔķir resursi konteineram un jāpārliecinās, vai to ir pietiekami daudz, lai lietojumprogramma tiktu iestatÄ«ta un darbotos, un vai citām darbojoŔām lietojumprogrammām nebÅ«s problēmu.

Komanda Kubernetes aaS no Mail.ru iztulkojis rakstu par konteineru resursiem (CPU un MEM), pieprasījumiem un resursu ierobežojumiem. Jūs uzzināsit par Ŕo iestatījumu priekŔrocībām un to, kas notiks, ja tos neiestatīsit.

SkaitļoŔanas resursi

Mums ir divu veidu resursi ar Ŕādām vienībām:

  • Centrālais procesors (CPU) - serdeņi;
  • Atmiņa (MEM) - baiti.

Katram konteineram ir norādīti resursi. Nākamajā Pod YAML failā jūs redzēsit resursu sadaļu, kas satur pieprasītos un ierobežotos resursus:

  • Requested Pod Resources = visu konteineru pieprasÄ«to resursu summa;
  • Pod resursu limits = visu Pod resursu limitu summa.

apiVersion: v1
kind: Pod
metadata:
  name: backend-pod-name
  labels:
    application: backend
spec:
  containers:
    ā€” name: main-container
      image: my-backend
      tag: v1
      ports:
      ā€” containerPort: 8080
      resources:
        requests:
          cpu: 0.2 # REQUESTED CPU: 200m cores
          memory: "1Gi" # REQUESTED MEM: 1Gi
        limits:
          cpu: 1 # MAX CPU USAGE: 1 core
          memory: "1Gi" # MAX MEM USAGE:  1Gi
    ā€” name: other-container
      image: other-app
      tag: v1
      ports:
      ā€” containerPort: 8000
      resources:
        requests:
          cpu: "200m" # REQUESTED CPU: 200m cores
          memory: "0.5Gi" # REQUESTED MEM: 0.5Gi
        limits:
          cpu: 1 # MAX CPU USAGE: 1 core
          memory: "1Gi" # MAX MEM USAGE:  1Gi

Pieprasīto un ierobežoto resursu piemērs

Lauks resources.requested no specifikācijas Pod ir viens no elementiem, kas tiek izmantots, lai atrastu vēlamo mezglu. JÅ«s jau varat plānot Pod izvietoÅ”anu tam. Kā atrast piemērotu mezglu?

Kubernetes sastāv no vairākiem komponentiem, tostarp galvenā mezgla vai galvenā mezgla (Kubernetes vadības plakne). Galvenajam mezglam ir vairāki procesi: kube-apiserver, kube-controller-manager un kube-plānotājs.

Kube plānotāja process ir atbildÄ«gs par jaunizveidoto podziņu pārskatÄ«Å”anu un iespējamo darbinieku mezglu atraÅ”anu, kas atbilst visiem apkopoÅ”anas pieprasÄ«jumiem, tostarp pieprasÄ«to resursu skaitam. Kube-plānotāja atrasto mezglu saraksts ir sakārtots. Pods ir ieplānots mezglā ar augstākajiem rādÄ«tājiem.

Kā piekļūt Kubernetes Pod resursiemKur tiks novietots purpursarkanais pods?

Attēlā redzams, ka kube plānotājam ir jāieplāno jauns purpursarkans Pod. Kubernetes klasterÄ« ir divi mezgli: A un B. Kā redzat, kube plānotājs nevar ieplānot Pod mezglā A ā€” pieejamie (nepieprasÄ«tie) resursi neatbilst purpursarkanā Pod pieprasÄ«jumiem. Tātad purpursarkanā Pod pieprasÄ«tā 1 GB atmiņa neietilps mezglā A, jo pieejamā atmiņa ir 0,5 GB. Bet mezglam B ir pietiekami daudz resursu. Rezultātā kube plānotājs nolemj, ka purpursarkanā Pod galamērÄ·is ir mezgls B.

Tagad mēs zinām, kā pieprasītie resursi ietekmē mezgla izvēli, lai palaistu Pod. Bet kāda ir robežresursu ietekme?

Resursu ierobežojums ir robeža, kuru CPU/MEM nevar pārkāpt. Tomēr CPU resurss ir elastÄ«gs, tāpēc konteineri, kas sasniedz CPU ierobežojumus, neizraisÄ«s Pod izieÅ”anu. Tā vietā tiks sākta CPU drosele. Ja tiek sasniegts MEM lietoÅ”anas ierobežojums, konteiners tiks apturēts OOM-Killer dēļ un tiks restartēts, ja to atļauj RestartPolicy iestatÄ«jums.

Detalizēti pieprasītie un maksimālie resursi

Kā piekļūt Kubernetes Pod resursiemResursu komunikācija starp Docker un Kubernetes

Labākais veids, kā izskaidrot, kā darbojas resursu pieprasÄ«jumi un resursu ierobežojumi, ir iepazÄ«stināt Kubernetes un Docker attiecÄ«bas. AugŔējā attēlā varat redzēt, kā ir saistÄ«ti Kubernetes lauki un Docker startÄ“Å”anas karodziņi.

Atmiņa: pieprasījums un ierobežojumi

containers:
...
 resources:
   requests:
     memory: "0.5Gi"
   limits:
     memory: "1Gi"

Kā minēts iepriekÅ”, atmiņa tiek mērÄ«ta baitos. Balstoties uz Kubernetes dokumentācija, mēs varam norādÄ«t atmiņu kā skaitli. Parasti tas ir vesels skaitlis, piemēram, 2678 - tas ir, 2678 baiti. Varat arÄ« izmantot sufiksus G Šø Gi, galvenais ir atcerēties, ka tie nav lÄ«dzvērtÄ«gi. Pirmais ir decimāls, bet otrais ir binārs. Tāpat kā piemērs, kas minēts k8s dokumentācijā: 128974848, 129e6, 129M, 123Mi - tie ir praktiski lÄ«dzvērtÄ«gi.

Kubernetes opcija limits.memory atbilst karogam --memory no Docker. GadÄ«jumā, ja request.memory Docker nav bultiņas, jo Docker neizmanto Å”o lauku. JÅ«s varat jautāt, vai tas vispār ir vajadzÄ«gs? Jā vajag. Kā jau teicu iepriekÅ”, Kubernetes laukumam ir nozÄ«me. Pamatojoties uz tajā iegÅ«to informāciju, kube plānotājs izlemj, kuram mezglam plānot Pod.

Kas notiek, ja pieprasījumam iestatāt nepietiekami daudz atmiņas?

Ja konteiners ir sasniedzis pieprasītās atmiņas robežas, tad Pod tiek ievietots Pod grupā, kas apstājas, ja mezglā nav pietiekami daudz atmiņas.

Kas notiek, ja iestatāt pārāk zemu atmiņas ierobežojumu?

Ja konteiners pārsniedz atmiņas ierobežojumu, tas tiks pārtraukts OOM-Killed dēļ. Un tiks restartēts, ja iespējams, pamatojoties uz RestartPolicy, kur ir noklusējuma vērtība Always.

Kas notiek, ja nenorādīsit pieprasīto atmiņu?

Kubernetes izmantos robežvērtību un iestatīs to kā noklusējuma vērtību.

Kas var notikt, ja nenorādīsit atmiņas ierobežojumu?

Konteineram nav ierobežojumu; tas var izmantot tik daudz atmiņas, cik vēlas. Ja viņŔ sāks izmantot visu pieejamo mezgla atmiņu, OOM viņu nogalinās. Pēc tam konteiners tiks restartēts, ja iespējams, pamatojoties uz RestartPolicy.

Kas notiks, ja nenorādīsit atmiņas ierobežojumus?

Å is ir sliktākais scenārijs: plānotājs nezina, cik resursu konteineram ir nepiecieÅ”ams, un tas var radÄ«t nopietnas problēmas mezglā. Å ajā gadÄ«jumā bÅ«tu jauki, ja nosaukumvietai bÅ«tu noklusējuma ierobežojumi (ko nosaka LimitRange). Nav noklusējuma ierobežojumu - Pod nav ierobežojumu, tas var izmantot tik daudz atmiņas, cik vēlas.

Ja pieprasītā atmiņa ir lielāka, nekā mezgls var piedāvāt, Pod netiks ieplānots. Ir svarīgi to atcerēties Requests.memory - nav minimālā vērtība. Šis ir apraksts par atmiņas apjomu, kas ir pietiekams, lai konteiners darbotos nepārtraukti.

Parasti ir ieteicams iestatÄ«t tādu paÅ”u vērtÄ«bu request.memory Šø limit.memory. Tas nodroÅ”ina, ka Kubernetes neplānos Pod mezglā, kuram ir pietiekami daudz atmiņas, lai palaistu Pod, bet nepietiek, lai to palaistu. Ņemiet vērā: Kubernetes Pod plānoÅ”anā tiek ņemta vērā tikai requests.memoryUn limits.memory neņem vērā.

CPU: pieprasījums un ierobežojums

containers:
...
 resources:
   requests:
     cpu: 1
   limits:
     cpu: "1200m"

Ar CPU viss ir nedaudz sarežģītāk. Atgriežoties pie Kubernetes un Docker attiecību attēla, to var redzēt request.cpu atbilst --cpu-shares, tā kā limit.cpu atbilst karogam cpus programmā Docker.

Kubernetes pieprasÄ«tais CPU tiek reizināts ar 1024 ā€” CPU ciklu proporciju. Ja vēlaties pieprasÄ«t 1 pilnu kodolu, jums tas ir jāpievieno cpu: 1kā parādÄ«ts iepriekÅ”.

Pilna kodola pieprasÄ«Å”ana (proporcija = 1024) nenozÄ«mē, ka konteiners to saņems. Ja jÅ«su resursdatoram ir tikai viens kodols un jÅ«s izmantojat vairāk nekā vienu konteineru, visiem konteineriem ir jāsadala pieejamais CPU. Kā tas notiek? ApskatÄ«sim attēlu.

Kā piekļūt Kubernetes Pod resursiem
CPU pieprasÄ«jums ā€” viena kodola sistēma

Iedomāsimies, ka jums ir viena kodola resursdatora sistēma, kurā darbojas konteineri. Mamma (Kubernetes) izcepa pÄ«rāgu (CPU) un vēlas sadalÄ«t starp bērniem (traukiem). TrÄ«s bērni vēlas veselu pÄ«rāgu (proporcija = 1024), vēl viens bērns vēlas puspÄ«rāgu (512). Mamma vēlas bÅ«t godÄ«ga un veic vienkārÅ”u aprēķinu.

# Š”ŠŗŠ¾Š»ŃŒŠŗŠ¾ ŠæŠøрŠ¾Š³Š¾Š² хŠ¾Ń‚ŃŃ‚ Š“ŠµŃ‚Šø?
# 3 рŠµŠ±ŠµŠ½ŠŗŠ° хŠ¾Ń‚ŃŃ‚ ŠæŠ¾ цŠµŠ»Š¾Š¼Ńƒ ŠæŠøрŠ¾Š³Ńƒ Šø ŠµŃ‰Šµ Š¾Š“ŠøŠ½ хŠ¾Ń‡ŠµŃ‚ ŠæŠ¾Š»Š¾Š²ŠøŠ½Ńƒ ŠæŠøрŠ¾Š³Š°
cakesNumberKidsWant = (3 * 1) + (1 * 0.5) = 3.5
# Š’Ń‹Ń€Š°Š¶ŠµŠ½ŠøŠµ ŠæŠ¾Š»ŃƒŃ‡Š°ŠµŃ‚ся тŠ°Šŗ:
3 (рŠµŠ±ŠµŠ½ŠŗŠ°/ŠŗŠ¾Š½Ń‚ŠµŠ¹Š½ŠµŃ€Š°) * 1 (цŠµŠ»Ń‹Š¹ ŠæŠøрŠ¾Š³/ŠæŠ¾Š»Š½Š¾Šµ яŠ“рŠ¾) + 1 (рŠµŠ±ŠµŠ½Š¾Šŗ/ŠŗŠ¾Š½Ń‚ŠµŠ¹Š½ŠµŃ€) * 0.5 (ŠæŠ¾Š»Š¾Š²ŠøŠ½Š° ŠæŠøрŠ¾Š³Š°/ŠæŠ¾Š»Š¾Š²ŠøŠ½Š° яŠ“рŠ°)
# Š”ŠŗŠ¾Š»ŃŒŠŗŠ¾ ŠæŠøрŠ¾Š³Š¾Š² ŠøсŠæŠµŃ‡ŠµŠ½Š¾?
availableCakesNumber = 1
# Š”ŠŗŠ¾Š»ŃŒŠŗŠ¾ ŠæŠøрŠ¾Š³Š° (Š¼Š°ŠŗсŠøŠ¼Š°Š»ŃŒŠ½Š¾) Š“ŠµŃ‚Šø рŠµŠ°Š»ŃŒŠ½Š¾ Š¼Š¾Š³ŃƒŃ‚ ŠæŠ¾Š»ŃƒŃ‡Šøть?
newMaxRequest = 1 / 3.5 =~ 28%

Pamatojoties uz aprēķinu, trīs bērni saņems 28% no kodola, nevis visu kodolu. Ceturtais bērns saņems 14% no pilna kodola, nevis pusi. Bet lietas būs savādākas, ja jums ir daudzkodolu sistēma.

Kā piekļūt Kubernetes Pod resursiem
CPU pieprasÄ«jums ā€” vairāku kodolu (4) sistēma

AugŔējā attēlā var redzēt, ka trÄ«s bērni vēlas veselu pÄ«rāgu, bet viens vēlas pusi. Tā kā mamma izcepa četrus pÄ«rāgus, katrs viņas bērns dabÅ«s tik, cik gribēs. Daudzkodolu sistēmā procesora resursi tiek sadalÄ«ti pa visiem pieejamajiem procesora kodoliem. Ja konteineram ir mazāks par vienu pilnu CPU kodolu, tas joprojām var to izmantot 100%.

IepriekÅ” minētie aprēķini ir vienkārÅ”oti, lai saprastu, kā CPU tiek sadalÄ«ts starp konteineriem. Protams, bez paÅ”iem konteineriem ir arÄ« citi procesi, kas izmanto arÄ« CPU resursus. Kad procesi vienā konteinerā ir dÄ«kstāvē, citi var izmantot tā resursu. CPU: "200m" atbilst CPU: 0,2, kas nozÄ«mē aptuveni 20% no viena kodola.

Tagad parunāsim par limit.cpu. Kubernetes ierobežotais centrālais procesors tiek reizināts ar 100. Rezultāts ir laiks, ko konteiners var izmantot ik pēc 100 Āµs (cpu-period).

limit.cpu atbilst Docker karogam --cpus. Å Ä« ir jauna vecā kombinācija --cpu-period Šø --cpu-quota. Iestatot to, mēs norādām, cik pieejamos CPU resursus konteiners var maksimāli izmantot pirms droseles sākÅ”anas:

  • Procesors - kombinācija cpu-period Šø cpu-quota. cpus = 1.5 lÄ«dzvērtÄ«gs iestatÄ«jumam cpu-period = 100000 Šø cpu-quota = 150000;
  • CPU periods - periods CPU CFS plānotājs, noklusējuma 100 mikrosekundes;
  • cpu kvota - mikrosekunžu skaits iekÅ”pusē cpu-period, kuru ierobežo konteiners.

Kas notiek, ja instalējat nepietiekamu pieprasīto CPU?

Ja konteineram ir nepiecieÅ”ams vairāk, nekā tas ir instalēts, tas nozags CPU no citiem procesiem.

Kas notiek, ja iestatāt pārāk zemu CPU ierobežojumu?

Tā kā CPU resurss ir regulējams, tiks ieslēgta drosele.

Kas notiek, ja nenorādīsit CPU pieprasījumu?

Tāpat kā ar atmiņu, pieprasījuma vērtība ir vienāda ar ierobežojumu.

Kas notiks, ja nenorādīsit CPU ierobežojumu?

Konteiners izmantos tik daudz CPU, cik nepiecieÅ”ams. Ja nosaukumvietā ir definēta noklusējuma CPU politika (LimitRange), Å”is ierobežojums tiek izmantots arÄ« konteineram.

Kas notiek, ja nenorādīsit ne pieprasījumu, ne CPU ierobežojumu?

Tāpat kā ar atmiņu, Å”is ir sliktākais scenārijs. Plānotājs nezina, cik daudz resursu ir nepiecieÅ”ams jÅ«su konteineram, un tas var radÄ«t nopietnas problēmas mezglā. Lai no tā izvairÄ«tos, jums ir jāiestata noklusējuma ierobežojumi nosaukumvietām (LimitRange).

Atcerieties: ja pieprasāt vairāk CPU, nekā mezgli spēj nodroÅ”ināt, Pod netiks ieplānots. Requests.cpu - nevis minimālā vērtÄ«ba, bet vērtÄ«ba, kas ir pietiekama, lai iedarbinātu Pod un darbotos bez kļūmēm. Ja lietojumprogramma neveic sarežģītus aprēķinus, labākā iespēja ir instalēt request.cpu <= 1 un palaidiet tik daudz kopiju, cik nepiecieÅ”ams.

Ideāls pieprasīto resursu apjoms vai resursu ierobežojums

Mēs uzzinājām par skaitļoÅ”anas resursu ierobežojumiem. Tagad ir pienācis laiks atbildēt uz jautājumu: ā€œCik daudz resursu manam Pod ir nepiecieÅ”ams, lai lietojumprogramma palaistu bez problēmām? Kāda ir ideālā summa?

Diemžēl skaidras atbildes uz Å”iem jautājumiem nav. Ja nezināt, kā darbojas jÅ«su lietojumprogramma vai cik daudz CPU vai atmiņas tai ir nepiecieÅ”ams, vislabākais risinājums ir pieŔķirt lietojumprogrammai daudz atmiņas un CPU un pēc tam veikt veiktspējas testus.

Papildus veiktspējas testiem nedēļu uzraugiet lietojumprogrammas uzvedību. Ja diagrammas norāda, ka jūsu lietojumprogramma patērē mazāk resursu, nekā pieprasījāt, varat samazināt pieprasītā CPU vai atmiņas apjomu.

Kā piemēru skatiet Å”o Grafana informācijas panelis. Tas parāda atŔķirÄ«bu starp pieprasÄ«tajiem resursiem vai resursu ierobežojumu un paÅ”reizējo resursu lietojumu.

Secinājums

Resursu pieprasÄ«Å”ana un ierobežoÅ”ana palÄ«dz uzturēt jÅ«su Kubernetes klasteru veselÄ«gu. Pareiza limita konfigurācija samazina izmaksas un nodroÅ”ina lietojumprogrammu darbÄ«bu visu laiku.

ÄŖsāk sakot, ir dažas lietas, kas jāpatur prātā:

  1. PieprasÄ«tie resursi ir konfigurācija, kas tiek ņemta vērā startÄ“Å”anas laikā (kad Kubernetes plāno mitināt lietojumprogrammu). Turpretim resursu ierobežoÅ”ana ir svarÄ«ga izpildlaikā, kad lietojumprogramma jau darbojas mezglā.
  2. Salīdzinot ar atmiņu, centrālais procesors ir regulēts resurss. Ja nav pietiekami daudz CPU, jūsu Pod neizslēgsies un ieslēgsies droseles mehānisms.
  3. PieprasÄ«tie resursi un resursu limits nav minimālās un maksimālās vērtÄ«bas! Definējot pieprasÄ«tos resursus, jÅ«s nodroÅ”ināsiet, ka lietojumprogramma darbosies bez problēmām.
  4. Laba prakse ir iestatīt atmiņas pieprasījumu vienādu ar atmiņas ierobežojumu.
  5. Ok instalÄ“Å”ana pieprasÄ«ta CPU <=1, ja lietojumprogramma neveic sarežģītus aprēķinus.
  6. Ja pieprasāt vairāk resursu, nekā ir pieejams mezglā, Pod nekad netiks ieplānots Ŕim mezglam.
  7. Lai noteiktu pareizo pieprasÄ«to resursu/resursu ierobežojumu apjomu, izmantojiet slodzes testÄ“Å”anu un uzraudzÄ«bu.

Es ceru, ka Å”is raksts palÄ«dzēs jums izprast resursu ierobežojuma pamatjēdzienu. Un Ŕīs zināŔanas varēsi pielietot savā darbā.

Veiksmi!

Ko vēl lasīt:

  1. SRE novērojamība: nosaukumtelpas un metriskā struktūra.
  2. Vairāk nekā 90 noderÄ«gu rÄ«ku Kubernetes: izvietoÅ”ana, pārvaldÄ«ba, uzraudzÄ«ba, droŔība un citi.
  3. Mūsu kanāls Ap Kubernetes telegrammā.

Avots: www.habr.com

Pievieno komentāru