Ke hana ʻana i kahi kube-scheduler hou me kahi hoʻonohonoho maʻamau o nā lula hoʻonohonoho

Ke hana ʻana i kahi kube-scheduler hou me kahi hoʻonohonoho maʻamau o nā lula hoʻonohonoho

ʻO Kube-scheduler kahi mea nui o Kubernetes, nona ke kuleana no ka hoʻonohonoho ʻana i nā pods ma nā node e like me nā kulekele i kuhikuhi ʻia. ʻO ka manawa pinepine, i ka wā o ka hana ʻana o kahi pūʻulu Kubernetes, ʻaʻole pono mākou e noʻonoʻo e pili ana i nā kulekele i hoʻohana ʻia no ka hoʻonohonoho ʻana i nā pods, no ka mea, kūpono ka hoʻonohonoho o nā kulekele o ka kube-scheduler paʻamau no ka hapa nui o nā hana o kēlā me kēia lā. Eia nō naʻe, aia kekahi mau kūlana he mea nui iā mākou ke hoʻoponopono maikaʻi i ke kaʻina o ka hoʻokaʻawale ʻana i nā pods, a ʻelua mau ala e hoʻokō ai i kēia hana:

  1. E hana i kahi kube-scheduler me kahi hoʻonohonoho maʻamau o nā lula
  2. Kākau i kāu mea hoʻonohonoho ponoʻī a aʻo iā ia e hana me nā noi kikowaena API

Ma kēia ʻatikala, e wehewehe wau i ka hoʻokō ʻana i ka helu mua e hoʻoponopono i ka pilikia o ka hoʻonohonoho pono ʻole o nā kapuahi ma kekahi o kā mākou papahana.

ʻO kahi hoʻolauna pōkole i ka hana ʻana o kube-scheduler

He mea pono ke hoʻomaopopo i ka ʻoiaʻiʻo ʻaʻole kuleana ʻo kube-scheduler no ka hoʻonohonoho pololei ʻana i nā pods - aia wale nō ke kuleana no ka hoʻoholo ʻana i ka node kahi e kau ai i ka pod. I nā huaʻōlelo ʻē aʻe, ʻo ka hopena o ka hana kube-scheduler ka inoa o ka node, e hoʻihoʻi i ka server API no kahi noi hoʻonohonoho, a ma laila kahi e pau ai kāna hana.

ʻO ka mea mua, hoʻonohonoho ʻo kube-scheduler i kahi papa inoa o nā nodes i hiki ke hoʻonohonoho ʻia ka pod e like me nā kulekele predicates. A laila, loaʻa i kēlā me kēia node mai kēia papa inoa kekahi mau helu e like me nā kulekele priorites. ʻO ka hopena, koho ʻia ka node me ka nui o nā helu. Inā loaʻa nā nodes i like ka helu kiʻekiʻe loa, koho ʻia kahi koho. Hiki ke loaʻa kahi papa inoa a me ka wehewehe ʻana i nā kulekele predicates (filtering) a me priorites (scoring). palapala.

Ka wehewehe o ke kino pilikia

ʻOiai ka nui o nā pūʻulu Kubernetes like ʻole e mālama ʻia ma Nixys, ua ʻike mua mākou i ka pilikia o ka hoʻonohonoho ʻana i nā pods i kēia manawa wale nō, i ka wā e pono ai kekahi o kā mākou papahana e holo i nā hana maʻamau (~ 100 CronJob entities). No ka maʻalahi o ka wehewehe ʻana i ka pilikia e like me ka hiki, e lawe mākou ma ke ʻano he microservice, kahi e hoʻomaka ai kahi hana cron i hoʻokahi minuke, e hana ana i kahi ukana ma ka CPU. No ka holo ʻana i ka hana cron, ua hoʻokaʻawale ʻia ʻekolu nodes me nā ʻano like ʻole (24 vCPU ma kēlā me kēia).

I ka manawa like, ʻaʻole hiki ke ʻōlelo me ka pololei i ka lōʻihi o ka hana ʻana o ka CronJob, no ka mea ke loli mau nei ka nui o ka ʻikepili hoʻokomo. Ma ka awelika, i ka hana maʻamau o kube-scheduler, holo kēlā me kēia node i nā manawa hana 3-4, e hana ana i ka ~ 20-30% o ka ukana ma ka CPU o kēlā me kēia node:

Ke hana ʻana i kahi kube-scheduler hou me kahi hoʻonohonoho maʻamau o nā lula hoʻonohonoho

ʻO ka pilikia ponoʻī ʻo ia i kekahi manawa ua pau ka hoʻonohonoho ʻia ʻana o nā pahu hana cron ma kekahi o nā node ʻekolu. ʻO ia hoʻi, i kekahi manawa, ʻaʻole hoʻokahi pod i hoʻolālā ʻia no kekahi o nā nodes, ʻoiai ma nā nodes ʻelua ʻelua 6-8 kope o ka hana e holo ana, e hana ana i ~ 40-60% o ka ukana CPU:

Ke hana ʻana i kahi kube-scheduler hou me kahi hoʻonohonoho maʻamau o nā lula hoʻonohonoho

Ua hoʻi hou ka pilikia me ka pinepine ʻole a hoʻopili ʻia i kekahi manawa me ka manawa i ʻōwili ʻia ai kahi mana hou o ke code.

Ma ka hoʻonui ʻana i ka pae logging kube-scheduler i ka pae 10 (-v=10), ua hoʻomaka mākou e hoʻopaʻa i ka nui o nā helu i loaʻa i kēlā me kēia node i ke kaʻina loiloi. I ka wā o ka hoʻolālā maʻamau, hiki ke ʻike ʻia kēia mau ʻike ma nā lāʻau:

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

ʻO kēlā mau mea. e hoʻoholo ana i ka ʻike i loaʻa mai nā moʻolelo, ua loaʻa i kēlā me kēia o nā nodes ka helu like o nā helu hope a ua koho ʻia kekahi no ka hoʻolālā ʻana. I ka manawa o ka hoʻolālā pilikia, ʻike ʻia nā lāʻau penei:

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

Mai laila e ʻike ʻia ai ʻoi aku ka liʻiliʻi o kekahi o nā nodes ma mua o nā mea ʻē aʻe, a no laila ua hoʻokō ʻia ka hoʻolālā ʻana no nā nodes ʻelua i loaʻa ka helu kiʻekiʻe. No laila, ua maopopo maoli mākou aia ka pilikia i ka hoʻonohonoho ʻana o nā pods.

ʻO ka algorithm hou aʻe no ka hoʻoponopono ʻana i ka pilikia ua maopopo iā mākou - e nānā i nā lāʻau, e hoʻomaopopo i ka mea nui i loaʻa ʻole i ka node a, inā pono, e hoʻoponopono i nā kulekele o ka kube-scheduler paʻamau. Eia naʻe, aia mākou i ʻelua mau pilikia nui:

  1. Ma ka pae logging kiʻekiʻe (10), ʻike ʻia nā helu i loaʻa no kekahi mau mea nui. Ma ka ʻāpana o nā lāʻau i luna, hiki iā ʻoe ke ʻike no nā mea nui i hōʻike ʻia i loko o nā lāʻau, helu nā nodes i ka helu like o nā helu ma ka maʻamau a me ka hoʻonohonoho pilikia, akā ʻokoʻa ka hopena hope i ka hihia o ka hoʻolālā pilikia. No laila, hiki iā mākou ke hoʻoholo no kekahi mau mea nui, loaʻa ka helu "ma hope o nā hiʻohiʻona", a ʻaʻohe o mākou ala e hoʻomaopopo ai i ke kumu i loaʻa ʻole ai nā helu. Ua wehewehe kikoʻī mākou i kēia pilikia ma hilo ʻO ka waihona Kubernetes ma Github. I ka manawa i kākau ai, ua loaʻa mai kahi pane mai nā mea hoʻomohala e hoʻohui ʻia ke kākoʻo logging ma nā Kubernetes v1.15,1.16, 1.17 a me XNUMX hōʻano hou.
  2. ʻAʻohe ala maʻalahi e hoʻomaopopo ai i ka hoʻonohonoho kikoʻī o nā kulekele kube-scheduler e hana nei me kēia. ʻAe, ma palapala ua helu ʻia kēia papa inoa, akā ʻaʻole i loaʻa ka ʻike e pili ana i nā mea kaupaona kikoʻī i hāʻawi ʻia i kēlā me kēia o nā kulekele mua. Hiki iā ʻoe ke ʻike i nā kaupaona a i ʻole hoʻoponopono i nā kulekele o ka kube-scheduler paʻamau i loko wale nō code kumu.

He mea pono e hoʻomaopopo i ka manawa i hiki ai iā mākou ke hoʻopaʻa i ka loaʻa ʻole o kahi node e like me ke kulekele ImageLocalityPriority, e hāʻawi ana i nā kuhikuhi i kahi node inā loaʻa iā ia ke kiʻi e pono ai e holo i ka noi. ʻO ia hoʻi, i ka manawa i ʻōwili ʻia ai kahi mana hou o ka noi, ua holo ka hana cron ma nā nodes ʻelua, e hoʻoiho i kahi kiʻi hou mai ka docker registry iā lākou, a no laila ua loaʻa i ʻelua nodes ka helu hope loa e pili ana i ke kolu. .

E like me kaʻu i kākau ai ma luna, ʻaʻole mākou e ʻike i ka ʻike e pili ana i ka loiloi ʻana i ke kulekele ImageLocalityPriority, no laila, i mea e nānā ai i kā mākou manaʻo, ua hoʻolei mākou i ke kiʻi me ka mana hou o ka noi ma ke kolu o ka node, a laila ua hana pololei ka hoʻonohonoho ʻana. . Ma muli o ke kulekele ImageLocalityPriority i ʻike pinepine ʻia ka pilikia o ka hoʻonohonoho ʻana; ʻoi aku ka nui o ka pili ʻana me kekahi mea ʻē aʻe. Ma muli o ka hiki ʻole iā mākou ke hoʻopau piha i kēlā me kēia kulekele i ka papa inoa o nā mea nui o ka kube-scheduler paʻamau, pono mākou i ka hoʻokele maʻalahi o nā kulekele hoʻonohonoho pod.

Ka hoʻokumu ʻana i ka pilikia

Makemake mākou i ka hoʻonā ʻana i ka pilikia e like me ka mea hiki, ʻo ia hoʻi, ʻo nā mea nui o Kubernetes (eia mākou e ʻōlelo nei i ka kube-scheduler paʻamau) pono e hoʻololi ʻole. ʻAʻole mākou i makemake e hoʻoponopono i kahi pilikia ma kahi wahi a hana ia ma kahi ʻē aʻe. No laila, ua hiki mai mākou i ʻelua mau koho no ka hoʻoponopono ʻana i ka pilikia, i hoʻolaha ʻia ma ka hoʻomaka ʻana o ka ʻatikala - hana i kahi mea hoʻonohonoho hou a kākau paha iā ʻoe iho. ʻO ke koi nui no ka hoʻonohonoho ʻana i nā hana cron ʻo ka puʻunaue like ʻana i ka ukana ma waena o ʻekolu nodes. Hiki ke hoʻokō ʻia kēia koi e nā kulekele kube-scheduler i kēia manawa, no laila e hoʻoponopono i kā mākou pilikia ʻaʻohe kumu o ke kākau ʻana i kāu mea hoʻonohonoho.

ʻO nā kuhikuhi no ka hana ʻana a me ka hoʻohana ʻana i kahi kube-scheduler hou i wehewehe ʻia ma palapala. Eia nō naʻe, ua manaʻo mākou ʻaʻole lawa ka hui Deployment e hōʻoia i ka hoʻomanawanui hewa i ka hana ʻana o kahi lawelawe koʻikoʻi e like me kube-scheduler, no laila ua hoʻoholo mākou e kau i kahi kube-scheduler hou ma ke ʻano he Static Pod, e nānā pono ʻia. na Kubelet. No laila, loaʻa iā mākou nā koi no ka kube-scheduler hou:

  1. Pono e kau ʻia ka lawelawe ma ke ʻano he Static Pod ma nā haku cluster āpau
  2. Pono e hāʻawi ʻia ka ʻae hewa inā ʻaʻole i loaʻa ka pod hana me kube-scheduler
  3. ʻO ka mea nui i ka wā e hoʻolālā ai ʻo ia ka helu o nā kumuwaiwai i loaʻa ma ka node (LeastRequestedPriority)

Nā hoʻonā hoʻokō

Pono e hoʻomaopopo koke e hoʻokō mākou i nā hana āpau ma Kubernetes v1.14.7, no ka mea ʻO kēia ka mana i hoʻohana ʻia ma ka papahana. E hoʻomaka kākou ma ke kākau ʻana i kahi manifesto no kā mākou kube-scheduler hou. E lawe i ka hōʻike paʻamau (/etc/kubernetes/manifests/kube-scheduler.yaml) i kumu a lawe mai i kēia ʻano:

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

E pili ana i nā hoʻololi nui:

  1. Ua hoʻololi i ka inoa o ka pod a me ka ipu i kube-scheduler-cron
  2. Hōʻike i ka hoʻohana ʻana i nā awa 10151 a me 10159 e like me ka wehewehe ʻana o ke koho hostNetwork: true a ʻaʻole hiki iā mākou ke hoʻohana i nā awa like me ka kube-scheduler paʻamau (10251 a me 10259)
  3. Ke hoʻohana nei i ka --config parameter, ua kuhikuhi mākou i ka faila hoʻonohonoho e hoʻomaka ai ka lawelawe
  4. Hoʻonohonoho ʻia ka kau ʻana o ka faila hoʻonohonoho (scheduler-custom.conf) a me ka faila kulekele hoʻonohonoho (scheduler-custom-policy-config.json) mai ka mea hoʻokipa.

Mai poina e pono i kā mākou kube-scheduler nā kuleana e like me ka mea paʻamau. Hoʻoponopono i kāna hana pūʻulu:

kubectl edit clusterrole system:kube-scheduler

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

I kēia manawa e kamaʻilio e pili ana i ka mea e pono ai i loko o ka faila hoʻonohonoho a me ka faila kulekele hoʻonohonoho:

  • Waihona hoʻonohonoho (scheduler-custom.conf)
    No ka loaʻa ʻana o ka hoʻonohonoho kube-scheduler paʻamau, pono ʻoe e hoʻohana i ka ʻāpana --write-config-to mai palapala. E kau mākou i ka hoʻonohonoho hoʻonohonoho i ka faila /etc/kubernetes/scheduler-custom.conf a hoʻemi i kēia ʻano:

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"

E pili ana i nā hoʻololi nui:

  1. Hoʻonoho mākou i ka schedulerName i ka inoa o kā mākou lawelawe kube-scheduler-cron.
  2. I ka palena lockObjectName pono ʻoe e hoʻonohonoho i ka inoa o kā mākou lawelawe a e hōʻoia i ka parameter leaderElect hoʻonohonoho i ka ʻoiaʻiʻo (inā loaʻa iā ʻoe hoʻokahi kumu kumu, hiki iā ʻoe ke hoʻonohonoho i ka wahaheʻe).
  3. Ua kuhikuhi ʻia ke ala i ka faila me ka wehewehe ʻana i nā kulekele hoʻonohonoho i ka ʻāpana algorithmSource.

Pono e nānā pono i ka lua o ka helu, kahi e hoʻoponopono ai mākou i nā palena no ke kī leaderElection. No ka hōʻoia ʻana i ka hoʻomanawanui hewa, ua hana mākou (leaderElect) ke kaʻina hana o ke koho ʻana i alakaʻi (master) ma waena o nā pods o kā mākou kube-scheduler me ka hoʻohana ʻana i hoʻokahi hopena no lākou (resourceLock) kapa ʻia ʻo kube-scheduler-cron (lockObjectName) ma ka papa inoa kube-system (lockObjectNamespace). Pehea e hōʻoia ai ʻo Kubernetes i ka loaʻa kiʻekiʻe o nā mea nui (me ka kube-scheduler) hiki ke loaʻa ma 'ōlelo.

  • Hoʻonohonoho i ka faila kulekele (scheduler-custom-policy-config.json)
    E like me kaʻu i kākau ai ma mua, hiki iā mākou ke ʻike i nā kulekele kikoʻī e hana ai ka kube-scheduler paʻamau me ka nānā ʻana i kāna code. ʻO ia, ʻaʻole hiki iā mākou ke loaʻa i kahi faila me nā kulekele hoʻonohonoho no ka kube-scheduler paʻamau ma ke ʻano like me kahi faila hoʻonohonoho. E wehewehe kākou i nā kulekele hoʻonohonoho hoʻonohonoho a mākou e makemake ai i ka faila /etc/kubernetes/scheduler-custom-policy-config.json penei:

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

No laila, hui mua ʻo kube-scheduler i kahi papa inoa o nā nodes i hiki ke hoʻonohonoho ʻia kahi pod e like me ke kulekele GeneralPredicates (ʻo ia hoʻi kahi pūʻulu o PodFitsResources, PodFitsHostPorts, HostName, a me nā kulekele MatchNodeSelector). A laila loiloi ʻia kēlā me kēia node e like me ka hoʻonohonoho ʻana o nā kulekele i ka papa hana mua. No ka hoʻokō ʻana i nā kūlana o kā mākou hana, ua manaʻo mākou ʻo ia ka hoʻonohonoho o nā kulekele ʻo ia ka hopena maikaʻi loa. E hoʻomanaʻo wau iā ʻoe aia kahi pūʻulu o nā kulekele me kā lākou wehewehe kikoʻī i loaʻa i loko palapala. No ka hoʻokō ʻana i kāu hana, hiki iā ʻoe ke hoʻololi wale i ka hoʻonohonoho o nā kulekele i hoʻohana ʻia a hāʻawi i nā kaupaona kūpono iā lākou.

E kāhea mākou i ka hōʻike o ka kube-scheduler hou, a mākou i hana ai ma ka hoʻomaka ʻana o ka mokuna, kube-scheduler-custom.yaml a kau iā ia ma ke ala aʻe /etc/kubernetes/manifests ma ʻekolu kumu kumu. Inā hana pololei nā mea a pau, e hoʻomaka ʻo Kubelet i kahi pod ma kēlā me kēia node, a ma nā moʻolelo o kā mākou kube-scheduler hou e ʻike mākou i ka ʻike ua hoʻohana pono ʻia kā mākou faila kulekele:

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:{}]'

ʻO nā mea a pau i koe e hōʻike i ka kikoʻī o kā mākou CronJob e hana ʻia nā noi āpau no ka hoʻonohonoho ʻana i kāna pods e kā mākou kube-scheduler hou:

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

hopena

ʻO ka hope loa, ua loaʻa iā mākou kahi kube-scheduler hou me kahi hoʻonohonoho kūʻokoʻa o nā kulekele hoʻonohonoho, ʻo ia ka hana e nānā pono ʻia e ka kubelet. Eia kekahi, ua hoʻonohonoho mākou i ke koho ʻana i kahi alakaʻi hou ma waena o nā pods o kā mākou kube-scheduler inā ʻaʻole hiki ke alakaʻi kahiko no kekahi kumu.

Hoʻomau ʻia nā noi a me nā lawelawe maʻamau ma o ka kube-scheduler paʻamau, a ua hoʻololi piha ʻia nā hana cron a pau i ka mea hou. ʻO ka ukana i hana ʻia e nā hana cron ua puʻunaue like ʻia ma nā nodes āpau. Ke noʻonoʻo nei ua hoʻokō ʻia ka hapa nui o nā hana cron ma nā nodes like me nā noi nui o ka papahana, ua hōʻemi nui kēia i ka pilikia o ka neʻe ʻana i nā pods ma muli o ka nele o nā kumuwaiwai. Ma hope o ka hoʻokomo ʻana i ka kube-scheduler, ʻaʻole i ala hou nā pilikia me ka hoʻonohonoho like ʻole o nā hana cron.

E heluhelu pū i nā ʻatikala ʻē aʻe ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka