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.

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 tÔsine ja 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.

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

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 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):

Stsenaarium 1: 2 niiti ja piirang 200 ms. Ilma trottlinguta

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 , 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.

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

Ăhe kriitilise teenuse HTTP 5xx vead
Vastusaja p95

Kriitilise teenuse pÀringute viivitus, 95. percentiil
Eksploiteerimise kulud

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 (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:
- ;
- ;
- ;
- ;
- â otsige "cpu throttling".
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
