Ħ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:

  1. Oħloq kube-scheduler b'sett ta' regoli apposta
  2. 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:

Ħolqien ta 'kube-scheduler addizzjonali b'sett personalizzat ta' regoli ta 'skedar

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:

Ħolqien ta 'kube-scheduler addizzjonali b'sett personalizzat ta' regoli ta 'skedar

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:

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

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:

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

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:

  1. 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.
  2. 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:

  1. Is-servizz irid jiġi skjerat bħala Static Pod fuq il-master masters kollha tal-clusters
  2. Għandha tiġi pprovduta tolleranza għall-ħsarat f'każ li l-pod attiv b'kube-scheduler ma jkunx disponibbli
  3. 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:

kind: Pod
metadata:
  labels:
    component: scheduler
    tier: control-plane
  name: kube-scheduler-cron
  namespace: kube-system
spec:
      containers:
      - command:
        - /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
        image: gcr.io/google-containers/kube-scheduler:v1.14.7
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 8
          httpGet:
            host: 127.0.0.1
            path: /healthz
            port: 10151
            scheme: HTTP
          initialDelaySeconds: 15
          timeoutSeconds: 15
        name: kube-scheduler-cron-container
        resources:
          requests:
            cpu: '0.1'
        volumeMounts:
        - mountPath: /etc/kubernetes/scheduler.conf
          name: kube-config
          readOnly: true
        - mountPath: /etc/localtime
          name: localtime
          readOnly: true
        - mountPath: /etc/kubernetes/scheduler-custom.conf
          name: scheduler-config
          readOnly: true
        - mountPath: /etc/kubernetes/scheduler-custom-policy-config.json
          name: policy-config
          readOnly: true
      hostNetwork: true
      priorityClassName: system-cluster-critical
      volumes:
      - hostPath:
          path: /etc/kubernetes/scheduler.conf
          type: FileOrCreate
        name: kube-config
      - hostPath:
          path: /etc/localtime
        name: localtime
      - hostPath:
          path: /etc/kubernetes/scheduler-custom.conf
          type: FileOrCreate
        name: scheduler-config
      - hostPath:
          path: /etc/kubernetes/scheduler-custom-policy-config.json
          type: FileOrCreate
        name: policy-config

Fil-qosor dwar il-bidliet ewlenin:

  1. Bidla l-isem tal-pod u l-kontenitur għal kube-scheduler-cron
  2. 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)
  3. Bl-użu tal-parametru --config, speċifikajna l-fajl tal-konfigurazzjoni li bih għandu jinbeda s-servizz
  4. Immuntar ikkonfigurat tal-fajl tal-konfigurazzjoni (scheduler-custom.conf) u fajl tal-politika tal-iskedar (scheduler-custom-policy-config.json) mill-host

Tinsiex li l-kube-scheduler tagħna se jkollu bżonn drittijiet simili għal dak default. Editja r-rwol tal-cluster tiegħu:

kubectl edit clusterrole system:kube-scheduler

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

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:

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"

Fil-qosor dwar il-bidliet ewlenin:

  1. Aħna waqqafna schedulerName għall-isem tas-servizz tagħna kube-scheduler-cron.
  2. 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).
  3. Speċifika t-triq għall-fajl b'deskrizzjoni tal-politiki tal-iskedar fil-parametru algorithmSource.

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:

{
  "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
}

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:

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

Konklużjoni

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.

Aqra wkoll artikli oħra fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment