Papildu kube plÄnotÄja izveide ar pielÄgotu plÄnoÅ”anas noteikumu kopu
Kube plÄnotÄjs ir neatÅemama Kubernetes sastÄvdaļa, kas ir atbildÄ«gs par podziÅu plÄnoÅ”anu mezglos saskaÅÄ ar noteiktÄm politikÄm. Bieži vien Kubernetes klastera darbÄ«bas laikÄ mums nav jÄdomÄ par to, kuras politikas tiek izmantotas, lai ieplÄnotu podziÅus, jo noklusÄjuma kube plÄnotÄja politiku kopa ir piemÄrota lielÄkajai daļai ikdienas uzdevumu. TomÄr ir situÄcijas, kad mums ir svarÄ«gi precÄ«zi noregulÄt pÄkstu pieŔķirÅ”anas procesu, un ir divi veidi, kÄ paveikt Å”o uzdevumu:
Izveidojiet kube plÄnotÄju ar pielÄgotu noteikumu kopu
Uzrakstiet savu plÄnotÄju un iemÄciet tam strÄdÄt ar API servera pieprasÄ«jumiem
Å ajÄ rakstÄ es aprakstÄ«Å”u pirmÄ punkta ievieÅ”anu, lai atrisinÄtu kurtuvju nevienmÄrÄ«gas plÄnoÅ”anas problÄmu vienÄ no mÅ«su projektiem.
ÄŖss ievads par to, kÄ darbojas kube plÄnotÄjs
ÄŖpaÅ”i vÄrts atzÄ«mÄt faktu, ka kube-scheduler nav atbildÄ«gs par tieÅ”u podziÅu plÄnoÅ”anu ā tas ir atbildÄ«gs tikai par mezgla noteikÅ”anu, uz kura novietot podziÅu. Citiem vÄrdiem sakot, kube plÄnotÄja darba rezultÄts ir mezgla nosaukums, kuru tas atgriež API serverim, lai veiktu plÄnoÅ”anas pieprasÄ«jumu, un ar to arÄ« beidzas tÄ darbs.
PirmkÄrt, kube plÄnotÄjs izveido to mezglu sarakstu, kuros var ieplÄnot podziÅu saskaÅÄ ar predikÄtu politikÄm. TÄlÄk katrs mezgls no Ŕī saraksta saÅem noteiktu punktu skaitu saskaÅÄ ar prioritÄÅ”u politikÄm. RezultÄtÄ tiek atlasÄ«ts mezgls ar maksimÄlo punktu skaitu. Ja ir mezgli, kuriem ir vienÄds maksimÄlais punktu skaits, tiek atlasÄ«ts nejauÅ”s. PredikÄtu (filtrÄÅ”anas) un prioritÄÅ”u (vÄrtÄÅ”anas) politiku sarakstu un aprakstu var atrast dokumentÄcija.
ProblÄmas Ä·ermeÅa apraksts
Neraugoties uz lielo skaitu dažÄdu Kubernetes klasteru, kas tiek uzturÄts Nixys, mÄs pirmo reizi saskÄrÄmies ar plÄnoÅ”anas podu problÄmu tikai nesen, kad vienam no mÅ«su projektiem bija nepiecieÅ”ams izpildÄ«t lielu skaitu periodisku uzdevumu (~100 CronJob entÄ«tiju). Lai pÄc iespÄjas vienkÄrÅ”otu problÄmas aprakstu, par piemÄru Åemsim vienu mikropakalpojumu, kura ietvaros reizi minÅ«tÄ tiek palaists cron uzdevums, radot zinÄmu slodzi CPU. Lai izpildÄ«tu cron uzdevumu, tika pieŔķirti trÄ«s mezgli ar absolÅ«ti identiskiem raksturlielumiem (24 vCPU katrÄ).
TajÄ paÅ”Ä laikÄ nav iespÄjams precÄ«zi pateikt, cik ilgi CronJob tiks izpildÄ«ts, jo ievades datu apjoms pastÄvÄ«gi mainÄs. VidÄji normÄlas kube-plÄnotÄja darbÄ«bas laikÄ katrs mezgls palaiž 3-4 darba gadÄ«jumus, kas rada ~20-30% no katra mezgla CPU slodzes:
ProblÄma pati par sevi ir tÄda, ka dažkÄrt cron uzdevumu podi vairs netiek ieplÄnoti vienÄ no trim mezgliem. Tas nozÄ«mÄ, ka kÄdÄ brÄ«dÄ« vienam no mezgliem nebija plÄnots neviens pods, savukÄrt pÄrÄjos divos mezglos darbojÄs 6-8 uzdevuma kopijas, radot ~40-60% no CPU slodzes:
ProblÄma atkÄrtojÄs absolÅ«ti nejauÅ”i un dažkÄrt korelÄja ar brÄ«di, kad tika izlaista jauna koda versija.
Palielinot kube plÄnotÄja reÄ£istrÄÅ”anas lÄ«meni lÄ«dz 10. lÄ«menim (-v=10), mÄs sÄkÄm reÄ£istrÄt, cik punktu katrs mezgls ieguvis novÄrtÄÅ”anas procesÄ. ParastÄs plÄnoÅ”anas darbÄ«bas laikÄ Å¾urnÄlos var redzÄt Å”Ädu informÄciju:
Tie. spriežot pÄc žurnÄlos iegÅ«tÄs informÄcijas, katrs no mezgliem ieguva vienÄdu gala punktu skaitu un plÄnoÅ”anai tika izvÄlÄts nejauÅ”s. ProblÄmas plÄnoÅ”anas laikÄ Å¾urnÄli izskatÄ«jÄs Å”Ädi:
No tÄ var redzÄt, ka viens no mezgliem ieguva mazÄk gala punktu nekÄ citi, un tÄpÄc plÄnoÅ”ana tika veikta tikai diviem mezgliem, kas ieguva maksimÄlo punktu skaitu. TÄdÄjÄdi mÄs noteikti bijÄm pÄrliecinÄti, ka problÄma ir tieÅ”i pÄkstu plÄnoÅ”anÄ.
TÄlÄkais problÄmas risinÄÅ”anas algoritms mums bija acÄ«mredzams - analizÄjiet žurnÄlus, saprotiet, ar kÄdu prioritÄti mezgls nesaÅÄma punktus, un, ja nepiecieÅ”ams, pielÄgojiet noklusÄjuma kube plÄnotÄja politikas. TomÄr Å”eit mÄs saskaramies ar divÄm bÅ«tiskÄm grÅ«tÄ«bÄm:
MaksimÄlajÄ mežizstrÄdes lÄ«menÄ« (10) tiek atspoguļoti punkti, kas iegÅ«ti tikai par dažÄm prioritÄtÄm. IepriekÅ” minÄtajÄ Å¾urnÄlu izvilkumÄ var redzÄt, ka visÄm prioritÄtÄm, kas atspoguļotas žurnÄlos, mezgli iegÅ«st vienÄdu punktu skaitu parastajÄ un problÄmu plÄnoÅ”anÄ, taÄu gala rezultÄts problÄmu plÄnoÅ”anas gadÄ«jumÄ ir atŔķirÄ«gs. TÄdÄjÄdi varam secinÄt, ka par dažÄm prioritÄtÄm punktu skaitÄ«Å”ana notiek āaizkulisÄsā, un mums nav iespÄjas saprast, par kuru prioritÄti mezgls nesaÅÄma punktus. MÄs detalizÄti aprakstÄ«jÄm Å”o problÄmu izdot Kubernetes repozitorijs vietnÄ Github. RakstÄ«Å”anas laikÄ tika saÅemta atbilde no izstrÄdÄtÄjiem, ka Kubernetes v1.15,1.16, 1.17 un XNUMX atjauninÄjumos tiks pievienots reÄ£istrÄÅ”anas atbalsts.
Nav vienkÄrÅ”s veids, kÄ saprast, ar kuru konkrÄtu politiku kopu kube plÄnotÄjs paÅ”laik strÄdÄ. JÄ, iekÅ”Ä dokumentÄcija Å”is saraksts ir norÄdÄ«ts, taÄu tajÄ nav informÄcijas par to, kÄdi konkrÄti svari ir pieŔķirti katrai prioritÄÅ”u politikai. Varat skatÄ«t noklusÄjuma kube plÄnotÄja svarus vai rediÄ£Ät politikas tikai Å”eit pirmkodi.
Ir vÄrts atzÄ«mÄt, ka reiz mÄs varÄjÄm reÄ£istrÄt, ka mezgls nesaÅÄma punktus saskaÅÄ ar ImageLocalityPriority politiku, kas pieŔķir punktus mezglam, ja tam jau ir lietojumprogrammas palaiÅ”anai nepiecieÅ”amais attÄls. Tas nozÄ«mÄ, ka brÄ«dÄ«, kad tika izlaista jauna lietojumprogrammas versija, cron uzdevumam izdevÄs darboties divos mezglos, lejupielÄdÄjot tajos jaunu attÄlu no docker reÄ£istra, un tÄdÄjÄdi divi mezgli saÅÄma augstÄku gala rezultÄtu salÄ«dzinÄjumÄ ar treÅ”o. .
KÄ jau rakstÄ«ju iepriekÅ”, žurnÄlos mÄs neredzam informÄciju par ImageLocalityPriority politikas novÄrtÄjumu, tÄpÄc, lai pÄrbaudÄ«tu savu pieÅÄmumu, mÄs izmetÄm attÄlu ar jauno lietojumprogrammas versiju treÅ”ajÄ mezglÄ, pÄc kura plÄnoÅ”ana darbojÄs pareizi. . TieÅ”i ImageLocalityPriority politikas dÄļ plÄnoÅ”anas problÄma tika novÄrota diezgan reti, biežÄk tÄ bija saistÄ«ta ar kaut ko citu. TÄ kÄ mÄs nevarÄjÄm pilnÄ«bÄ atkļūdot katru no noklusÄjuma kube plÄnotÄja prioritÄÅ”u sarakstÄ esoÅ”ajÄm politikÄm, mums bija nepiecieÅ”ama elastÄ«ga pod plÄnoÅ”anas politiku pÄrvaldÄ«ba.
ProblÄmas paziÅojums
MÄs vÄlÄjÄmies, lai problÄmas risinÄjums bÅ«tu pÄc iespÄjas specifiskÄks, tas ir, galvenajÄm Kubernetes entÄ«tijÄm (Å”eit mÄs domÄjam noklusÄjuma kube plÄnotÄju) vajadzÄtu palikt nemainÄ«gÄm. MÄs negribÄjÄm atrisinÄt problÄmu vienÄ vietÄ un radÄ«t to citÄ. TÄdÄjÄdi mÄs nonÄcÄm pie diviem problÄmas risinÄÅ”anas variantiem, par kuriem tika ziÅots raksta ievadÄ - izveidojot papildu plÄnotÄju vai rakstot savu. GalvenÄ prasÄ«ba cron uzdevumu plÄnoÅ”anai ir vienmÄrÄ«gi sadalÄ«t slodzi pa trim mezgliem. Å o prasÄ«bu var izpildÄ«t, izmantojot esoÅ”Äs kube plÄnotÄja politikas, tÄpÄc, lai atrisinÄtu mÅ«su problÄmu, nav jÄgas rakstÄ«t savu plÄnotÄju.
NorÄdÄ«jumi papildu kube plÄnotÄja izveidei un izvietoÅ”anai ir aprakstÄ«ti dokumentÄcija. TomÄr mums Ŕķita, ka ar izvietoÅ”anas entÄ«tiju nepietiek, lai nodroÅ”inÄtu kļūdu toleranci tik svarÄ«ga pakalpojuma kÄ kube plÄnotÄjs darbÄ«bÄ, tÄpÄc mÄs nolÄmÄm izvietot jaunu kube plÄnotÄju kÄ Static Pod, kas tiktu tieÅ”i uzraudzÄ«ts. autors Kubelets. TÄdÄjÄdi jaunajam kube plÄnotÄjam ir Å”Ädas prasÄ«bas:
Pakalpojums ir jÄizvieto kÄ Static Pod visos klasteru galvenajos projektos
Kļūdu tolerance ir jÄnodroÅ”ina gadÄ«jumÄ, ja aktÄ«vais pods ar kube plÄnotÄju nav pieejams
PlÄnoÅ”anas galvenajai prioritÄtei jÄbÅ«t mezglÄ pieejamo resursu skaitam (LeastRequestedPriority)
RisinÄjuma ievieÅ”ana
Uzreiz ir vÄrts atzÄ«mÄt, ka mÄs veiksim visus darbus Kubernetes v1.14.7, jo Å Ä« ir versija, kas tika izmantota projektÄ. SÄksim ar manifesta rakstÄ«Å”anu mÅ«su jaunajam kube plÄnotÄjam. Å emsim par pamatu noklusÄjuma manifestu (/etc/kubernetes/manifests/kube-scheduler.yaml) un izveidosim to Å”ÄdÄ formÄ:
Apd un konteinera nosaukums ir mainīts uz kube-scheduler-cron
KÄ opcija tika definÄta, tika norÄdÄ«ts portu 10151 un 10159 izmantoÅ”ana hostNetwork: true un mÄs nevaram izmantot tos paÅ”us portus kÄ noklusÄjuma kube plÄnotÄjs (10251 un 10259)
Izmantojot parametru --config, mÄs norÄdÄ«jÄm konfigurÄcijas failu, ar kuru jÄsÄk pakalpojums
KonfigurÄta konfigurÄcijas faila (scheduler-custom.conf) un plÄnoÅ”anas politikas faila (scheduler-custom-policy-config.json) uzstÄdÄ«Å”ana no resursdatora
Neaizmirstiet, ka mÅ«su kube plÄnotÄjam bÅ«s nepiecieÅ”amas tiesÄ«bas, kas ir lÄ«dzÄ«gas noklusÄjuma tiesÄ«bÄm. RediÄ£Ät tÄ klastera lomu:
MÄs iestatÄ«jÄm plÄnotÄja nosaukumu kÄ pakalpojuma kube-scheduler-cron nosaukumu.
ParametrÄ lockObjectName jums arÄ« jÄiestata mÅ«su pakalpojuma nosaukums un jÄpÄrliecinÄs, ka parametrs leaderElect iestatÄ«t uz patiesu (ja jums ir viens galvenais mezgls, varat iestatÄ«t to uz false).
ParametrÄ ir norÄdÄ«ts ceļŔ uz failu ar plÄnoÅ”anas politiku aprakstu algorithmSource.
Ir vÄrts tuvÄk apskatÄ«t otro punktu, kurÄ mÄs rediÄ£Äjam atslÄgas parametrus leaderElection. Lai nodroÅ”inÄtu kļūdu toleranci, esam iespÄjojuÅ”i (leaderElect) lÄ«dera (galvenÄ) atlases process starp mÅ«su kube plÄnotÄja podiem, izmantojot tiem vienu galapunktu (resourceLock) ar nosaukumu kube-scheduler-cron (lockObjectName) kube sistÄmas nosaukumvietÄ (lockObjectNamespace). KÄ Kubernetes nodroÅ”ina galveno komponentu (ieskaitot kube plÄnotÄju) augstu pieejamÄ«bu, var uzzinÄt raksts.
PlÄnoÅ”anas politikas fails (scheduler-custom-policy-config.json)
KÄ jau rakstÄ«ju iepriekÅ”, mÄs varam uzzinÄt, ar kurÄm konkrÄtÄm politikÄm darbojas noklusÄjuma kube plÄnotÄjs, tikai analizÄjot tÄ kodu. Tas nozÄ«mÄ, ka mÄs nevaram iegÅ«t failu ar plÄnoÅ”anas politikÄm noklusÄjuma kube plÄnotÄjam tÄpat kÄ konfigurÄcijas failu. AprakstÄ«sim mÅ«s interesÄjoÅ”Äs plÄnoÅ”anas politikas failÄ /etc/kubernetes/scheduler-custom-policy-config.json Å”Ädi:
TÄdÄjÄdi kube plÄnotÄjs vispirms sastÄda to mezglu sarakstu, kuriem var ieplÄnot podziÅu saskaÅÄ ar GeneralPredicates politiku (kas ietver politiku PodFitsResources, PodFitsHostPorts, HostName un MatchNodeSelector politiku kopu). Un tad katrs mezgls tiek novÄrtÄts saskaÅÄ ar politiku kopu prioritÄÅ”u masÄ«vÄ. Lai izpildÄ«tu mÅ«su uzdevuma nosacÄ«jumus, uzskatÄ«jÄm, ka Å”Äds politiku kopums bÅ«tu optimÄlais risinÄjums. AtgÄdinÄÅ”u, ka politiku kopa ar to detalizÄtiem aprakstiem ir pieejama dokumentÄcija. Lai veiktu savu uzdevumu, varat vienkÄrÅ”i mainÄ«t izmantoto politiku kopu un pieŔķirt tÄm atbilstoÅ”us svarus.
MÄs nosauksim jaunÄ kube-plÄnotÄja manifestu, kuru izveidojÄm nodaļas sÄkumÄ, kube-scheduler-custom.yaml un ievietosim to Å”ÄdÄ ceÄ¼Ä /etc/kubernetes/manifests trÄ«s galvenajos mezglos. Ja viss ir izdarÄ«ts pareizi, Kubelet katrÄ mezglÄ palaidÄ«s podziÅu, un mÅ«su jaunÄ kube plÄnotÄja žurnÄlos mÄs redzÄsim informÄciju, ka mÅ«su politikas fails ir veiksmÄ«gi piemÄrots:
Creating scheduler from configuration: {{ } [{GeneralPredicates <nil>}] [{ServiceSpreadingPriority 1 <nil>} {EqualPriority 1 <nil>} {LeastRequestedPriority 1 <nil>} {NodePreferAvoidPodsPriority 10000 <nil>} {NodeAffinityPriority 1 <nil>}] [] 10 false}
Registering predicate: GeneralPredicates
Predicate type GeneralPredicates already registered, reusing.
Registering priority: ServiceSpreadingPriority
Priority type ServiceSpreadingPriority already registered, reusing.
Registering priority: EqualPriority
Priority type EqualPriority already registered, reusing.
Registering priority: LeastRequestedPriority
Priority type LeastRequestedPriority already registered, reusing.
Registering priority: NodePreferAvoidPodsPriority
Priority type NodePreferAvoidPodsPriority already registered, reusing.
Registering priority: NodeAffinityPriority
Priority type NodeAffinityPriority already registered, reusing.
Creating scheduler with fit predicates 'map[GeneralPredicates:{}]' and priority functions 'map[EqualPriority:{} LeastRequestedPriority:{} NodeAffinityPriority:{} NodePreferAvoidPodsPriority:{} ServiceSpreadingPriority:{}]'
Tagad atliek tikai norÄdÄ«t mÅ«su CronJob specifikÄcijÄ, ka mÅ«su jaunajam kube plÄnotÄjam ir jÄapstrÄdÄ visi pieprasÄ«jumi par tÄ aplikumu plÄnoÅ”anu:
Galu galÄ mÄs ieguvÄm papildu kube plÄnotÄju ar unikÄlu plÄnoÅ”anas politiku komplektu, kura darbu tieÅ”i uzrauga kubelets. TurklÄt starp mÅ«su kube plÄnotÄja podiem esam uzstÄdÄ«juÅ”i jauna vadÄ«tÄja vÄlÄÅ”anas gadÄ«jumam, ja vecais vadÄ«tÄjs kÄdu iemeslu dÄļ kļūst nepieejams.
RegulÄras lietojumprogrammas un pakalpojumi joprojÄm tiek ieplÄnoti, izmantojot noklusÄjuma kube plÄnotÄju, un visi cron uzdevumi ir pilnÄ«bÄ pÄrsÅ«tÄ«ti uz jauno. Cron uzdevumu radÄ«tÄ slodze tagad ir vienmÄrÄ«gi sadalÄ«ta visos mezglos. Å emot vÄrÄ, ka lielÄkÄ daļa cron uzdevumu tiek izpildÄ«ti tajos paÅ”os mezglos, kur galvenÄs projekta lietojumprogrammas, tas ir ievÄrojami samazinÄjis risku, ka podi tiks pÄrvietoti resursu trÅ«kuma dÄļ. PÄc papildu kube plÄnotÄja ievieÅ”anas problÄmas ar cron uzdevumu nevienmÄrÄ«gu plÄnoÅ”anu vairs neradÄs.