Oke CPU na mwepu ike na Kubernetes

Rịba ama. ntụgharị asụsụ.: Akụkọ mmeghe anya a nke Omio-onye na-achịkọta njem njem Europe-na-ewere ndị na-agụ akwụkwọ site na echiche bụ isi na mgbagwoju anya bara uru nke nhazi Kubernetes. Ịmara ụdị ikpe ndị dị otú ahụ na-enye aka ọ bụghị naanị ịgbasa echiche gị, kamakwa igbochi nsogbu ndị na-adịghị mkpa.

Oke CPU na mwepu ike na Kubernetes

Ọ dịtụla mgbe ị nwere ngwa rapaara n'ọnọdụ, kwụsị ịzaghachi nyocha ahụike, ma ị nweghị ike ịchọpụta ihe kpatara ya? Otu nkọwa enwere ike metụtara oke oke akụrụngwa CPU. Nke a bụ ihe anyị ga-ekwu maka ya n'isiokwu a.

TL; DR:
Anyị na-akwadosi ike gbanyụọ oke CPU na Kubernetes (ma ọ bụ gbanyụọ CFS quotas na Kubelet) ma ọ bụrụ na ị na-eji ụdị Linux kernel nwere ahụhụ oke CFS. Na isi dị serious na amara nke ọma ahụhụ nke na-eduga n'ọgba aghara na igbu oge
.

Na Omio Kubernetes na-elekọta akụrụngwa niile. Ọrụ steeti na enweghị steeti na-arụ naanị na Kubernetes (anyị na-eji Google Kubernetes Engine). N'ime ọnwa isii gara aga, anyị malitere ịhụ mbelata nke enweghị usoro. Ngwa kwụsịrị ma ọ bụ kwụsị ịzaghachi na nlele ahụike, hapụ njikọ na netwọkụ, wdg. Omume a gbagwojuru anyị anya ruo ogologo oge, ma n'ikpeazụ anyị kpebiri iji nsogbu ahụ kpọrọ ihe.

Nchịkọta akụkọ a:

  • Okwu ole na ole banyere arịa na Kubernetes;
  • Otu esi emejuputa arịrịọ CPU na oke;
  • Kedu ka oke CPU si arụ ọrụ na gburugburu ọtụtụ isi;
  • Otu esi agbaso CPU throttling;
  • Ngwọta nsogbu na nuances.

Okwu ole na ole gbasara arịa na Kubernetes

Kubernetes bụ n'ezie ọkọlọtọ ọgbara ọhụrụ na ụwa akụrụngwa. Ọrụ bụ́ isi ya bụ ịkpa nkata.

.Онтейнеры

N'oge gara aga, anyị ga-emepụta artifacts dị ka Java JARs/WARs, Python Eggs, ma ọ bụ executables iji na-agba ọsọ na sava. Otú ọ dị, iji mee ka ha na-arụ ọrụ, a ghaghị ịrụ ọrụ ndị ọzọ: ịwụnye ebe a na-agba ọsọ (Java/Python), na-etinye faịlụ ndị dị mkpa na ebe kwesịrị ekwesị, na-eme ka ndakọrịta na otu ụdị nke sistemụ arụmọrụ, wdg. N'ikwu ya n'ụzọ ọzọ, a ghaghị itinye nlezianya anya na nhazi nhazi (nke na-abụkarị isi iyi nke esemokwu n'etiti ndị mmepe na ndị na-ahụ maka usoro).

Akpa gbanwere ihe niile. Ugbu a artifact bụ ihe oyiyi akpa. Enwere ike ịnọchite anya ya dị ka ụdị faịlụ nwere ike ịgbatị agbatị nwere ọ bụghị naanị mmemme ahụ, kamakwa ebe mkpochapụ zuru oke (Java/Python /...), yana faịlụ / ngwugwu dị mkpa, etinyegoro na njikere maka ya. na-agba ọsọ. Enwere ike ibunye akpa ma na-agba ọsọ na sava dị iche iche na-enweghị usoro ọzọ.

Tụkwasị na nke ahụ, arịa na-arụ ọrụ na gburugburu igbe ájá nke ha. Ha nwere onwe ha mebere netwọk nkwụnye, ha faịlụ usoro na mmachi ohere, ha hierarchy nke usoro, ha onwe ha na-agaghị emeli na CPU na ebe nchekwa, wdg All a na-emejuputa atumatu ekele a pụrụ iche subsystem nke Linux kernel - namespaces.

