CPU piirangud ja agressiivne trottling Kuberneteses

MĂ€rk. tĂ”lge.: see looja lugu Omio — Euroopa reisikoguja — viib lugejad alates pĂ”hiteooriast kuni köitvate praktiliste nĂŒanssideni Kubernetes'i konfiguratsioonis. Selliste juhtumite tundmine aitab mitte ainult silmaringi laiendada, vaid ka vĂ€ltida keerulisi probleeme.

CPU piirangud ja agressiivne trottling Kuberneteses

Kas olete kunagi kogenud olukorda, kus rakendus „seisis” ja lakkas reageerimast oleku kontrollimisele (health check’ide) ning te ei suutnud selle kĂ€itumise pĂ”hjust mĂ”ista? Üks vĂ”imalik seletus on seotud CPU ressursside kvoodiga. Sellega me selles artiklis tegeleme.

LĂŒhikokkuvĂ”te:
Soovitame tungivalt loobuda CPU limiitidest Kubernetes'is (vÔi keelata CFS kvoodid Kubelet'is), kui kasutatakse Linuxi kerneli versiooni, millel on CFS kvoodi viga. Kerneli on olemas tÔsine ja hÀsti tuntud bugi, mis pÔhjustab liialdatud trottlite ja viivitusi.
.

Omios on kogu infrastruktuur hallatud Kubernetes’i kaudu.. KĂ”ik meie stateful- ja stateless-koormused töötavad eranditult Kubernetesel (kasutame Google Kubernetes Engine'i). Viimase kuue kuu jooksul oleme mĂ€rganud juhuslikke viivitusi. Rakendused hanguvad vĂ”i ei vasta enam health check’idele, kaotavad ĂŒhenduse vĂ”rgu ja nii edasi. See kĂ€itumine pani meid pikka aega segadusse, kuni lĂ”puks otsustasime probleemiga tĂ”siselt tegeleda.

Artikli kokkuvÔte:

  • MĂ”ned sĂ”nad konteineritest ja Kubernetesest;
  • Kuidas on rakendatud CPU request’id ja limit’id;
  • Kuidas CPU limit töötab mitme tuuma keskkondades;
  • Kuidas jĂ€lgida CPU trottling’ut;
  • Probleemi lahendamine ja nĂŒansid.

MÔned sÔnad konteineritest ja Kubernetesest

Kubernetes on sisuliselt kaasaegne standard infrastruktuuri maailmas. Selle peamine ĂŒlesanne on konteinerite orkestreerimine.

Konteinerid

Varem pidime looma artefakte, nagu Java JAR’id/WAR’id, Python Egg’id vĂ”i kĂ€ivitatavaid faile, et neid hiljem serverites kĂ€ivitada. Siiski, et need töötaksid, pidi tegema tĂ€iendavat tööd: installima jooksva keskkonna (Java/Python), paigaldama vajalikud failid Ă”igesse kohta, tagama ĂŒhilduvuse konkreetse operatsioonisĂŒsteemi versiooniga jne. TeisisĂ”nu, pidime pöörama suurt tĂ€helepanu konfiguratsioonihaldusele (mis pĂ”hjustas sageli konflikte arendajate ja sĂŒsteemiadministraatorite vahel).

Konteinerid on kĂ”ik muutnud. NĂŒĂŒd on artefakt konteinersĂŒsteem. Seda vĂ”ib nĂ€ha kui pikendatud kĂ€ivitatavat faili, mis sisaldab mitte ainult programmi, vaid ka tĂ€ielikku jooksva keskkonda (Java/Python/
) ning vajalikke faile/pakette, mis on eelinstalleeritud ja valmis kĂ€ivitamiseks. Konteinerid saab juurutada ja kĂ€ivitada erinevates serverites ilma tĂ€iendavate toiminguteta.

Lisaks toimivad konteinerid omaenese liivakasti keskkonnas. Neil on oma virtuaalne vĂ”rgukaart, oma failisĂŒsteem piiratud juurdepÀÀsuga, oma protsesside hierarhia, oma CPU ja mĂ€lu piirangud jne. KĂ”ik see on realiseeritud Linuxi tuuma erilise alamsĂŒsteemi — namespaces (nimetuste ruumide) abil.

Kubernetes

Nagu eelnevalt mainitud, on Kubernetes konteinerite orkestreerija. See töötab jĂ€rgmiselt: te annate sellele masinate hulga ja seejĂ€rel ĂŒtlete: "Hei, Kubernetes, kĂ€ivita kĂŒmme eksemplari minu konteinerist, igaĂŒhel 2 protsessorit ja 3 GB mĂ€lu ning hoolda neid!" Kubernetes hoolitseb ĂŒlejÀÀnud eest. See leiab vabad ressursid, kĂ€ivitab konteinerid ja kĂ€ivitab need vajadusel uuesti, toob vĂ€lja vĂ€rskenduse versioonide vahetumisel jne. Üldiselt vĂ”imaldab Kubernetes abstraheerida riistvarast ja muudab kĂ”ik sĂŒsteemide mitmekesisuse rakenduste juurutamiseks ja töötamiseks sobivaks.

CPU piirangud ja agressiivne trottling Kuberneteses
Kubernetes igapÀevase kasutaja vaatenurgast

Mis on request'id ja limit'id Kuberneteses

NĂŒĂŒd oleme containerite ja Kubernetes'ega sina peal. Teame, et mitu konteinerit vĂ”ivad olla ĂŒhel masinal.

VĂ”ib tuua paralleeli ĂŒhisest korterist. Suur ruum (masinad/sĂ”lmed) antakse mitmele ĂŒĂŒrnikule (konteineritele). Kubernetes mĂ€ngib maakleri rolli. Tekib kĂŒsimus, kuidas hoida ĂŒĂŒrnikud konfliktideta? Mis juhtub, kui ĂŒks neist otsustab nĂ€iteks kasutada vannituba poole pĂ€evaks?

Siinkohal tulevad mĂ€ngu request'id ja limit'id. CPU Request on vajalik ainult planeerimiseks. See on nagu konteineri „soovide nimekiri” ja seda kasutatakse sobivaima sĂ”lme leidmiseks. Samal ajal on CPU Limit vĂ”imalik vĂ”rrelda ĂŒĂŒrilepinguga — kui oleme leidnud sĂ”lme konteineri jaoks, siis ei saa ĂŒletada kehtestatud piire. Ja siin tekib probleem...

Kuidas on Kubernetes'is rakendatud request'e ja limit'e?

Kubernetes kasutab tuumikus sisseehitatud talitlushĂ€ire mehhanismi (taimeri saagimine) CPU piirangute rakendamiseks. Kui rakendus ĂŒletab piirangu, aktiveeritakse talitlushĂ€ire (st see saab vĂ€hem CPU taimerit). MĂ€lu jaoks on pĂ€ringud ja piirangud organiseeritud teistmoodi, seetĂ”ttu on need kergemini tuvastatavad. Selleks piisab, kui kontrollida viimast pod’i taaskĂ€ivitamise staatust: kas see ei ole 'OOMKilled'. CPU talitlushĂ€iretega pole kĂ”ik nii lihtne, kuna K8s teeb kergesti kergesti ligipÀÀsetavaks ainult kasutusstatistika, mitte cgroups'i kohta.

CPU PĂ€ring

CPU piirangud ja agressiivne trottling Kuberneteses
Kuidas on rakendatud CPU pÀring

Lihtsuse huvides vaatame protsessi 4-erialise CPU masina nÀitel.

K8s kasutab ressursside (mĂ€lu ja protsessori) jaotuse haldamiseks kontrollrĂŒhmade (cgroups) mehhanismi. Sellel on hierarhiline mudel: laps pĂ€rib vanema rĂŒhma piirangud. Jaotuse ĂŒksikasjad salvestatakse virtuaalsesse failisĂŒsteemi (/sys/fs/cgroup). Protsessoriga seotud osas on see /sys/fs/cgroup/cpu,cpuacct/*.

K8s kasutab faili cpu.share sisaldab CPU ressursside jaotamist. Meie juhul saab peamine kontrollgrupp 4096 CPU ressurssi aktsiat — 100% saadaval olevast protsessorivĂ”imsusest (1 tuum = 1024; see on fikseeritud vÀÀrtus). Peamine grupp jaotab ressursse proportsionaalselt alluvate aktsiate alusel, mis on mÀÀratud cpu.share, ja need omakorda kĂ€ituvad sarnaselt oma jĂ€reltulijatega jne. TĂŒĂŒpilises Kubernetes'e sĂ”lmes on peamisel kontrollgrupil kolm jĂ€reltulijat: system.slice, user.slice ja kubepods. Esimesi kahte alagruppi kasutatakse ressursside jaotamiseks kriitiliste sĂŒsteemikoormuste ja kasutajaprogrammide vahel vĂ€ljaspool K8s. Viimane — kubepods — loob Kubernetes ressursside jaotamiseks pod'ide vahel.

Ülaltoodud skeemilt on nĂ€ha, et esimesed kaks alagruppi said kumbki 1024 aktsiat, samal ajal kui alagrupile kubepod on eraldatud 4096 aktsiat. Kuidas see on vĂ”imalik: peamise grupi jaoks on saadaval ainult 4096 aktsiat, kuid tema alluvate aktsiate summa ĂŒletab seda numbrit mĂ€rkimisvÀÀrselt (6144)? Asi on, et vÀÀrtus omab loogilist tĂ€hendust, seetĂ”ttu kasutab Linuxi planeerija (CFS) seda CPU ressursside proportsionaalseks jaotamiseks. Meie puhul saavad esimesed kaks gruppi 680 reaalseid osasid (16,6% 4096-st), samas kui kubepood saab ĂŒlejÀÀnud 2736 osasid. Seisaku korral ei kasuta esimesed kaks gruppi eraldatud ressurssi.

KĂŒmmnes, et planeerijal on mehhanism, mis aitab vĂ€ltida kasutamata CPU ressursside kadu. See suunab „seisakusse” jÀÀvad vĂ”imsused globaalsetesse fondidesse, kust need jaotatakse gruppidesse, mis vajavad tĂ€iendavaid CPU vĂ”imsusi (jaotamine toimub partiitide kaupa, et vĂ€ltida kadu ĂŒmmardamise tĂ”ttu). Sarnast meetodit rakendatakse ka kĂ”ikide jĂ€reltulijate puhul.

See mehhanism tagab CPU vĂ”imsuste Ă”iglase jaotamise ja jĂ€lgib, et ĂŒkski protsess ei „varastaks” ressursse teistelt.

CPU Limit

Kuigi K8si limitide ja requestide konfigureerimised nÀevad sarnased vÀlja, on nende rakendamine kardinaalselt erinev: see on kÔige eksitavam ja vÀheseima dokumentatsiooni korral.

K8s kasutab CFS kvootide mehhanismi. piiride rakendamiseks. Nende seaded on mÀÀratletud failides cfs_period_us ja cfs_quota_us cgroup kaustas (seal asub ka fail cpu.share).

Erinevalt cpu.share, on kvoot pĂ”hinev ajaperioodil, mitte saadaval oleval protsessorivĂ”imsusel. cfs_period_us mÀÀrab perioodi (ajastu) kestuse – see on alati 100000 ”s (100 ms). K8s-is on vĂ”imalik seda vÀÀrtust muuta, kuid see on hetkel saadaval ainult alfa-versioonis. Planeerija kasutab ajastut kasutatud kvootide taaskĂ€ivitamiseks. Teine fail, cfs_quota_us, mÀÀrab saadaval oleva aja (kvoodi) iga ajastu jooksul. Pange tĂ€hele, et see on samuti antud mikroskeedes. Kvoot vĂ”ib ĂŒletada ajastu kestuse; teisisĂ”nu, see vĂ”ib olla ĂŒle 100 ms.

Vaadakem kahte stsenaariumi 16- tuumasilma masinatel (kĂ”ige levinum arvutitĂŒĂŒp meie Omios):

CPU piirangud ja agressiivne trottling Kuberneteses
Stsenaarium 1: 2 niiti ja piirang 200 ms. Ilma trottlinguta

CPU piirangud ja agressiivne trottling Kuberneteses
Stsenaarium 2: 10 niiti ja piirang 200 ms. Trottling algab pÀrast 20 ms, juurde pÀÀs protsessori ressurssidele taastub veel 80 ms pÀrast

Oletame, et olete seadnud CPU piirangu 2 tuum; Kubernetes tÔlgib selle vÀÀrtuse 200 ms-ks. See tÀhendaks, et konteiner vÔib kasutada maksimaalselt 200 ms protsessoriaega ilma throttlinguta.

Ja siin hakkab asi huvitavaks minema. Nagu eelnevalt mainitud, on saadaval olev kvoot 200 ms. Kui teil töötab samal ajal kĂŒmme niiti 12-tuumalises masinas (vt stsenaariumi 2 illustratsiooni), samal ajal kui kĂ”ik teised pod'id seisavad, kvoot otsa saab juba 20 ms jooksul (kuna 10 * 20 ms = 200 ms), ja kĂ”ik selle pod'i voolud "jÀÀvad kinni" (throttle) jĂ€rgmise 80 ms jooksul. Probleemi halvendab juba mainitud planeerija viga, mille tĂ”ttu toimub ĂŒlemÀÀrane throttling ja konteiner ei suuda isegi olemasolevat kvooti Ă€ra kasutada.

Kuidas hinnata throttlingut pod'ides?

Lihtsalt logige sisse pod'i ja tehke cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods — planeerija kogupindade arv;
  • nr_throttled — throttled-perioodide arv; nr_periods;
  • throttled_time — kogu throttled-aeg nanosekundites.

CPU piirangud ja agressiivne trottling Kuberneteses

Mis tegelikult toimub?

KokkuvĂ”ttes saame ĂŒhtlast kĂ”rget throttlingut kĂ”igis rakendustes. MĂ”nikord on see poolteise korra vĂ”rra tugevam kui arvutatud!

See to erinevad vead – valmisoleku kontrolle (readiness) pĂ”hjustavad tĂ”rked, konteinerite seiskumised, vĂ”rguĂŒhenduste katkestused ja teenusekĂ”nede ajaviivitused. LĂ”ppkokkuvĂ”ttes vĂ€ljendub see suurema viivituse ja veateate arvu suurenemises.

Lahendus ja tagajÀrjed

Siin on kÔik lihtne. Me loobusime CPU limitidest ja vÀrskendasime klastrite OS-i kerneli kÔige uuemaks versiooniks, kus viga oli parandatud. Meie teenustes tekkivate veateadete (HTTP 5xx) arv langes kohe mÀrgatavalt:

HTTP 5xx vead

CPU piirangud ja agressiivne trottling Kuberneteses
Ühe kriitilise teenuse HTTP 5xx vead

Vastusaja p95

CPU piirangud ja agressiivne trottling Kuberneteses
Kriitilise teenuse pÀringute viivitus, 95. percentiil

Eksploiteerimise kulud

CPU piirangud ja agressiivne trottling Kuberneteses
Kulunud eksemplari-tunnid

Mis on petuouks?

Nagu artikli alguses öeldud:

VĂ”ib teha analoogia kommunaalkorteriga
 Kubernetes on nagu kinnisvaramaakler. Kuidas aga hoida ĂŒĂŒrnikud konfliktideta? Mis juhtub, kui ĂŒks neist otsustab nĂ€iteks vĂ”tta vannitoa pooleks pĂ€evaks enda kasutusse?

Siin on probleem. Üks kehv konteiner vĂ”ib Ă€ra kasutada kĂ”ik masina pöördusressursid. Kui teil on korralik rakenduste virn (nĂ€iteks Ă”igesti seadistatud JVM, Go, Node VM), siis ei ole see probleem: sellistes tingimustes saab töötada pikka aega. Aga kui rakendused on halvasti optimeeritud vĂ”i ĂŒldse mitte optimeeritud (FROM java:latest), vĂ”ib olukord kontrolli alt vĂ€ljas olla. Meil Omios on automatiseeritud pĂ”hja Dockerfiles koos adekvaatsete vaikeseadetega peamiste keelte virna jaoks, seega sellist probleemi ei tekkinud.

Soovitame jĂ€lgida mÔÔdikuid USE (kasutamine, kĂŒllastus ja vead), API-late viivitusi ja vigade esinemise sagedust. JĂ€lgige, et tulemused vastaksid ootustele.

Lingid

Selline on meie lugu. JÀrgmised materjalid aitasid palju mÔista, mis toimub:

Kubernetesi veateated:

Kas olete oma praktikas kokku puutunud sarnaste probleemidega vÔi on teil kogemusi konteinerites kÀituvate tootmiskeskkondade trottlimisega? Jagage oma lugu kommentaarides!

P.S. tÔlkija mÀrkused

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster