ProHoster > blog > Amministrazzjoni > Ħolqien ta 'kube-scheduler addizzjonali b'sett personalizzat ta' regoli ta 'skedar
Ħolqien ta 'kube-scheduler addizzjonali b'sett personalizzat ta' regoli ta 'skedar
Kube-scheduler huwa komponent integrali ta 'Kubernetes, li huwa responsabbli għall-iskedar ta' pods fuq in-nodi skont il-politiki speċifikati. Ħafna drabi, waqt it-tħaddim ta 'cluster Kubernetes, m'għandniex għalfejn naħsbu dwar liema politiki jintużaw biex jiġu skedati l-imżiewed, peress li s-sett ta' politiki tal-kube-scheduler default huwa adattat għall-biċċa l-kbira tal-kompiti ta 'kuljum. Madankollu, hemm sitwazzjonijiet meta huwa importanti għalina li nirfinaw il-proċess tal-allokazzjoni tal-miżwed, u hemm żewġ modi kif inwettqu dan il-kompitu:
Oħloq kube-scheduler b'sett ta' regoli apposta
Ikteb l-iskeduler tiegħek u għallimha taħdem mat-talbiet tas-server API
F'dan l-artikolu, ser niddeskrivi l-implimentazzjoni ta 'l-ewwel punt biex issolvi l-problema ta' skedar irregolari ta 'fuklar fuq wieħed mill-proġetti tagħna.
Introduzzjoni qasira għal kif jaħdem kube-scheduler
Ta 'min jinnota b'mod speċjali l-fatt li kube-scheduler mhuwiex responsabbli għall-iskedar direttament tal-miżwed - huwa responsabbli biss biex jiddetermina n-nodu li fuqu jitqiegħed il-pod. Fi kliem ieħor, ir-riżultat tax-xogħol ta 'kube-scheduler huwa l-isem tan-node, li jirritorna lis-server tal-API għal talba ta' skedar, u hemmhekk jintemm ix-xogħol tiegħu.
L-ewwel, kube-scheduler jikkompila lista ta 'nodi li fuqhom il-pod jista' jiġi skedat skont il-politiki tal-predikati. Sussegwentement, kull nodu minn din il-lista jirċievi ċertu numru ta 'punti skont il-politiki tal-prijoritajiet. Bħala riżultat, jintgħażel in-nodu bin-numru massimu ta 'punti. Jekk ikun hemm nodi li għandhom l-istess punteġġ massimu, jintgħażel wieħed każwali. Lista u deskrizzjoni tal-predikati (filtrazzjoni) u prijoritajiet (score) jistgħu jinstabu fi dokumentazzjoni.
Deskrizzjoni tal-korp problema
Minkejja n-numru kbir ta 'raggruppamenti ta' Kubernetes differenti li qed jinżammu f'Nixys, l-ewwel iltqajna mal-problema tal-iskedar tal-miżwed biss reċentement, meta wieħed mill-proġetti tagħna kellu bżonn imexxi numru kbir ta 'kompiti perjodiċi (~ 100 entitajiet CronJob). Biex nissimplifikaw id-deskrizzjoni tal-problema kemm jista 'jkun, se nieħdu bħala eżempju mikroservizz wieħed, li fih jitnieda kompitu cron darba fil-minuta, u joħloq xi tagħbija fuq is-CPU. Biex tmexxi l-kompitu cron, ġew allokati tliet nodi b'karatteristiċi assolutament identiċi (24 vCPU fuq kull wieħed).
Fl-istess ħin, huwa impossibbli li wieħed jgħid b'eżattezza kemm se jdum il-CronJob biex jesegwixxi, peress li l-volum tad-dejta tal-input qed jinbidel kontinwament. Bħala medja, waqt it-tħaddim normali ta 'kube-scheduler, kull nodu jmexxi 3-4 każijiet ta' xogħol, li joħolqu ~ 20-30% tat-tagħbija fuq is-CPU ta 'kull node:
Il-problema nnifisha hija li xi drabi l-imżiewed tal-kompitu cron ma baqgħux jiġu skedati fuq wieħed mit-tliet nodi. Jiġifieri, f'xi punt fiż-żmien, ma kienx ippjanat pod wieħed għal wieħed min-nodi, filwaqt li fuq iż-żewġ nodi l-oħra kienu qed jaħdmu 6-8 kopji tal-kompitu, li ħolqu ~ 40-60% tat-tagħbija tas-CPU:
Il-problema rrepetiet bi frekwenza assolutament każwali u okkażjonalment kienet korrelata mal-mument li ġiet rilaxxata verżjoni ġdida tal-kodiċi.
Billi żiedet il-livell tal-illoggjar tal-kube-scheduler għal-livell 10 (-v=10), bdejna nirreġistraw kemm kull node kiseb matul il-proċess ta 'evalwazzjoni. Waqt l-operazzjoni normali tal-ippjanar, l-informazzjoni li ġejja setgħet tidher fir-reġistru:
Dawk. ġġudikati mill-informazzjoni miksuba mir-zkuk, kull wieħed mill-nodi skorja numru ugwali ta 'punti finali u wieħed każwali ntgħażel għall-ippjanar. Fiż-żmien ta 'ppjanar problematiku, ir-zkuk dehru bħal dan:
Minnha jidher li wieħed min-nodi kiseb inqas punti finali mill-oħrajn, u għalhekk l-ippjanar sar biss għaż-żewġ nodi li kisbu l-ogħla punteġġ. Għalhekk, konna definittivament konvinti li l-problema tinsab preċiżament fl-iskedar tal-miżwed.
L-algoritmu ulterjuri biex issolvi l-problema kien ovvju għalina - janalizza r-zkuk, tifhem b'liema prijorità n-node ma kisebx punti u, jekk meħtieġ, aġġusta l-politiki tal-kube-scheduler default. Madankollu, hawnhekk qed niffaċċjaw żewġ diffikultajiet sinifikanti:
Fil-livell massimu tal-qtugħ tas-siġar (10), il-punti miksuba biss għal xi prijoritajiet huma riflessi. Fis-silta ta 'hawn fuq ta' zkuk, tista 'tara li għall-prijoritajiet kollha riflessi fir-zkuk, in-nodi jiskurjaw l-istess numru ta' punti fl-iskedar normali u tal-problema, iżda r-riżultat finali fil-każ ta 'ppjanar tal-problema huwa differenti. Għalhekk, nistgħu nikkonkludu li għal xi prijoritajiet, il-punteġġ iseħħ "wara l-kwinti", u m'għandna l-ebda mod biex nifhmu għal liema prijorità n-nodu ma kisebx punti. Iddeskrivejna din il-problema fid-dettall fi kwistjoni Repożitorju Kubernetes fuq Github. Fil-ħin tal-kitba, waslet tweġiba mill-iżviluppaturi li l-appoġġ għall-illoggjar se jiżdied fl-aġġornamenti ta 'Kubernetes v1.15,1.16, 1.17 u XNUMX.
M'hemm l-ebda mod faċli biex tifhem liema sett speċifiku ta' politiki qed jaħdem bihom bħalissa kube-scheduler. Iva, fi dokumentazzjoni din il-lista hija elenkata, iżda ma fihax informazzjoni dwar liema piżijiet speċifiċi huma assenjati għal kull waħda mill-politiki ta' prijoritajiet. Tista 'tara l-piżijiet jew teditja l-politiki tal-kube-scheduler default biss fi kodiċi tas-sors.
Ta 'min jinnota li ladarba stajna nirreġistraw li node ma rċievax punti skont il-politika ImageLocalityPriority, li tagħti punti lil node jekk diġà għandu l-immaġni meħtieġa biex iħaddem l-applikazzjoni. Jiġifieri, fiż-żmien li ħarġet verżjoni ġdida tal-applikazzjoni, il-kompitu cron irnexxielu jaħdem fuq żewġ nodi, tniżżilhom immaġni ġdida mir-reġistru docker, u għalhekk żewġ nodi rċevew punteġġ finali ogħla meta mqabbel mat-tielet. .
Kif ktibt hawn fuq, fir-zkuk ma narawx informazzjoni dwar l-evalwazzjoni tal-politika ImageLocalityPriority, għalhekk sabiex niċċekkjaw is-suppożizzjoni tagħna, tajna l-immaġni bil-verżjoni l-ġdida tal-applikazzjoni fuq it-tielet nodu, u wara l-iskedar ħadmet b'mod korrett . Kien preċiżament minħabba l-politika ImageLocalityPriority li l-problema tal-iskedar kienet osservata pjuttost rari; aktar spiss kienet assoċjata ma 'xi ħaġa oħra. Minħabba l-fatt li ma stajniex niddibaggjaw bis-sħiħ kull waħda mill-politiki fil-lista tal-prijoritajiet tal-kube-scheduler default, kellna ħtieġa għal ġestjoni flessibbli tal-politiki tal-iskedar tal-pods.
Dikjarazzjoni tal-problema
Ridna li s-soluzzjoni għall-problema tkun speċifika kemm jista 'jkun, jiġifieri, l-entitajiet ewlenin ta' Kubernetes (hawnhekk irridu nfissru l-kube-scheduler default) għandhom jibqgħu mhux mibdula. Ma ridniex insolvu problema f’post u noħolquha f’ieħor. Għalhekk, wasalna għal żewġ għażliet biex insolvu l-problema, li tħabbru fl-introduzzjoni għall-artikolu - il-ħolqien ta 'scheduler addizzjonali jew il-kitba tiegħek. Ir-rekwiżit ewlieni għall-iskedar tal-kompiti cron huwa li t-tagħbija titqassam b'mod uniformi fuq tliet nodi. Dan ir-rekwiżit jista 'jiġi sodisfatt minn politiki eżistenti ta' kube-scheduler, għalhekk biex issolvi l-problema tagħna m'hemm l-ebda punt li tikteb l-iskeduler tiegħek stess.
L-istruzzjonijiet għall-ħolqien u l-Iskjerament ta’ kube-scheduler addizzjonali huma deskritti fi dokumentazzjoni. Madankollu, dehrilna li l-entità Deployment ma kinitx biżżejjed biex tiżgura t-tolleranza tal-ħsarat fl-operat ta’ servizz kritiku bħal kube-scheduler, għalhekk iddeċidejna li niskjeraw kube-scheduler ġdid bħala Static Pod, li jkun immonitorjat direttament minn Kubelet. Għalhekk, għandna r-rekwiżiti li ġejjin għall-kube-scheduler il-ġdid:
Is-servizz irid jiġi skjerat bħala Static Pod fuq il-master masters kollha tal-clusters
Għandha tiġi pprovduta tolleranza għall-ħsarat f'każ li l-pod attiv b'kube-scheduler ma jkunx disponibbli
Il-prijorità ewlenija meta tippjana għandha tkun in-numru ta’ riżorsi disponibbli fuq in-node (LeastRequestedPriority)
Implimentazzjoni tas-Soluzzjoni
Ta’ min jinnota mill-ewwel li se nwettqu x-xogħol kollu f’Kubernetes v1.14.7, għax Din hija l-verżjoni li ntużat fil-proġett. Nibdew billi niktbu manifest għall-kube-scheduler il-ġdid tagħna. Ejja nieħdu l-manifest default (/etc/kubernetes/manifests/kube-scheduler.yaml) bħala bażi u ġibu fil-forma li ġejja:
Bidla l-isem tal-pod u l-kontenitur għal kube-scheduler-cron
Speċifikat l-użu tal-portijiet 10151 u 10159 hekk kif ġiet definita l-għażla hostNetwork: true u ma nistgħux nużaw l-istess portijiet bħall-kube-scheduler default (10251 u 10259)
Bl-użu tal-parametru --config, speċifikajna l-fajl tal-konfigurazzjoni li bih għandu jinbeda s-servizz
Issa ejja nitkellmu dwar x'għandu jkun hemm fil-fajl tal-konfigurazzjoni u l-fajl tal-politika tal-iskedar:
Fajl tal-konfigurazzjoni (scheduler-custom.conf)
Biex tikseb il-konfigurazzjoni default kube-scheduler, trid tuża l-parametru --write-config-to ta ' dokumentazzjoni. Aħna npoġġu l-konfigurazzjoni li tirriżulta fil-fajl /etc/kubernetes/scheduler-custom.conf u nnaqqsuha għall-forma li ġejja:
Fil-parametru lockObjectName għandek bżonn ukoll li tissettja l-isem tas-servizz tagħna u kun żgur li l-parametru leaderElect issettjat għal veru (jekk għandek node prinċipali wieħed, tista 'tissettjaha għal falza).
Ta 'min nagħtu ħarsa aktar mill-qrib lejn it-tieni punt, fejn neditjaw il-parametri għaċ-ċavetta leaderElection. Biex niżguraw it-tolleranza tal-ħsarat, ippermettejna (leaderElect) il-proċess ta 'għażla ta' mexxej (kaptan) bejn il-miżwed tal-kube-scheduler tagħna bl-użu ta 'endpoint wieħed għalihom (resourceLock) jismu kube-scheduler-cron (lockObjectName) fl-ispazju tal-isem tas-sistema kube (lockObjectNamespace). Kif Kubernetes jiżgura disponibbiltà għolja tal-komponenti ewlenin (inkluż kube-scheduler) jista 'jinstab fih artikolu.
Fajl tal-politika tal-iskedar (scheduler-custom-policy-config.json)
Kif ktibt qabel, nistgħu nsibu liema politiki speċifiċi jaħdem bihom il-kube-scheduler default biss billi janalizzaw il-kodiċi tiegħu. Jiġifieri, ma nistgħux niksbu fajl b'politiki ta 'skedar għall-kube-scheduler default bl-istess mod bħal fajl ta' konfigurazzjoni. Ejja niddeskrivu l-politiki tal-iskedar li aħna interessati fihom fil-fajl /etc/kubernetes/scheduler-custom-policy-config.json kif ġej:
Għalhekk, kube-scheduler l-ewwel jikkompila lista ta 'nodi li għalihom pod jista' jiġi skedat skont il-politika GeneralPredicates (li tinkludi sett ta 'politiki PodFitsResources, PodFitsHostPorts, HostName, u MatchNodeSelector). U mbagħad kull nodu jiġi evalwat skont is-sett ta 'politiki fil-firxa tal-prijoritajiet. Biex nissodisfaw il-kundizzjonijiet tal-kompitu tagħna, aħna qiesna li sett ta' politiki bħal dan ikun l-aħjar soluzzjoni. Ħa nfakkarkom li sett ta' politiki bid-deskrizzjonijiet dettaljati tagħhom huwa disponibbli fi dokumentazzjoni. Biex twettaq il-kompitu tiegħek, tista 'sempliċement tibdel is-sett ta' politiki użati u tassenja lilhom piżijiet xierqa.
Se nsejħu l-manifest tal-kube-scheduler il-ġdid, li ħloqna fil-bidu tal-kapitolu, kube-scheduler-custom.yaml u poġġih fit-triq li ġejja /etc/kubernetes/manifests fuq tliet nodi prinċipali. Jekk kollox isir b'mod korrett, Kubelet se jniedi pod fuq kull nodu, u fir-reġistri tal-kube-scheduler il-ġdid tagħna se naraw informazzjoni li l-fajl tal-politika tagħna ġie applikat b'suċċess:
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:{}]'
Issa li jibqa 'huwa li tindika fl-ispeċifikazzjoni tal-CronJob tagħna li t-talbiet kollha għall-iskedar tal-miżwed tagħha għandhom jiġu pproċessati mill-kube-scheduler il-ġdid tagħna:
Fl-aħħar mill-aħħar, aħna ltqajna kube-scheduler addizzjonali b'sett uniku ta 'politiki ta' skedar, li x-xogħol tiegħu huwa mmonitorjat direttament mill-kubelet. Barra minn hekk, waqqafna l-elezzjoni ta 'mexxej ġdid bejn il-miżwed tal-kube-scheduler tagħna f'każ li l-mexxej l-antik ma jkunx disponibbli għal xi raġuni.
L-applikazzjonijiet u s-servizzi regolari jkomplu jiġu skedati permezz tal-kube-scheduler default, u l-kompiti kollha cron ġew kompletament trasferiti għal dak il-ġdid. It-tagħbija maħluqa mill-kompiti cron issa hija mqassma b'mod ugwali fin-nodi kollha. Meta wieħed iqis li l-biċċa l-kbira tal-kompiti cron huma esegwiti fuq l-istess nodi bħall-applikazzjonijiet ewlenin tal-proġett, dan naqqas b'mod sinifikanti r-riskju li jiċċaqilqu l-imżiewed minħabba nuqqas ta 'riżorsi. Wara l-introduzzjoni ta 'kube-scheduler addizzjonali, problemi bi skedar irregolari tal-kompiti cron m'għadhomx qamu.