TĂ€iendava kube-scheduler'i loomine kohandatud planeerimisreeglitega

TĂ€iendava kube-scheduler'i loomine kohandatud planeerimisreeglitega

Kube-scheduler on Kubernetes'i hĂ€davajalik komponent, mis vastutab pod'ide planeerimise eest sĂ”lmedele vastavalt mÀÀratud poliitikatele. Tihti ei pea me Kubernetes'i klastrit kasutades mĂ”tlema, milliste poliitikate alusel pod'e planeeritakse, kuna vaikimisi kube-scheduler'i poliitikakomplekt sobib enamikeks igapĂ€evasteks ĂŒlesanneteks. Siiski on olukordi, kus on oluline tĂ€pselt juhtida pod'ide jaotamise protsessi, ning selle saavutamiseks on kaks teed:

  1. Luua kube-scheduler kohandatud reeglite komplektiga
  2. Kirjutada oma scheduler ja Ôpetada seda töötama API-serveri pÀringutega

Selles artiklis kirjeldan ma esimese punkti elluviimist, et lahendada ĂŒhtlaste pod'ide planeerimise probleem meie projektides.

LĂŒhike sissejuhatus kube-scheduler'i tööle

Tuleb erilist tĂ€helepanu pöörata sellele, et kube-scheduler ei vastuta pod'ide otsemise planeerimise eest — see vastutab ainult selle mÀÀramise eest, millisele nodile pod'i paigutada. TeisisĂ”nu, kube-scheduler'i töö tulemuseks on nodi nimi, mille ta tagastab API-serverile planeerimise pĂ€ringule ja sellega tema töö lĂ”ppeb.

Esmalt koostab kube-scheduler nodide nimekirja, kuhu pod vÔib olla planeeritud vastavalt predicate poliitikatele. SeejÀrel saab iga nod, mis on selles nimekirjas, teatud hulga punkte vastavalt prioriteet poliitikatele. Tulemusena valitakse nod, mis on kogunud maksimaalse arvu punkte. Kui on nod, mis on saanud sama maksimumpunktide arvu, valitakse juhuslik. Predicate (filtreerimise) ja prioriteetide (hindamise) poliitikate nimekirja ja kirjeldusega saab tutvuda dokumentatsioonis.

Probleemi kirjelduse tekst

Hoolimata Nixysis teenindatavatest erinevatest Kubernetes klastritest, olime podide planeerimise probleemiga esmakordselt silmitsi alles hiljuti, kui ĂŒhe meie projekti raames tekkis vajadus kĂ€ivitada suur hulk perioodilisi ĂŒlesandeid (~100 CronJobi ĂŒksust). Probleemi vĂ”imalikult lihtsaks kirjeldamiseks toome nĂ€iteks ĂŒhe mikroteenuse, mille raames kĂ€ivitub iga minuti tagant cron-ĂŒlesanne, mis tekitab CPU-le teatud koormuse. Cron-ĂŒlesande kĂ€itamiseks eraldati kolm tĂ€iesti identset sĂ”lme (igal 24 vCPU-d).

Sellegipoolest ei saa tĂ€pselt öelda, kui kaua CronJobi tĂ€itmine kestab, kuna sisendandmete maht muutub pidevalt. Keskmiselt, normaalses kube-schedulear'i töö korral töötab igal sĂ”lmel 3-4 ĂŒlesande eksemplari, mis tekitavad 20-30% koormust iga sĂ”lme CPU-le:

TĂ€iendava kube-scheduler'i loomine kohandatud planeerimisreeglitega

Probleem seisneb selles, et mĂ”nikord peatusid cron-tööde podid ĂŒhe kolmest noodist planeerimast. See tĂ€hendab, et mingil hetkel ei planeeritud ĂŒhtegi poodi ĂŒhele nodile, samas kui kahel teisel noodil töötas 6-8 ĂŒlesande koopia, tekitades umbes 40-60% koormust CPU-le:

TĂ€iendava kube-scheduler'i loomine kohandatud planeerimisreeglitega

Probleem kordus tÀiesti juhuslikult ja harva korreleerus uue koodi versiooni vÀljalaskmise hetkega.

Suurendades kube-scheduler’i logimist 10. tasemele (-v=10), hakkasime fikseerima, kui palju punkte iga node hindamisprotsessis kogub. Tavalise planeerimise töö ajal vĂ”is logides nĂ€ha jĂ€rgmisi andmeid:

resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: BalancedResourceAllocation, maht 23900 millicores 67167186944 mÀlu baiti, kogusumma taotlus 1387 millicores 4161694720 mÀlu baiti, skoor 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: BalancedResourceAllocation, maht 23900 millicores 67167186944 mÀlu baiti, kogusumma taotlus 1347 millicores 4444810240 mÀlu baiti, skoor 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: LeastResourceAllocation, maht 23900 millicores 67167186944 mÀlu baiti, kogusumma taotlus 1387 millicores 4161694720 mÀlu baiti, skoor 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: BalancedResourceAllocation, maht 23900 millicores 67167186944 mÀlu baiti, kogusumma taotlus 1687 millicores 4790840320 mÀlu baiti, skoor 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: LeastResourceAllocation, maht 23900 millicores 67167186944 mÀlu baiti, kogusumma taotlus 1347 millicores 4444810240 mÀlu baiti, skoor 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: LeastResourceAllocation, maht 23900 millicores 67167186944 mÀlu baiti, kogusumma taotlus 1687 millicores 4790840320 mÀlu baiti, skoor 9
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: NodeAffinityPriority, skoor: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: NodeAffinityPriority, skoor: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: NodeAffinityPriority, skoor: (0)                                                                                       
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node01: InterPodAffinityPriority, skoor: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: TaintTolerationPriority, skoor: (10)                                                                                   
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node02: InterPodAffinityPriority, skoor: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: TaintTolerationPriority, skoor: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node01: SelectorSpreadPriority, skoor: (10)                                                                                                        
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node03: InterPodAffinityPriority, skoor: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: TaintTolerationPriority, skoor: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node02: SelectorSpreadPriority, skoor: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node03: SelectorSpreadPriority, skoor: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: SelectorSpreadPriority, skoor: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: SelectorSpreadPriority, skoor: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: SelectorSpreadPriority, skoor: (10)                                                                                    
generic_scheduler.go:781] Host Node01 -> skoor 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 -> skoor 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node03 -> skoor 100043

See, logidest saadud teabe pÔhjal saavutas iga nodi vÔrdselt palju lÔpppunne ja planeerimise jaoks valiti juhuslik variant. Probleemse planeerimise hetkel nÀgid logid vÀlja jÀrgmiselt:

resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: Tasakaalustatud Ressursi Jagamine, maht 23900 millicore 67167186944 mÀlubaiti, kogu nÔue 1587 millicore 4581125120 mÀlubaiti, skoor 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: Tasakaalustatud Ressursi Jagamine, maht 23900 millicore 67167186944 mÀlubaiti, kogu nÔue 1087 millicore 3532549120 mÀlubaiti, skoor 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: Minimaalne Ressursi Jagamine, maht 23900 millicore 67167186944 mÀlubaiti, kogu nÔue 1587 millicore 4581125120 mÀlubaiti, skoor 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: Tasakaalustatud Ressursi Jagamine, maht 23900 millicore 67167186944 mÀlubaiti, kogu nÔue 987 millicore 3322833920 mÀlubaiti, skoor 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: Minimaalne Ressursi Jagamine, maht 23900 millicore 67167186944 mÀlubaiti, kogu nÔue 987 millicore 3322833920 mÀlubaiti, skoor 9 
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: Minimaalne Ressursi Jagamine, maht 23900 millicore 67167186944 mÀlubaiti, kogu nÔue 1087 millicore 3532549120 mÀlubaiti, skoor 9
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node03: InterPod Ühtsuse Prioriteet, skoor: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node02: InterPod Ühtsuse Prioriteet, skoor: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node01: InterPod Ühtsuse Prioriteet, skoor: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: TaintTolerationPrioriteet, skoor: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node03: Selektori Leviku Prioriteet, skoor: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node02: Selektori Leviku Prioriteet, skoor: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: TaintTolerationPrioriteet, skoor: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node01: Selektori Leviku Prioriteet, skoor: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: Node Ühtsuse Prioriteet, skoor: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: Selektori Leviku Prioriteet, skoor: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: Selektori Leviku Prioriteet, skoor: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: TaintTolerationPrioriteet, skoor: (10)                                                                                   
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: Node Ühtsuse Prioriteet, skoor: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: Node Ühtsuse Prioriteet, skoor: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: Selektori Leviku Prioriteet, skoor: (10)                                                                                    
generic_scheduler.go:781] Host Node03 => skoor 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 => skoor 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node01 => skoor 100038

Millest tuleneb, et ĂŒks sĂ”lmedest kogus vĂ€hem punkte kui teised ning seetĂ”ttu toimus planeerimine vaid kahe sĂ”lme peal, mis kogusid maksimaalse skoori. Nii saime veenduda, et probleem on just podide planeerimises.

JĂ€rgmine lahenduse algoritm oli meie jaoks ilmne — analĂŒĂŒsida logisid, mĂ”ista, millise prioriteedi tĂ”ttu sĂ”lm punkte ei kogunud ja vajadusel kohandada kuberneti kube-scheduler'i pĂ”hikeerukuse poliitikaid. Siiski seisisime silmitsi kahe olulise vĂ€ljakutsega:

  1. Maksimaalsel logimise tasemel (10) kajastatakse punktide komplekti ainult teatud prioriteetide pĂ”hjal. Ülaltoodud logide lĂ”igus vĂ”ib mĂ€rgata, et kĂ”ikide logides kajastatud prioriteetide puhul saavutavad nodid tavapĂ€rase ja probleemse planeerimise juures sama arvu punkte, kuid probleemse planeerimise korral on lĂ”pptulemus erinev. Seega vĂ”ib jĂ€reldada, et teatud prioriteetide puhul toimub punktide arvestamine „kaamera taguses”, ja meil puudub igasugune vĂ”imalus mĂ”ista, mille tĂ”ttu nodid punkte ei kogunud. Seda probleemi oleme kirjeldanud probleem Kubernetes'e Githubi hoidlas. Artikli kirjutamise hetkel oli arendajatelt saadud vastus, et logimise tugi lisatakse Kubernetes v1.15, 1.16 ja 1.17 uuendustes.
  2. Ei ole lihtsat viisi mÔista, millise konkreetse poliitikakomplektiga kube-scheduler praegu töötab. Jah, see loetelu on olemas, kuid selles ei ole teavet, millised konkreetsed kaalud on mÀÀratud igale prioriteedi poliitikale. NÀha kaalusid vÔi muuta vaikimisi kube-scheduler'i poliitikaid on vÔimalik ainult dokumentatsioonis see selles loetletud, kuid seal pole teavet, millised konkreetsed kaalud on mÀÀratud iga prioriteedi poliitika jaoks. NÀhtavad kaalud vÔi redigeerida vaikimisi kube-scheduler'i poliitikaid saab ainult allikates.

On tĂ€helepanuvÀÀrne, et ĂŒks kord suutsime fikseerida, et sĂ”lm (node) ei kogunud punkte ImageLocalityPriority poliitika jĂ€rgi, mis annab sĂ”lmele punkte, kui sellel on juba olemas vajalik pilt rakenduse kĂ€ivitamiseks. See tĂ€hendab, et uue rakenduse versiooni vĂ€ljalaske hetkel jĂ”udis cron-ĂŒlesanne kĂ€ivituda kahel sĂ”lmel, laadides neile uue pildi docker registrist alla, ja seega said need kaks sĂ”lme vĂ”rreldes kolmandaga suurema lĂ”pppunktide arvu.

Nagu ma juba varem mainisin, ei nÀe me logides teavet ImageLocalityPriority poliitika hindamise kohta. SeetÔttu, et lÔplikult oma oletust kontrollida, tÔmbasime uue rakenduse versiooni pildi kolmandale sÔlmele, mille jÀrel planeerimine hakkas korralikult tööle. Just ImageLocalityPriority poliitika tÔttu esines planeerimise probleem piisavalt harva, enamasti oli see seotud millegagi muuga. Kuna me ei saanud tÀielikult iga poliitika prioriteetide loendis debaida (debug), tekkis vajadus paindliku podide planeerimise poliitikate haldamise jÀrele.

Ülesande seadmine

Soovisime, et probleemide lahendamine oleks vĂ”imalikult sihipĂ€rane, st Kubernetes'i pĂ”hielemendid (siin mĂ”eldakse vaikimisi kube-scheduler'it) peaksid jÀÀma muutumatuks. Me ei soovinud probleemi lahendada ĂŒhes kohas ja teises kohas luua uut. SeetĂ”ttu jĂ”udsime kahe probleemilahenduseni, mis olid artikli sissejuhatuses vĂ€lja toodud — lisascheduler'i loomine vĂ”i oma kirjutamine. Peamine nĂ”ue cron-tööde planeerimisele on koormuse ĂŒhtlane jaotamine kolme nodi vahel. Seda nĂ”uet saab rahuldada olemasolevate kube-scheduler'i poliitikate abil, seega ei ole meie ĂŒlesande lahendamiseks mĂ”tet kirjutada oma scheduling'i programmi.

Lisakube-scheduler'i loomise ja juurutamise juhised on kirjeldatud dokumentatsioonis. Siiski nÀgime, et juurutuse elemendid ei ole piisavad sellise kriitilise teenuse nagu kube-scheduler tööhÀirekindluse tagamiseks, mistÔttu otsustasime juurutada uue kube-scheduler'i Static Pod'ina, mida jÀlgib otse Kubelet. Seega tulid meil vÀlja jÀrgmised nÔuded uuele kube-scheduler'ile:

  1. Teenust tuleb juurutada Static Pod'ina kÔigis kinnitusklastri mestreides.
  2. Aktive pod'i puudumise korral tuleb tagada tÔrgeteta töö.
  3. Planeerimisel peaks peamiseks prioriteediks olema sÔlme saadaval olevate ressursside hulk (LeastRequestedPriority).

Lahenduse rakendamine.

Oluline on mĂ€rkida, et kĂ”ik tööd teeme Kubernetes v1.14.7 versioonis, kuna just seda versiooni kasutati projektis. Alustame oma uue kube-scheduler’i jaoks manifesti kirjutamist. VĂ”tame aluseks vaikimisi manifesti (/etc/kubernetes/manifests/kube-scheduler.yaml) ja kohandame selle jĂ€rgmisesse vormi:

tĂŒĂŒp: Pod
metaandmed:
  sildid:
    komponent: scheduleri
    tase: kontrolli-tasand
  nimi: kube-scheduler-cron
  nimetusruum: kube-system
spetsifikatsioon:
      konteinerid:
      - kÀsk:
        - /usr/local/bin/kube-scheduler
        - --aadress=0.0.0.0
        - --port=10151
        - --secure-port=10159
        - --config=/etc/kubernetes/scheduler-custom.conf
        - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
        - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
        - --v=2
        pilt: gcr.io/google-containers/kube-scheduler:v1.14.7
        pilditÔmbepoliitika: IfNotPresent
        elusuurimis:
          ebaĂ”nnestumise kĂŒnnis: 8
          httpGet:
            host: 127.0.0.1
            tee: /healthz
            port: 10151
            skeem: HTTP
          algne viivitus sekundites: 15
          viivituse sekundid: 15
        nimi: kube-scheduler-cron-container
        ressursid:
          nÔudmised:
            cpu: '0.1'
        mahuMĂ€ed:
        - mountPath: /etc/kubernetes/scheduler.conf
          nimi: kube-config
          ainultLugemiseks: true
        - mountPath: /etc/localtime
          nimi: localtime
          ainultLugemiseks: true
        - mountPath: /etc/kubernetes/scheduler-custom.conf
          nimi: scheduler-config
          ainultLugemiseks: true
        - mountPath: /etc/kubernetes/scheduler-custom-policy-config.json
          nimi: policy-config
          ainultLugemiseks: true
      hostNetwork: true
      prioriteediKlassiNimi: system-cluster-critical
      mahud:
      - hostPath:
          tee: /etc/kubernetes/scheduler.conf
          tĂŒĂŒp: FileOrCreate
        nimi: kube-config
      - hostPath:
          tee: /etc/localtime
        nimi: localtime
      - hostPath:
          tee: /etc/kubernetes/scheduler-custom.conf
          tĂŒĂŒp: FileOrCreate
        nimi: scheduler-config
      - hostPath:
          tee: /etc/kubernetes/scheduler-custom-policy-config.json
          tĂŒĂŒp: FileOrCreate
        nimi: policy-config

LĂŒhidalt peamistest muudatustest:

  1. Muudeti podi ja konteineri nimi kube-scheduler-croniks
  2. MÀÀrati portide 10151 ja 10159 kasutamine, kuna on mÀÀratud valik hostNetwork: true ja me ei saa kasutada samu porte nagu vaikimisi kube-scheduler (10251 ja 10259)
  3. Parameetriga —config mÀÀrasime teenuse kĂ€ivitamiseks vajaliku konfiguratsioonifaili
  4. Seadsime konfiguratsioonifaili (scheduler-custom.conf) ja planeerimispoliitikate faili (scheduler-custom-policy-config.json) monteerimise hostilt

Ärme unusta, et meie kube-scheduler vajab Ă”igusi, mis on sarnased vaikimisi Ă”igustega. Redigeerime selle klastrirulli:

kubectl edit clusterrole system:kube-scheduler

...
   resourceNames:
    - kube-scheduler
    - kube-scheduler-cron
...

NĂŒĂŒd rÀÀgime siitĂ€, mis peab sisalduma konfiguratsioonifailis ja planeerimispoliitikate failis:

  • Konfiguratsioonifail (scheduler-custom.conf)
    Vaikimisi kube-scheduler'i konfiguratsiooni saamiseks tuleb kasutada parameetrit --write-config-to kohast dokumentatsioonis. Saadud konfiguratsiooni paigutame faili /etc/kubernetes/scheduler-custom.conf ja kujundame selle jÀrgmise vÀlimusega:

apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
schedulerName: kube-scheduler-cron
bindTimeoutSeconds: 600
clientConnection:
  acceptContentTypes: ""
  burst: 100
  contentType: application/vnd.kubernetes.protobuf
  kubeconfig: /etc/kubernetes/scheduler.conf
  qps: 50
disablePreemption: false
enableContentionProfiling: false
enableProfiling: false
failureDomains: kubernetes.io/hostname,failure-domain.beta.kubernetes.io/zone,failure-domain.beta.kubernetes.io/region
hardPodAffinitySymmetricWeight: 1
healthzBindAddress: 0.0.0.0:10151
leaderElection:
  leaderElect: true
  leaseDuration: 15s
  lockObjectName: kube-scheduler-cron
  lockObjectNamespace: kube-system
  renewDeadline: 10s
  resourceLock: endpoints
  retryPeriod: 2s
metricsBindAddress: 0.0.0.0:10151
percentageOfNodesToScore: 0
algorithmSource:
   policy:
     file:
       path: "/etc/kubernetes/scheduler-custom-policy-config.json"

LĂŒhidalt peamistest muudatustest:

  1. Asetasime schedulerName'i vÀÀrtuseks meie teenuse nime kube-scheduler-cron.
  2. MĂ”ttes lockObjectName peame samuti mÀÀrama meie teenuse nime ja veenduma, et parameeter leaderElect on seatud vÀÀrtusele true (kui sul on ĂŒks master-node, vĂ”ib vÀÀrtuseks seada false).
  3. MÀÀrasime teed planeerimispoliitikate kirjelduse faili parameetris algorithmSource.

Tasub natuke pĂ”hjalikumalt peatuda teisel punktis, kus redigeerime valiku vĂ”tme parameetreid leaderElection. Et tagada rikekindlus, aktiveerisime (leaderElect) juhi (masteri) valimise protsessi meie kube-scheduler'i podide vahel, kasutades neile ĂŒhte lĂ”pp-punkti (resourceLock) nimega kube-scheduler-cron (lockObjectName) nimel kube-system (lockObjectNamespace). Kuidas Kubernetes tagab pĂ”hikomponentide (sealhulgas kube-scheduler) kĂ”rge kAvailability kohta saab lugeda artiklis.

  • Plaani fail (scheduler-custom-policy-config.json)
    Kuidas ma juba varem ĂŒtlesin — teada, milliste konkreetsete poliitikatega töötab vaikimisi kube-scheduler, saame ainult seda analĂŒĂŒsides tema koodi. See tĂ€hendab, et me ei saa faili vaikesed kube-scheduler'i planeerimise poliitikatega sarnasele konfiguratsioonifailile. Kirjeldame huvipoliitikaid planeerimise failis /etc/kubernetes/scheduler-custom-policy-config.json jĂ€rgmiselt:

{
  "kind": "Policy",
  "apiVersion": "v1",
  "predicates": [
    {
      "name": "GeneralPredicates"
    }
  ],
  "priorities": [
    {
      "name": "ServiceSpreadingPriority",
      "weight": 1
    },
    {
      "name": "EqualPriority",
      "weight": 1
    },
    {
      "name": "LeastRequestedPriority",
      "weight": 1
    },
    {
      "name": "NodePreferAvoidPodsPriority",
      "weight": 10000
    },
    {
      "name": "NodeAffinityPriority",
      "weight": 1
    }
  ],
  "hardPodAffinitySymmetricWeight" : 10,
  "alwaysCheckAllPredicates" : false
}

Seega koostab kube-scheduler esmalt list sĂ”lmedest, kuhu saab vastavalt GeneralPredicates poliitikale (mis sisaldab setti poliitikaid PodFitsResources, PodFitsHostPorts, HostName ja MatchNodeSelector) mÀÀrata pod. JĂ€rgmisena hinnatakse igat sĂ”lme vastavalt prioriteetide massiivi poliitikate kogumile. Meie ĂŒlesande tingimuste tĂ€itmiseks arvasime, et selline poliitikate kogum oleks optimaalne lahendus. Meenutame, et poliitikate kogum koos detailsete kirjeldustega on saadaval dokumentatsioonis. Oma ĂŒlesande tĂ€itmiseks vĂ”ite lihtsalt muuta kasutatavaid poliitikaid ja mÀÀrata neile vastavad kaalud.

Uue kube-scheduler'i manifest, mille me lÔ chapteri alguses lÔime, nimetame kube-scheduler-custom.yaml-iks ja asetame jÀrgmisele teele /etc/kubernetes/manifests kolme meistri sÔlme peale. Kui kÔik on Ôigesti tehtud, kÀivitab Kubelet igas sÔlmes pod'i ning meie uue kube-scheduler'i logides nÀeme teavet selle kohta, et meie poliitikate fail rakendus edukalt:

Kavandaja loomine konfiguratsioonist: {{ } [{GeneralPredicates }][{ServiceSpreadingPriority 1 } {EqualPriority 1 } {LeastRequestedPriority 1 } {NodePreferAvoidPodsPriority 10000 } {NodeAffinityPriority 1 }][] 10 vale}
Registreerimine ennustust: GeneralPredicates
EnnustustĂŒĂŒp GeneralPredicates on juba registreeritud, taaskasutamine.
Registreerimine prioriteet: ServiceSpreadingPriority
PrioriteeditĂŒĂŒp ServiceSpreadingPriority on juba registreeritud, taaskasutamine.
Registreerimine prioriteet: EqualPriority
PrioriteeditĂŒĂŒp EqualPriority on juba registreeritud, taaskasutamine.
Registreerimine prioriteet: LeastRequestedPriority
PrioriteeditĂŒĂŒp LeastRequestedPriority on juba registreeritud, taaskasutamine.
Registreerimine prioriteet: NodePreferAvoidPodsPriority
PrioriteeditĂŒĂŒp NodePreferAvoidPodsPriority on juba registreeritud, taaskasutamine.
Registreerimine prioriteet: NodeAffinityPriority
PrioriteeditĂŒĂŒp NodeAffinityPriority on juba registreeritud, taaskasutamine.
Kavandaja loomine sobivusennustustega 'map[GeneralPredicates:{}]' ja prioriteedifunktsioonidega 'map[EqualPriority:{} LeastRequestedPriority:{} NodeAffinityPriority:{} NodePreferAvoidPodsPriority:{} ServiceSpreadingPriority:{}]'

NĂŒĂŒd on jÀÀnud ainult nĂ€idata meie CronJob'i spekis, et kĂ”ik taotlused selle pod'ide ajastamiseks peaks töötlema meie uus kube-scheduler:

...
 jobTemplate:
    spec:
      template:
        spec:
          schedulerName: kube-scheduler-cron
...

KokkuvÔte

LÔpuks saime tÀiendava kube-scheduler'i, millel on ainulaadne planeerimisreeglite kogum, mida jÀlgib otse kubelet. Lisaks seadistasime uue liidri valimise meie kube-scheduler'i podide vahel, juhul kui vana liider mingitel pÔhjustel ei ole saadaval.

Tavalised rakendused ja teenused jĂ€tkavad planeerimist vaikimisi kube-scheduler'i kaudu, samas kui kĂ”ik cron-ĂŒlesanded on tĂ€ielikult ĂŒle viidud uuele. Cron-ĂŒlesannete tekitatud koormus jaotatakse nĂŒĂŒd ĂŒhtlaselt kĂ”igi node'ide vahel. Arvestades, et enamik cron-ĂŒlesandeid tĂ€idetakse samadel node'idel, kus asuvad ka projekti pĂ”hiraamatud, on see aidanud oluliselt vĂ€hendada podide kolimise riski ressursside puuduse tĂ”ttu. PĂ€rast tĂ€iendava kube-scheduler'i rakendamist enam cron-ĂŒlesannete ebaĂŒhtlasest planeerimisest probleeme ei tekkinud.

Vaata ka teisi artikleid meie blogis:

Allikas: habr.com

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