Kubernetes

Dị ka ekwuru na mbụ, Kubernetes bụ onye na-agụ ihe. Ọ na-arụ ọrụ dị ka nke a: ị na-enye ya ọdọ mmiri igwe, wee sị: "Hey, Kubernetes, ka anyị malite ihe iri nke akpa m nwere 2 processors na 3 GB nke ebe nchekwa nke ọ bụla, ma mee ka ha na-agba ọsọ!" Kubernetes ga-elekọta ndị ọzọ. Ọ ga-achọta ikike efu, malite arịa ma malitegharịa ha ma ọ bụrụ na ọ dị mkpa, wepụta mmelite mgbe ị na-agbanwe nsụgharị, wdg. N'ụzọ bụ isi, Kubernetes na-enye gị ohere iwepu akụrụngwa akụrụngwa ma na-eme ọtụtụ sistemu dị iche iche dabara adaba maka ibugharị na ngwa ngwa.

Oke CPU na mwepu ike na Kubernetes
Kubernetes site n'echiche nke onye nkịtị

Kedu ihe bụ arịrịọ na oke na Kubernetes

Ọ dị mma, anyị ekpuchila arịa na Kubernetes. Anyị makwaara na ọtụtụ akpa nwere ike ibi n'otu igwe.

Enwere ike iji ụlọ ọha mmadụ sere ihe atụ. A na-ewere ụlọ sara mbara (igwe / nkeji) ma gbazite ya n'ọtụtụ ndị nwe ụlọ (container). Kubernetes na-arụ ọrụ dị ka onye na-ere ahịa. Ajụjụ na-ebilite, otu esi egbochi ndị nwe ụlọ ka esemokwu na ibe ha? Gịnị ma ọ bụrụ na otu n'ime ha, kwuo, kpebie ịgbaziri ụlọ ịsa ahụ maka ọkara ụbọchị?

Nke a bụ ebe arịrịọ na oke na-abata. CPU arịrịọ achọrọ naanị maka ebumnuche atụmatụ. Nke a bụ ihe dị ka “ndepụta ọchịchọ” nke akpa ahụ, a na-ejikwa ya họrọ ọnụ ọnụ kacha dabara adaba. N'otu oge ahụ CPU ịgba nwere ike iji tụnyere a mgbazinye nkwekọrịta - ozugbo anyị họrọ a unit maka akpa, na enweghị ike gabiga oke ókè. Ma ebe a ka nsogbu na-ebilite ...

Otu esi etinye arịrịọ na oke na Kubernetes

Kubernetes na-eji usoro ntugharị (ịwụgharị okirikiri elekere) arụnyere n'ime kernel iji mejuputa oke CPU. Ọ bụrụ na ngwa gafere oke, agbanyere throttling (ya bụ, ọ na-enweta obere okirikiri CPU). A na-ahazi arịrịọ na oke maka ebe nchekwa dị iche iche, yabụ na ọ dị mfe ịchọpụta. Iji mee nke a, lelee ọnọdụ mmalite mmalite ikpeazụ nke pọd: ma ọ bụ “OOMKilled”. Ịtụgharị CPU adịghị mfe, ebe K8s na-eme naanị metrik dị site na iji, ọ bụghị site na otu.

Arịrịọ CPU

Oke CPU na mwepu ike na Kubernetes
Otu esi emejuputa arịrịọ CPU

Maka ịdị mfe, ka anyị leba anya na usoro a site na iji igwe nwere CPU 4-core dị ka ọmụmaatụ.

K8s na-eji usoro otu njikwa (cgroups) iji chịkwaa oke nke akụrụngwa (nchekwa na nhazi). Ụdị nhazi ọkwa dị maka ya: nwa ahụ na-eketa oke nke otu nne na nna. A na-echekwa nkọwa nkesa na sistemụ faịlụ mebere (/sys/fs/cgroup). N'ihe banyere processor nke a bụ /sys/fs/cgroup/cpu,cpuacct/*.

K8s na-eji faịlụ cpu.share iji ekenye akụrụngwa processor. N'ọnọdụ anyị, mgbọrọgwụ cgroup na-enweta 4096 mbak nke CPU akụrụngwa - 100% nke ike processor dị (1 isi = 1024; nke a bụ uru a kapịrị ọnụ). Otu mgbọrọgwụ na-ekesa akụrụngwa n'otu n'otu dabere na oke nke ụmụ ndị edebanyere aha na ya cpu.share, na ha, n'aka nke ha, na-eme otu ihe ahụ na ụmụ ha, wdg. Na ọnụ ụzọ Kubernetes, otu mgbọrọgwụ nwere ụmụ atọ: system.slice, user.slice и kubepods. A na-eji nkeji abụọ mbụ kesaa akụrụngwa n'etiti ibu sistemu dị oke egwu yana mmemme onye ọrụ na mpụga K8. Nke ikpeazụ - kubepods - nke Kubernetes mepụtara iji kesaa akụrụngwa n'etiti pọd.

Eserese dị n'elu na-egosi na obere ngalaba nke mbụ na nke abụọ natara nke ọ bụla 1024 òkè, ya na obere otu kuberpod ekenyela 4096 mbak Kedu ka nke a si kwe omume: mgbe niile, otu mgbọrọgwụ nwere ike ịnweta naanị 4096 òkè, na nchikota nke oke nke ụmụ ya karịrị nke ukwuu ọnụ ọgụgụ a (6144)? Isi ihe bụ na uru ahụ nwere ezi uche, yabụ onye nhazi Linux (CFS) na-eji ya kesaa akụrụngwa CPU nke ọma. N'ọnọdụ anyị, ìgwè abụọ mbụ na-enweta 680 ezigbo mbak (16,6% nke 4096), na kubepod na-enweta nke fọdụrụ 2736 mbak Ọ bụrụ na ọ dị ntakịrị oge, otu abụọ mbụ agaghị eji ihe ndị e kenyere.

Ọ dabara nke ọma, onye nhazi oge nwere usoro iji zere imefusị akụ CPU ejighi ya. Ọ na-enyefe ikike "na-abaghị uru" na ọdọ mmiri zuru ụwa ọnụ, nke a na-ekesa ya na otu ndị chọrọ ike nhazi ọzọ (nfefe na-eme na batches iji zere nkwụsịtụ). A na-etinye usoro yiri nke ahụ maka ụmụ ụmụ niile.

Nke a na usoro ana achi achi a ziri ezi nkesa nke processor ike na ana achi achi na ọ dịghị onye usoro "na-ezu" akụ si ndị ọzọ.

Oke CPU

N'agbanyeghị na nhazi nke oke na arịrịọ dị na K8 yiri, mmejuputa ha dị nnọọ iche: nke a kacha na-eduhie eduhie na akụkụ kacha nta edere.

K8 na-arụ ọrụ Usoro nhazi nke CFS iji mejuputa oke. A kọwapụtara ntọala ha na faịlụ cfs_period_us и cfs_quota_us na ndekọ cgroup (faịlụ ahụ dịkwa ebe ahụ cpu.share).

N'adịghị ka cpu.share, oke na-adabere na oge oge, ọ bụghịkwa na ike nhazi dịnụ. cfs_period_us na-akọwapụta oge nke oge (epoch) - ọ na-abụkarị 100000 μs (100 ms). Enwere nhọrọ iji gbanwee uru a na K8s, mana ọ dị naanị na alfa ugbu a. Onye nhazi oge na-eji epoch malitegharịa oke ejiri. Faịlụ nke abụọ cfs_quota_us, na-akọwapụta oge dị (oke) n'ime oge ọ bụla. Rịba ama na a kọwakwara ya na nkeji nkeji. Oke oke nwere ike gafere ogologo oge; N'ikwu ya n'ụzọ ọzọ, ọ nwere ike karịa 100 ms.

Ka anyị leba anya n'ọnọdụ abụọ na igwe 16-isi (ụdị kọmpụta kachasị anyị nwere na Omio):

Oke CPU na mwepu ike na Kubernetes
Ihe atụ 1: eriri 2 na oke 200 ms. Ọ dịghị throtling

Oke CPU na mwepu ike na Kubernetes
Ihe atụ 2: eri iri na oke 10 ms. Ntugharị na-amalite mgbe ms 200 gachara, a na-amaliteghachi ịnweta akụrụngwa nhazi mgbe 20ms ọzọ gachara

Ka anyị kwuo na ịtọọ oke CPU 2 kernel; Kubernetes ga-atụgharị uru a ka ọ bụrụ 200 ms. Nke a pụtara na akpa ahụ nwere ike iji oge CPU kacha nke 200ms na-enweghị throttling.

Na nke a bụ ebe ntụrụndụ na-amalite. Dịka e kwuru n'elu, oke dịnụ bụ 200 ms. Ọ bụrụ na ị na-arụ ọrụ n'otu n'otu iri eri na igwe 12-core (lee ihe atụ maka ihe atụ nke 2), ebe pọd ndị ọzọ niile na-abaghị uru, oke ahụ ga-agwụ naanị 20 ms (ebe 10 * 20 ms = 200 ms), na eriri niile nke pọd a ga-ekogidere. » (trotul) maka 80 ms na-esote. Nke a kpọtụrụ aha ahụhụ nhazi oge, n'ihi nke oke throttling na-eme na akpa enweghị ike imezu oke dị ugbu a.

Kedu ka esi enyocha throttling na pods?

Naanị banye na pọd wee mee ya cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods - ngụkọta oge nke nhazi oge;
  • nr_throttled - ọnụ ọgụgụ nke throttled oge na mejupụtara nr_periods;
  • throttled_time - ngụkọta oge throttled na nanoseconds.

Oke CPU na mwepu ike na Kubernetes

Kedu ihe na-eme n'ezie?

N'ihi ya, anyị na-enweta nnukwu throttling na ngwa niile. Mgbe ụfọdụ ọ na-abanye otu ugboro na ọkara ike karịa gbakọọ!

Nke a na-eduga na mperi dị iche iche - ọdịda nleba anya ịdị njikere, friji akpa, nkwụsị njikọ netwọkụ, nkwụsị oge n'ime oku ọrụ. Nke a n'ikpeazụ na-ebute ịba ụba latency yana ọnụego mperi dị elu.

Mkpebi na nsonaazụ

Ihe niile dị mfe ebe a. Anyị gbahapụrụ oke CPU wee malite imelite kernel OS na ụyọkọ na ụdị kachasị ọhụrụ, nke edoziri ahụhụ ahụ. Ọnụọgụ mperi (HTTP 5xx) na ọrụ anyị dara ozugbo nke ukwuu:

Njehie HTTP 5xx

Oke CPU na mwepu ike na Kubernetes
Njehie HTTP 5xx maka otu ọrụ dị oke mkpa

Oge nzaghachi p95

Oke CPU na mwepu ike na Kubernetes
Arịrịọ arịrịọ ọrụ dị mkpa, pasentị 95

Ụgwọ ọrụ

Oke CPU na mwepu ike na Kubernetes
Ọnụọgụ awa atụ eji

Kedu ihe bụ azụ?

Dị ka e kwuru ná mmalite isiokwu a:

Enwere ike ịdọrọ ihe atụ na ụlọ ọha ... Kubernetes na-eme ihe dị ka onye na-ere ahịa. Ma otu esi egbochi ndị nwe ụlọ ka esemokwu na ibe ha? Gịnị ma ọ bụrụ na otu n'ime ha, kwuo, kpebie ịgbaziri ụlọ ịsa ahụ maka ọkara ụbọchị?

Nke a bụ nwude. Otu akpa akpachapụghị anya nwere ike irichapụ ihe niile CPU dị na igwe. Ọ bụrụ na ị nwere nchịkọta ngwa smart (dịka ọmụmaatụ, JVM, Go, Node VM ahaziri nke ọma), mgbe ahụ nke a abụghị nsogbu: ị nwere ike ịrụ ọrụ n'ọnọdụ dị otú ahụ ogologo oge. Mana ọ bụrụ na emezighị ngwa nke ọma ma ọ bụ na emebeghi ya ma ọlị (FROM java:latest), ọnọdụ ahụ nwere ike ịpụ n'aka. Na Omio anyị nwere Dockerfiles base akpaghị aka nwere ntọala ndabara zuru oke maka nchịkọta asụsụ, yabụ okwu a adịghị.

Anyị na-akwado nyochaa metrics Jiri (ojiji, saturation na njehie), API igbu oge na ọnụego njehie. Gbaa mbọ hụ na nsonaazụ ga-emezu atụmanya.

zoro

Nke a bụ akụkọ anyị. Ihe ndị na-esonụ nyeere aka ịghọta ihe na-eme:

Kubernetes bug na-akọ:

Ị hụtụla nsogbu ndị yiri ya na omume gị ma ọ bụ nwee ahụmịhe metụtara throttling na gburugburu mmepụta ihe? Kekọrịta akụkọ gị na nkwupụta!

PS sitere na onye ntụgharị

Gụọkwa na blọọgụ anyị:

isi: www.habr.com

Tinye a comment