Kohandatud reeglite komplektiga tÀiendava kube-scheduler'i loomine

Kohandatud reeglite komplektiga tÀiendava kube-scheduler'i loomine

Kube-scheduler on Kubernetesi lahutamatu komponent, mis vastutab podide planeerimise eest sÔlmedele vastavalt mÀÀratud poliitikatele. Sageli ei pea me Kubernetes-klastrit kasutades muretsema, milliste poliitikate alusel podid planeeritakse, kuna vaikimisi kube-scheduler'i poliitikakomplekt sobib enamikuks igapÀevaseks tööks. Siiski on olukordi, kus on oluline peenelt juhtida podide jaotamise protsessi, ja selle saavutamiseks on kaks teed:

  1. Loo kube-scheduler kohandatud reeglite kogumiga
  2. Kirjuta oma enda scheduler ja Ôpeta seda tööle API-serveri pÀringutega

KĂ€esolevas artiklis tutvustan ma just esimese punkti elluviimist, et lahendada podide ebaĂŒhtlase planeerimise probleem ĂŒhes meie projektist.

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

On oluline mĂ€rkida, et kube-scheduler ei vastuta podide otsese planeerimise eest — ta vastutab ainult sĂ”lme mÀÀramise eest, kuhu pod peaks paigaldama. TeisisĂ”nu, kube-scheduler'i töö tulemus on sĂ”lme nimi, mille ta tagastab API-serverile planeerimispĂ€ringu peale ja sellega tema töö lĂ”ppeb.

Esmalt koostab kube-scheduler nimekirja sÔlmedest, kuhu pod saab vastavalt predicates poliitikatele planeerida. JÀrgmiseks saab iga see nimekirja kuuluv sÔlm teatud arvu punkte vastavalt priorites poliitikatele. Tulemuseks valitakse sÔlm, mis on saanud maksimaalse punktide arvu. Kui mitmed sÔlmed on saanud sama maksimaalse skoori, valitakse neist juhuslikult. Predicates (filterimise) ja priorites (punkte andmine) poliitikate loendit ja kirjeldust saab tutvuda dokumentatsioon.

Probleemi kirjeldus

Vaatamata sellele, et meil on Nixysis hoolduses palju erinevaid Kubernetes klastreid, kohtasime podide planeerimise probleemiga esmakordselt alles hiljuti, kui ĂŒhes meie projektis tekkis vajadus kĂ€ivitada suur hulk perioodilisi ĂŒlesandeid (~100 CronJob'i ĂŒksust). Probleemi kirjeldamise maksimaalselt lihtsustamiseks vĂ”tame nĂ€iteks ĂŒhe mikroteenuse, mille raames kĂ€ivitatakse iga minut cron-ĂŒlesanne, mis tekitab teatud koormuse CPU-le. Cron-ĂŒlesannete jaoks on eraldatud kolm tĂ€iesti identset sĂ”lme (igal 24 vCPU).

Siiski ei saa tĂ€pselt öelda, kui kaua CronJob kestab, kuna sisendandmete maht muutub pidevalt. Keskmiselt töötab normaalses kube-scheduler'i töös igas sĂ”lmes 3-4 tĂ¶Ă¶ĂŒlesande koopia, mis tekitavad ~20-30% koormust iga sĂ”lme CPU-le:

Kohandatud reeglite komplektiga tÀiendava kube-scheduler'i loomine

Probleem seisneb selles, et mĂ”nikord ei plaanitud cron-ĂŒlesannete pod'e ĂŒhele kolmest sĂ”lmest. See tĂ€hendab, et mingil ajahetkel ei plaanitud ĂŒhtegi pod'i ĂŒhte sĂ”lme, samas kui kahes teises sĂ”lmes töötas 6-8 tĂ¶Ă¶ĂŒlesande koopia, tekitades ~40-60% koormust CPU-le:

Kohandatud reeglite komplektiga tÀiendava kube-scheduler'i loomine

Probleem kordus tÀiesti juhuslike ajavahemike jÀrel ja harva korreleerus uue koodiversiooni vÀljalaskmise hetkega.

TÔstes kube-scheduler'i logimise taseme 10 tasemeni (-v=10), hakkasime registreerima, kui palju punkte iga sÔlm hindamise protsessis kogub. Normaalses planeerimiselogi töös vÔis logides nÀha jÀrgmist teavet:

resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1387 millicores 4161694720 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1347 millicores 4444810240 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1387 millicores 4161694720 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1687 millicores 4790840320 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1347 millicores 4444810240 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1687 millicores 4790840320 memory bytes, score 9
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: NodeAffinityPriority, Score: (0)                                                                                       
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node01: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: TaintTolerationPriority, Score: (10)                                                                                   
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node02: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node01: SelectorSpreadPriority, Score: (10)                                                                                                        
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node03: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node02: SelectorSpreadPriority, Score: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node03: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:781] Host Node01 => Score 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 => Score 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node03 => Score 100043

Seega, lĂ€htudes logidest saadud infost, kogusid kĂ”ik soliidid vĂ”rdselt lĂ”pp-punkte ja juhuslikult valiti ĂŒks neist planeerimiseks. Probleemse planeerimise hetkel nĂ€gid logid vĂ€lja jĂ€rgmiselt:

resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1587 millicores 4581125120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1087 millicores 3532549120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1587 millicores 4581125120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 987 millicores 3322833920 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 987 millicores 3322833920 memory bytes, score 9 
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1087 millicores 3532549120 memory bytes, score 9
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node03: InterPodAffinityPriority, Score: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node02: InterPodAffinityPriority, Score: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node01: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node03: SelectorSpreadPriority, Score: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node02: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node01: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: TaintTolerationPriority, Score: (10)                                                                                   
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:781] Host Node03 -> Score 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 -> Score 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node01 -> Score 100038

Nendest, et ĂŒks nodidest kogus vĂ€hem lĂ”pp-punkte kui teised, ja seetĂ”ttu kavandati töötlemine ainult kahe nodi peale, mis said maksimaalsed punktid. Nii saime kindlalt veenduda, et probleem on seotud just podide kavandamisega.

Edasi liikumine probleemilahendamise algoritmiga oli meile selge — analĂŒĂŒsida logisid, mĂ”ista, millise prioriteedi tĂ”ttu nod ei kogunud punkte ja vajadusel kohandada vaikimisi kube-scheduler'i poliitikaid. Kuid siin seisime silmitsi kahe olulise vĂ€ljakutsega:

  1. Maksimaalsel logimise tasemel (10) kajastatakse punkte ainult mĂ”nede prioriteetide kohta. Ülaltoodud logide lĂ”igus vĂ”ib nĂ€ha, et kĂ”igi logides kajastatud prioriteetide osas koguvad nodid normaalsete ja probleemsete kavandamiste korral vĂ”rdselt punkte, kuid probleemsete kavandamiste lĂ”pp-tulemus on erinev. Seega vĂ”ib jĂ€reldada, et mĂ”nede prioriteetide osas toimub punktide arvutamine „kaadrivĂ€lisel” viisil ning meil ei ole mingit vĂ”imalust mĂ”ista, millise prioriteedi osas nod punkte ei kogunud. Seda probleemi oleme pĂ”hjalikult kirjeldanud probleem Kubernetes'i repozitooriumis GitHubis. Artikli kirjutamise hetkel oli vĂ€lja saadud arendajate vastus, et logimise toetamine lisatakse Kubernetes v1.15, v1.16 ja v1.17 uuendustes.
  2. Ei ole lihtsat viisi mĂ”ista, millise konkreetse poliitika kogumiga töötas kube-scheduler hetkel. Jah, see nimekiri on loetletud, kuid seal puudub teave, millised konkreetsed kaalud on igale prioriteedile mÀÀratud. NĂ€ha kaalu vĂ”i redigeerida vaikimisi kube-scheduler'i poliitikaid saab vaid dokumentatsioon Oluline on mĂ€rkida, et korra Ă”nnestus meil fikseerida, et nod ei kogunud punkte ImageLocalityPriority poliitika alusel, mis annab punktid nodile, kui tal on juba olemas pilt, mis on vajalik rakenduse kĂ€ivitamiseks. St, uue rakenduse versiooni kĂ€ivitamise hetkel suutis cron-ĂŒlesanne kĂ€ivituda kahel nodil, tĂ”mmates neile uue pildi docker registry'lt, ja seega said kaks nodi suurema lĂ”pp-punktide arvu vĂ”rreldes kolmandaga. allikakoodis.

Oluline on mĂ€rkida, et korra Ă”nnestus meil fikseerida, et nod ei kogunud punkte ImageLocalityPriority poliitika alusel, mis annab punktid nodile, kui tal on juba olemas pilt, mis on vajalik rakenduse kĂ€ivitamiseks. St, uue rakenduse versiooni kĂ€ivitamise hetkel suutis cron-ĂŒlesanne kĂ€ivituda kahel nodil, tĂ”mmates neile uue pildi docker registry'lt, ja seega said kaks nodi suurema lĂ”pp-punktide arvu vĂ”rreldes kolmandaga.

Nagu ma juba eespool mainisin, ei nÀe me logides teavet ImageLocalityPriority poliitika hindamise kohta, seega, et oma oletust kontrollida, kopeerisime uue versiooni rakenduse pildi kolmandale sÔlmele, mille jÀrel planeerimine töötas Ôigesti. Just ImageLocalityPriority poliitika tÔttu ei olnud planeerimise probleemid piisavalt sageli, sagedamini olid need seotud millegi muuga. Kuna me ei saanud tÀielikult iga poliitikat, mis oli prioriteetide nimekirjas kube-scheduler'i vaikeseades, siluda, oli meil vaja paindlikku haldamist pod'ide planeerimise poliitikate osas.

Ülesande seadmine

Soovisime, et probleemide lahendamine oleks vĂ”imalikult spetsiifiline, see tĂ€hendab, et Kubernetes'e pĂ”hisĂŒsteemid (siin mĂ”eldakse vaikeseade kube-scheduler) peaksid jÀÀma muutumatuks. Me ei soovinud probleemi lahendada ĂŒhes kohas, luues selle samas teises. Seega jĂ”udsime kahele probleemilahenduse variandile, mida kĂ€sitleti artikli sissejuhatuses - lisa scheduler'i loomine vĂ”i enda kirjutamine. Peamine nĂ”ue cron-ĂŒlesannete planeerimisel on koormuse ĂŒhtlane jaotamine kolme sĂ”lme vahel. Seda nĂ”uet saab rahuldada juba olemasolevate kube-scheduler'i poliitikatega, seega ei ole mĂ”tet luua oma scheduler'it meie vajaduste rahuldamiseks.

Lisa kube-scheduler'i loomise ja juurutamise juhised on kirjeldatud dokumentatsioon. Kuid me arvasime, et Deployment'i entiteedid ei ole piisavad sellise kriitilise teenuse nagu kube-scheduler töö usaldusvÀÀrsuse tagamiseks, seega otsustasime juurutada uue kube-scheduler'i Static Pod'ina, mille ĂŒle jĂ€lgib otse Kubelet. Seega tĂ”usid meie jaoks jĂ€rgmised nĂ”udmised uuele kube-scheduler'ile:

  1. Teenust tuleb juurutada Static Pod'ina kÔigil klastrite meistritel
  2. Tugiteenus peab olema tagatud aktiivse kube-scheduler'i pod'i kÀtte saamata jÀtmisel
  3. Peamine prioriteet planeerimisel peab olema saadavalolevate ressursside hulk sÔlmes (LeastRequestedPriority)

Lahenduse rakendamine

Tasub kohe mÀrkida, et kÔik tööd teeme Kubernetes v1.14.7-s, kuna just see versioon kasutati projektis. Alustame oma uue kube-scheduler'i manifesti kirjutamisest. Tuginedes vaikeseade manifestile ( /etc/kubernetes/manifests/kube-scheduler.yaml ) ja viime selle jÀrgmisse vormi:

tĂŒĂŒp: Pod
metaandmed:
  sildid:
    komponent: scheduler
    tase: control-plane
  nimi: kube-scheduler-cron
  namespace: kube-system
spets:
      konteinerid:
      - kÀsk:
        - /usr/local/bin/kube-scheduler
        - --address=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
        elujÔudlusKontroll:
          ebaĂ”nnestumiseKĂŒnnis: 8
          httpGet:
            host: 127.0.0.1
            tee: /healthz
            port: 10151
            skeem: HTTP
          algneViivitusSekundites: 15
          ajaÜksusSekundites: 15
        nimi: kube-scheduler-cron-konteiner
        ressursid:
          taotlused:
            cpu: '0.1'
        mahud:
        - 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

Peamised muudatused:

  1. Muutsime poda ja konteineri nime kube-scheduler-cron-iks
  2. MÀÀrasime portide 10151 ja 10159 kasutamise, 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 konfiguratsioonifaili, millega teenus kÀivitub
  4. Konfigureerisime konfiguratsioonifaili (scheduler-custom.conf) ja planeerimise poliitikafaili (scheduler-custom-policy-config.json) mountimise hostilt

Ärge unustage, et meie kube-scheduler vajab Ă”igusi, mis on sarnased vaikeseadmetele. Muudame tema klasteroll:

kubectl edit clusterrole system:kube-scheduler

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

NĂŒĂŒd rÀÀgime sellest, mis peaks olema konfiguratsioonifailis ja planeerimise poliitika failis:

  • Konfiguratsioonifail (scheduler-custom.conf)
    Vaikse kube-scheduler'i konfiguratsiooni saamiseks tuleb kasutada parameetrit --write-config-to API-s dokumentatsioon. Saadud konfiguratsioon paigutatakse faili /etc/kubernetes/scheduler-custom.conf ja viidatakse jÀrgmisele kujule:

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"

Peamised muudatused:

  1. Oleme mÀÀranud schedulerName'iks meie teenuse nime kube-scheduler-cron.
  2. Parameetris lockObjectName tuleb samuti mÀÀrata meie teenuse nimi ja veenduda, et parameeter leaderElect on seatud vÀÀrtusele true (kui teil on ĂŒksainus pĂ”hivĂ”ti, vĂ”ib vÀÀrtuse seada false).
  3. Oleme mÀÀranud tee failini, kus on kirjeldatud planeerimise poliitikad parameetris algorithmSource.

Tasub rohkem tĂ€helepanu pöörata teisele punktile, kus me muutame parameetreid vĂ”tme leaderElection. Et tagada tĂ”rgeteta toimimine, aktiveerisime (leaderElect) juhtivaks valimise protsessi meie kube-scheduler'i podide vahel, kasutades ĂŒhte neile mĂ”eldud endpointi (resourceLock) nimega kube-scheduler-cron (lockObjectName) kube-system nimede ruumis (lockObjectNamespace). Kuidas Kubernetes tagab pĂ”hikomponentide (sealhulgas kube-scheduler'i) kĂ”rge saadavuse, saab tutvuda artiklis.

  • Planeerimise poliitika fail (scheduler-custom-policy-config.json)
    Nagu ma varem mainisin — saame teada, milliste tĂ€psete poliitikatega töötab vaikimisi kube-scheduler, analĂŒĂŒsides selle koodi. Seega ei saa me sarnaselt konfiguratsioonifailile saada faili vaikimisi kube-scheduler'i planeerimise poliitikatega. Kirjeldame meie jaoks huvipakkuvaid planeerimise poliitikaid 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 nimekirja nodes, kuhu saab pod'i vastavalt GeneralPredicates poliitikale (mis sisaldab PodFitsResources, PodFitsHostPorts, HostName ja MatchNodeSelector poliitika komplekti) kavandada. Ja edasi hinnatakse iga node'it prioritiseerimise poliitikate komplekti alusel. Meie ĂŒlesande tĂ€itmiseks oleme arvutanud, et selline poliitikate komplekt on optimaalselt lahenduseks. Tuletan meelde, et poliitikate komplekt koos nende ĂŒksikasjaliku kirjeldamisega on saadaval dokumentatsioon. Oma ĂŒlesande tĂ€itmiseks vĂ”ite lihtsalt muuta kasutatavate poliitikate komplekti ja mÀÀrata neile vastavad kaalud.

Uue kube-scheduler'i manifesti, mille me peatĂŒki alguses lĂ”ime, nimetame kube-scheduler-custom.yaml ja paigutame selle jĂ€rgmisele teele /etc/kubernetes/manifests kolmele master-node'ile. Kui kĂ”ik on Ă”igesti tehtud, kĂ€ivitab Kubelet igas node's pod'i ning meie uue kube-scheduler'i logides nĂ€eme teavet, et meie poliitikafail on edukalt rakendatud:

Loome plaanija konfiguratsiooni alusel: {{ } [{GeneralPredicates } ] [{ServiceSpreadingPriority 1 } {EqualPriority 1 } {LeastRequestedPriority 1 } {NodePreferAvoidPodsPriority 10000 } {NodeAffinityPriority 1 } ] [] 10 false}
Registreerimine: GeneralPredicates
Predikaadi tĂŒĂŒp GeneralPredicates on juba registreeritud, kasutatakse uuesti.
Registreerimine: ServiceSpreadingPriority
Prioriteedi tĂŒĂŒp ServiceSpreadingPriority on juba registreeritud, kasutatakse uuesti.
Registreerimine: EqualPriority
Prioriteedi tĂŒĂŒp EqualPriority on juba registreeritud, kasutatakse uuesti.
Registreerimine: LeastRequestedPriority
Prioriteedi tĂŒĂŒp LeastRequestedPriority on juba registreeritud, kasutatakse uuesti.
Registreerimine: NodePreferAvoidPodsPriority
Prioriteedi tĂŒĂŒp NodePreferAvoidPodsPriority on juba registreeritud, kasutatakse uuesti.
Registreerimine: NodeAffinityPriority
Prioriteedi tĂŒĂŒp NodeAffinityPriority on juba registreeritud, kasutatakse uuesti.
Loome plaanijat, mille sobivuse predikaadid on 'map[GeneralPredicates:{}]' ja prioriteetfunktsioonid 'map[EqualPriority:{} LeastRequestedPriority:{} NodeAffinityPriority:{} NodePreferAvoidPodsPriority:{} ServiceSpreadingPriority:{}]'

NĂŒĂŒd jÀÀb vaid mĂ€rkida meie CronJob'i spetsiifitseis, et kĂ”ik selle pod'ide kavandamise pĂ€ringud peaks kĂ€sitlema meie uut kube-scheduler'it:

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

KokkuvÔte

LĂ”ppkokkuvĂ”ttes saime tĂ€iendava kube-scheduler'i, millel on ainulaadne poliitikate komplekt kavandamiseks, mille tegevust jĂ€lgib otse kubelet. Lisaks oleme seadnud ĂŒles meie kube-scheduler'i pod'ide vahel uue juhi valimise, juhul kui vana juht mingitel pĂ”hjustel muutub kĂ€ttesaamatuks.

Tavalised rakendused ja teenused jĂ€tkavad planeerimist lĂ€bi vaike kube-scheduler'i, samas kui kĂ”ik cron-ĂŒlesanded on tĂ€ielikult ĂŒle viidud uuele. Cron-ĂŒlesannete koormus jaotatakse nĂŒĂŒd ĂŒhtlaselt kĂ”igi sĂ”lmede vahel. Arvestades, et enamik cron-ĂŒlesandeid tĂ€idetakse samadel sĂ”lmedel, kus asuvad projekti pĂ”hiraudvara, on see oluliselt vĂ€hendanud riskikoormuse ĂŒmberpaiknemise tĂ”ttu ressursside puudujÀÀgist. PĂ€rast tĂ€iendava kube-scheduler'i juurutamist ei ole enam esinenud probleeme ebavĂ”rdse cron-ĂŒlesannete planeerimisega.

Vaata ka teisi artikleid meie blogis:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster