Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

27. aprÄ«lÄ« konferencē Streiks 2019, sadaļas ā€œDevOpsā€ ietvaros tika sniegts ziņojums ā€œAutomērogoÅ”ana un resursu pārvaldÄ«ba Kubernetesā€. Tajā ir runāts par to, kā jÅ«s varat izmantot K8s, lai nodroÅ”inātu savu lietojumprogrammu augstu pieejamÄ«bu un nodroÅ”inātu maksimālu veiktspēju.

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Saskaņā ar tradīciju mēs esam priecīgi iepazīstināt reportāžas video (44 minūtes, daudz informatīvāks par rakstu) un galvenais kopsavilkums teksta formā. Aiziet!

Analizēsim ziņojuma tēmu vārdu pa vārdam un sāksim no beigām.

Kubernetes

Pieņemsim, ka mÅ«su resursdatorā ir Docker konteineri. Par ko? Lai nodroÅ”inātu atkārtojamÄ«bu un izolāciju, kas savukārt nodroÅ”ina vienkārÅ”u un labu izvietoÅ”anu, CI/CD. Mums ir daudz Ŕādu transportlÄ«dzekļu ar konteineriem.

Ko Ŕajā gadījumā nodroŔina Kubernetes?

  1. Mēs pārtraucam domāt par Ŕīm maŔīnām un sākam strādāt ar "mākoni" konteineru kopa vai pākstis (konteineru grupas).
  2. Turklāt mēs pat nedomājam par atseviŔķām pākstÄ«m, bet pārvaldām vairākŠ¾lielākām grupām. Tādas augsta lÄ«meņa primitÄ«vi ļaujiet mums teikt, ka ir veidne noteiktas darba slodzes izpildei, un Å”eit ir nepiecieÅ”amais gadÄ«jumu skaits, lai to palaistu. Ja pēc tam mainÄ«sim veidni, mainÄ«sies visi gadÄ«jumi.
  3. Ar deklaratÄ«vā API Tā vietā, lai izpildÄ«tu noteiktu komandu secÄ«bu, mēs aprakstām ā€œpasaules struktÅ«ruā€ (YAML), ko izveido Kubernetes. Un vēlreiz: mainoties aprakstam, mainÄ«sies arÄ« tā faktiskais attēlojums.

Resursu vadība

CPU

Ä»aujiet mums serverÄ« palaist nginx, php-fpm un mysql. Å ajos pakalpojumos faktiski darbosies vēl vairāk procesu, no kuriem katram ir nepiecieÅ”ami skaitļoÅ”anas resursi:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)
(cipari uz slaida ir ā€œpapagailisā€, katra procesa abstraktā nepiecieÅ”amÄ«ba pēc skaitļoÅ”anas jaudas)

Lai ar to bÅ«tu vieglāk strādāt, ir loÄ£iski apvienot procesus grupās (piemēram, visus nginx procesus vienā grupā ā€œnginxā€). VienkārÅ”s un acÄ«mredzams veids, kā to izdarÄ«t, ir ievietot katru grupu konteinerā:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Lai turpinātu, jums jāatceras, kas ir konteiners (operētājsistēmā Linux). To izskats bija iespējams, pateicoties trim galvenajām kodola funkcijām, kas ieviestas diezgan sen: iespējas, namespaces Šø grupas. Un turpmāko attÄ«stÄ«bu veicināja citas tehnoloÄ£ijas (tostarp ērtas ā€œÄaulasā€, piemēram, Docker):

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Ziņojuma kontekstā mÅ«s interesē tikai grupas, jo kontroles grupas ir konteineru (Docker u.c.) funkcionalitātes daļa, kas ievieÅ” resursu pārvaldÄ«bu. Procesi, kas apvienoti grupās, kā mēs vēlējāmies, ir kontroles grupas.

Atgriezīsimies pie CPU prasībām Ŕiem procesiem un tagad arī procesu grupām:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)
(Es atkārtoju, ka visi skaitļi ir abstrakta resursu nepiecieŔamības izpausme)

Tajā paŔā laikā paÅ”am CPU ir noteikts ierobežots resurss (piemērā tas ir 1000), kas katram var pietrÅ«kt (visu grupu vajadzÄ«bu summa 150+850+460=1460). Kas notiks Å”ajā gadÄ«jumā?

Kodols sāk izplatÄ«t resursus un dara to ā€œgodÄ«giā€, pieŔķirot katrai grupai vienādu resursu daudzumu. Bet pirmajā gadÄ«jumā to ir vairāk nekā nepiecieÅ”ams (333>150), tāpēc pārpalikums (333-150=183) paliek rezervē, kas arÄ« tiek vienādi sadalÄ«ts starp diviem citiem konteineriem:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Rezultātā: pirmajam konteineram pietika resursu, otrajam ā€“ nepietika resursu, treÅ”ajam ā€“ nepietika resursu. Tas ir darbÄ«bu rezultāts "godÄ«gs" plānotājs operētājsistēmā Linux Sākot no CFS. Tās darbÄ«bu var pielāgot, izmantojot uzdevumu svari katrs no konteineriem. Piemēram, Ŕādi:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

ApskatÄ«sim gadÄ«jumu, kad otrajā konteinerā (php-fpm) trÅ«kst resursu. Visi konteineru resursi tiek vienādi sadalÄ«ti starp procesiem. Rezultātā galvenais process darbojas labi, bet visi darbinieki palēninās, saņemot mazāk nekā pusi no nepiecieÅ”amā:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Šādi darbojas CFS plānotājs. Mēs turpmāk sauksim svarus, ko pieŔķiram konteineriem pieprasÄ«jumus. Kāpēc tas tā ir - skatiet tālāk.

PaskatÄ«simies uz visu situāciju no citas puses. Kā zināms, visi ceļi ved uz Romu un datora gadÄ«jumā uz centrālo procesoru. Viens centrālais procesors, daudz uzdevumu ā€“ vajag luksoforu. VienkārŔākais veids, kā pārvaldÄ«t resursus, ir "luksofors": tie vienam procesam pieŔķīra fiksētu piekļuves laiku CPU, pēc tam nākamajam utt.

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Å o pieeju sauc par cietajām kvotām (stingrs ierobežojums). Atcerēsimies to vienkārÅ”i kā robežas. Taču, ja sadala limitus visiem konteineriem, rodas problēma: mysql brauca pa ceļu un kādā brÄ«dÄ« tam beidzās nepiecieÅ”amÄ«ba pēc CPU, bet visi pārējie procesi ir spiesti gaidÄ«t lÄ«dz CPU. dÄ«kstāvē.

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

AtgriezÄ«simies pie Linux kodola un tā mijiedarbÄ«bas ar centrālo procesoru ā€“ kopaina ir Ŕāda:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

cgroup ir divi iestatÄ«jumi - bÅ«tÄ«bā tie ir divi vienkārÅ”i ā€œpagriezieniā€, kas ļauj noteikt:

  1. svars konteineram (pieprasījumiem) ir akcijas;
  2. procentuālā daļa no kopējā CPU laika darbam ar konteinera uzdevumiem (limiti) ir kvota.

Kā izmērīt CPU?

Ir dažādi veidi:

  1. Kas ir papagaiļi, neviens nezina - vajag katru reizi sarunāt.
  2. Interese skaidrāks, bet relatīvs: 50% servera ar 4 kodoliem un ar 20 kodoliem ir pilnīgi dažādas lietas.
  3. Varat izmantot jau minētos svari, ko Linux zina, taču tie arī ir relatīvi.
  4. Vispiemērotākā iespēja ir izmērÄ«t skaitļoÅ”anas resursus sekundes. Tie. procesora laika sekundēs attiecÄ«bā pret reālā laika sekundēm: uz 1 reālo sekundi tika dota 1 sekunde procesora laika - tas ir viens viss CPU kodols.

Lai runātu bÅ«tu vēl vieglāk, viņi sāka mērÄ«ties tieÅ”i iekŔā kodoli, kas nozÄ«mē to paÅ”u CPU laiku attiecÄ«bā pret reālo. Tā kā Linux saprot svarus, bet ne tik daudz CPU laika/kodolu, bija nepiecieÅ”ams mehānisms, lai tulkotu no viena uz otru.

ApskatÄ«sim vienkārÅ”u piemēru ar serveri ar 3 CPU kodoliem, kur trim podiem tiks pieŔķirti svari (500, 1000 un 1500), kas ir viegli konvertējami uz tām pieŔķirtajām atbilstoÅ”ajām kodolu daļām (0,5, 1 un 1,5).

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Ja paņemat otru serveri, kurā bÅ«s divreiz vairāk kodolu (6), un ievietojat tur tos paÅ”us podiņus, kodolu sadalÄ«jumu var viegli aprēķināt, vienkārÅ”i reizinot ar 2 (attiecÄ«gi 1, 2 un 3). Bet svarÄ«gs brÄ«dis notiek, kad Å”ajā serverÄ« parādās ceturtais pods, kura svars ērtÄ«bas labad bÅ«s 3000. Tas atņem daļu no CPU resursiem (puse kodolu), un pārējiem podiem tie tiek pārrēķināti (uz pusi):

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Kubernetes un CPU resursi

Programmā Kubernetes CPU resursi parasti tiek mērÄ«ti miliadrakss, t.i. Par pamatsvaru ņem 0,001 serdeņus. (Tas pats Linux/cgroups terminoloÄ£ijā tiek saukts par CPU koplietojumu, lai gan, precÄ«zāk, 1000 milicores = 1024 CPU koplietoÅ”anas.) K8s nodroÅ”ina, ka tas nenovieto serverÄ« vairāk podi, nekā ir CPU resursi visu podiņu svaru summai.

Kā tas notiek? Kad pievienojat serveri Kubernetes klasterim, tiek ziņots, cik CPU kodolu tajā ir pieejams. Un, veidojot jaunu podziņu, Kubernetes plānotājs zina, cik kodolu Å”im podam bÅ«s nepiecieÅ”ams. Tādējādi pods tiks pieŔķirts serverim, kurā ir pietiekami daudz kodolu.

Kas notiks, ja nē pieprasÄ«jums ir norādÄ«ts (t.i., podam nav noteikts skaits nepiecieÅ”amo kodolu)? Izdomāsim, kā Kubernetes kopumā uzskaita resursus.

Podam varat norādīt gan pieprasījumus (CFS plānotājs), gan ierobežojumus (atceraties luksoforu?):

  • Ja tie ir norādÄ«ti vienādi, podam tiek pieŔķirta QoS klase garantēta. Å is vienmēr pieejamais kodolu skaits ir garantēts.
  • Ja pieprasÄ«jums ir mazāks par limitu - QoS klase pārsprāgstoÅ”s. Tie. Mēs sagaidām, ka, piemēram, pods vienmēr izmantos 1 kodolu, taču Ŕī vērtÄ«ba tam nav ierobežojums: dažreiz pod var izmantot vairāk (ja serverim ir brÄ«vi resursi Å”im nolÅ«kam).
  • Ir arÄ« QoS klase labākās pÅ«les ā€” tajā ietilpst tie paÅ”i pāksti, kuriem pieprasÄ«jums nav norādÄ«ts. Resursi viņiem tiek pieŔķirti pēdējiem.

Atmiņa

Ar atmiņu situācija ir lÄ«dzÄ«ga, bet nedaudz atŔķirÄ«ga - galu galā Å”o resursu raksturs ir atŔķirÄ«gs. Kopumā analoÄ£ija ir Ŕāda:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Apskatīsim, kā pieprasījumi tiek īstenoti atmiņā. Ļaujiet podiem dzīvot serverī, mainot atmiņas patēriņu, līdz viens no tiem kļūst tik liels, ka tam beidzas atmiņa. Šajā gadījumā parādās OOM slepkava un nogalina lielāko procesu:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Tas mums ne vienmēr padodas, tāpēc ir iespējams regulēt, kuri procesi mums ir svarīgi un kurus nevajag nogalināt. Lai to izdarītu, izmantojiet parametru oom_score_adj.

Atgriezīsimies pie CPU QoS klasēm un izveidosim analoģiju ar oom_score_adj vērtībām, kas nosaka atmiņas patēriņa prioritātes podiem:

  • Zemākā oom_score_adj vērtÄ«ba podam ā€” 998 ā€” nozÄ«mē, ka Ŕāds aplikums ir jānogalina kā pēdējais. garantēta.
  • Augstākais - 1000 - ir labākās pÅ«les, Ŕādas pākstis tiek nogalinātas vispirms.
  • Lai aprēķinātu atlikuŔās vērtÄ«bas (pārsprāgstoÅ”s) ir formula, kuras bÅ«tÄ«ba ir tāda, ka, jo vairāk resursu ir pieprasÄ«jis pods, jo mazāka iespējamÄ«ba, ka tā tiks nogalināta.

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Otrais "pagrieziens" - limits_in_bytes - par ierobežojumiem. Ar to viss ir vienkārŔāk: mēs vienkārÅ”i pieŔķiram maksimālo izsniegtās atmiņas apjomu, un Å”eit (atŔķirÄ«bā no CPU) nav runas par to, kā to (atmiņu) izmērÄ«t.

Kopā

Katra pāksts Kubernetes ir dota requests Šø limits - abi CPU un atmiņas parametri:

  1. pamatojoties uz pieprasījumiem, darbojas Kubernetes plānotājs, kas sadala podi starp serveriem;
  2. pamatojoties uz visiem parametriem, tiek noteikta poda QoS klase;
  3. Relatīvie svari tiek aprēķināti, pamatojoties uz CPU pieprasījumiem;
  4. CFS plānotājs ir konfigurēts, pamatojoties uz CPU pieprasījumiem;
  5. OOM killer ir konfigurēts, pamatojoties uz atmiņas pieprasījumiem;
  6. ā€œluksoforsā€ ir konfigurēts, pamatojoties uz CPU ierobežojumiem;
  7. Pamatojoties uz atmiņas ierobežojumiem, cgroup tiek konfigurēts ierobežojums.

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Kopumā Å”is attēls atbild uz visiem jautājumiem par to, kā galvenā resursu pārvaldÄ«bas daļa notiek Kubernetes.

Automātiska mērogoÅ”ana

K8s klasteris-autoscaler

Iedomāsimies, ka viss klasteris jau ir aizņemts un ir jāizveido jauns pods. Kamēr pods nevar parādÄ«ties, tas uzkaras statusā lÄ«dz. Lai tas parādÄ«tos, varam pieslēgt klasterim jaunu serveri vai... instalēt cluster-autoscaler, kas to izdarÄ«s mÅ«su vietā: pasÅ«tÄ«t virtuālo maŔīnu no mākoņpakalpojuma sniedzēja (izmantojot API pieprasÄ«jumu) un savienot to ar klasteru. , pēc kura pāksts tiks pievienots .

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Å Ä« ir Kubernetes klastera automātiskā mērogoÅ”ana, kas darbojas lieliski (pēc mÅ«su pieredzes). Tomēr, tāpat kā citur, Å”eit ir dažas nianses...

Kamēr mēs palielinājām klastera izmēru, viss bija kārtÄ«bā, bet kas notiek, kad klasteris sāka atbrÄ«voties? Problēma ir tā, ka pākstu migrÄ“Å”ana (lai atbrÄ«votu saimniekdatorus) ir tehniski ļoti sarežģīta un dārga resursu ziņā. Kubernetes izmanto pavisam citu pieeju.

Apsveriet 3 serveru kopu ar izvietoÅ”anu. Tam ir 6 podi: tagad katram serverim ir 2. Nez kāpēc gribējām izslēgt vienu no serveriem. Lai to izdarÄ«tu, mēs izmantosim komandu kubectl drain, kas:

  • aizliedz jaunu podziņu sÅ«tÄ«Å”anu uz Å”o serveri;
  • izdzēsÄ«s serverÄ« esoÅ”os aplikumus.

Tā kā Kubernetes ir atbildÄ«gs par pākstu skaita uzturÄ“Å”anu (6), tas vienkārÅ”i radÄ«s no jauna tos citos mezglos, bet ne tajā, kas ir atspējots, jo tas jau ir atzÄ«mēts kā nepieejams jaunu podziņu mitināŔanai. Tas ir Kubernetes pamatmehāniÄ·is.

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Tomēr arÄ« Å”eit ir kāda nianse. LÄ«dzÄ«gā situācijā StatefulSet (nevis Deployment) darbÄ«bas bÅ«s atŔķirÄ«gas. Tagad mums jau ir statusful lietojumprogramma - piemēram, trÄ«s podi ar MongoDB, no kuriem vienā ir kāda veida problēma (dati ir bojāti vai cita kļūda, kas neļauj podam startēt pareizi). Un mēs atkal nolemjam atspējot vienu serveri. Kas notiks?

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

MongoDB varētu mirst, jo tai ir vajadzÄ«gs kvorums: trÄ«s instalāciju klasterim jādarbojas vismaz divām. Tomēr Å”is nenotiek - Pateicoties PodDisruptionBudget. Å is parametrs nosaka minimālo nepiecieÅ”amo darba pākstu skaitu. Zinot, ka viens no MongoDB podiem vairs nedarbojas, un redzot, ka PodDisruptionBudget ir iestatÄ«ts MongoDB minAvailable: 2, Kubernetes neļaus izdzēst podziņu.

ApakŔējā lÄ«nija: lai pākstu pārvietoÅ”ana (un faktiski arÄ« atkārtota izveide) darbotos pareizi, kad klasteris tiek atbrÄ«vots, ir jākonfigurē PodDisruptionBudget.

Horizontālā mērogoÅ”ana

ApskatÄ«sim citu situāciju. Vietnē Kubernetes ir lietojumprogramma, kas darbojas kā izvietoÅ”ana. Lietotāju datplÅ«sma nonāk uz tā podiem (piemēram, tie ir trÄ«s), un mēs izmērām tajos noteiktu rādÄ«tāju (teiksim, CPU slodzi). Kad slodze palielinās, mēs to ierakstām grafikā un palielinām aplikumu skaitu, lai izplatÄ«tu pieprasÄ«jumus.

Šodien Kubernetes tas nav jādara manuāli: atkarībā no izmērīto slodzes indikatoru vērtībām tiek konfigurēts automātisks pākstu skaita palielinājums/samazinājums.

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Galvenie jautājumi Å”eit ir: ko tieÅ”i izmērÄ«t Šø kā interpretēt iegÅ«tās vērtÄ«bas (lēmuma pieņemÅ”anai par pākstu skaita maiņu). JÅ«s varat izmērÄ«t daudz:

Automātiskā mērogoÅ”ana un resursu pārvaldÄ«ba Kubernetes (pārskats un video atskaite)

Kā to izdarÄ«t tehniski - savākt metriku utt. ā€” Es detalizēti runāju ziņojumā par Monitorings un Kubernetes. Un galvenais padoms optimālo parametru izvēlei ir eksperiments!

Ir IZMANTOT metodi (LietoÅ”anas piesātinājums un kļūdas), kuras nozÄ«me ir Ŕāda. Uz kāda pamata ir jēga mērogot, piemēram, php-fpm? Pamatojoties uz faktu, ka strādnieki beidzas, tas tā ir utilizācija. Un, ja strādnieki ir beiguÅ”ies un jauni savienojumi netiek pieņemti, tas jau ir piesātinājuma. Abi Å”ie parametri ir jāmēra, un atkarÄ«bā no vērtÄ«bām jāveic mērogoÅ”ana.

Tā vietā, lai noslēgtu

Ziņojumam ir turpinājums: par vertikālo mērogoÅ”anu un to, kā izvēlēties pareizos resursus. Par to es runāŔu nākamajos videoklipos mÅ«su YouTube - abonējiet, lai nepalaistu garām!

Videoklipi un slaidi

Video no izrādes (44 minūtes):

Ziņojuma prezentācija:

PS

Citi ziņojumi par Kubernetes mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru