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:
E hana i kahi kube-scheduler me kahi hoʻonohonoho maʻamau o nā lula
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:
ʻ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:
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:
ʻ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:
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:
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.
ʻ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:
Pono e kau ʻia ka lawelawe ma ke ʻano he Static Pod ma nā haku cluster āpau
Pono e hāʻawi ʻia ka ʻae hewa inā ʻaʻole i loaʻa ka pod hana me kube-scheduler
ʻ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:
Ua hoʻololi i ka inoa o ka pod a me ka ipu i kube-scheduler-cron
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)
Ke hoʻohana nei i ka --config parameter, ua kuhikuhi mākou i ka faila hoʻonohonoho e hoʻomaka ai ka lawelawe
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:
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:
Hoʻonoho mākou i ka schedulerName i ka inoa o kā mākou lawelawe kube-scheduler-cron.
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).
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:
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:
ʻ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: