ProHoster > Блог > басқарма > Жоспарлау ережелерінің теңшелетін жиыны бар қосымша kube-жоспарлаушысын жасау
Жоспарлау ережелерінің теңшелетін жиыны бар қосымша kube-жоспарлаушысын жасау
Kube-жоспарлағышы Kubernetes бағдарламасының ажырамас құрамдас бөлігі болып табылады, ол көрсетілген саясаттарға сәйкес түйіндер бойынша түйіндерді жоспарлауға жауап береді. Көбінесе, Kubernetes кластерінің жұмысы кезінде подкасттарды жоспарлау үшін нақты қандай саясаттар қолданылатыны туралы ойлаудың қажеті жоқ, өйткені әдепкі kube-жоспарлағыштың саясаттар жинағы күнделікті тапсырмалардың көпшілігі үшін қолайлы. Дегенмен, біз үшін бөтелкелердің таралуын дәл баптау маңызды болатын жағдайлар бар және бұл тапсырманы орындаудың екі жолы бар:
Теңшелетін ережелер жинағы бар kube жоспарлаушысын жасаңыз
Өзіңіздің жоспарлаушыңызды жазыңыз және оны API сервер сұрауларымен жұмыс істеуге үйретіңіз
Бұл мақалада мен біздің жобаларымыздың бірінде бұршақтарды біркелкі жоспарлау мәселесін шешу үшін дәл бірінші тармақтың орындалуын сипаттаймын.
kube-scheduler'a жұмысы туралы қысқаша кіріспе
Айта кету керек, kube-жоспарлаушы подкасттарды тікелей жоспарлауға жауап бермейді - ол тек подкаст орналастыруға болатын түйінді анықтауға жауапты. Басқаша айтқанда, kube-жоспарлаушы жұмысының нәтижесі жоспарлау сұрауы үшін API серверіне қайтаратын түйіннің атауы болып табылады және оның жұмысы осы жерде аяқталады.
Біріншіден, kube-жоспарлаушы Pod предикаттар саясаттарына сәйкес жоспарлауға болатын түйіндерді тізімдейді. Әрі қарай, осы тізімдегі әрбір түйін басымдықтар саясатына сәйкес белгілі бір ұпай санын алады. Нәтижесінде ең жоғары ұпай жинаған түйін таңдалады. Ең жоғары ұпайы бірдей түйіндер болса, кездейсоқ біреуі таңдалады. Предикаттар (сүзу) және басымдықтар (баллдау) саясаттарының тізімі мен сипаттамасын мына жерден табуға болады. құжаттама.
Проблемалық дененің сипаттамасы
Nixys-те әртүрлі Kubernetes кластерлерінің көптігіне қарамастан, біз бірінші рет подкасттарды жоспарлау мәселесіне жақында ғана тап болдық, бұл кезде жобаларымыздың бірі үшін көптеген мерзімді тапсырмаларды орындау қажет болды (~ 100 CronJob нысаны). Мәселенің сипаттамасын мүмкіндігінше жеңілдету үшін мысал ретінде бір микросервисті алайық, оның ішінде cron тапсырмасы минутына бір рет іске қосылып, процессорға біршама жүктеме жасайды. Cron тапсырмасының жұмысы үшін үш мүлдем бірдей түйін (әрқайсысында 24 vCPU) бөлінді.
Бұл ретте CronJob қанша уақыт жұмыс істейтінін нақты айту мүмкін емес, өйткені кіріс деректерінің көлемі үнемі өзгеріп отырады. Орташа алғанда, қалыпты kube-жоспарлағыш жұмысы кезінде әрбір түйін әрбір түйіннің орталық процессорындағы жүктеменің ~ 3-4% құрайтын 20-30 тапсырма данасын іске қосады:
Мәселе мынада, кейде cron тапсырмаларының түйіндері үш түйіннің біріне жоспарлануды тоқтатады. Яғни, белгілі бір уақытта түйіндердің біреуі үшін бірде-бір блок жоспарланбаған, ал қалған екі түйінде 6-8 тапсырма данасы жұмыс істеп, CPU жүктемесінің ~ 40-60% құрайды:
Мәселе мүлдем кездейсоқ жиілікпен қайталанды және кейде кодтың жаңа нұсқасын шығару сәтімен байланысты болды.
Kube-жоспарлаушының тіркеу деңгейін 10-деңгейге (-v=10) көтеру арқылы біз бағалау процесінде әрбір түйін қанша ұпай жинайтынын жаза бастадық. Қалыпты жоспарлау кезінде журналдарда келесі ақпаратты көруге болады:
Анау. журналдардан алынған ақпарат бойынша түйіндердің әрқайсысы бірдей қорытынды ұпай жинады және жоспарлау үшін кездейсоқ біреуі таңдалды. Мәселені жоспарлау кезінде журналдар келесідей болды:
Бұдан түйіндердің біреуі басқаларына қарағанда жалпы ұпайларды аз жинағанын көруге болады, сондықтан жоспарлау максималды ұпай жинаған екі түйін үшін ғана орындалды. Осылайша, біз мәселенің дәл бүршіктерді жоспарлауда жатқанына сенімді болдық.
Мәселені шешудің одан әрі алгоритмі бізге түсінікті болды - журналдарды талдау, түйіннің қай басымдылық бойынша ұпай алмағанын түсіну және қажет болған жағдайда әдепкі kube-жоспарлағышының саясатын реттеу. Дегенмен, бұл жерде біз екі маңызды қиындыққа тап боламыз:
Ең жоғары тіркеу деңгейі (10) тек кейбір басымдықтар үшін нүктелер жинағын көрсетеді. Жоғарыдағы журнал үзіндісінде журналдарда көрсетілген барлық басымдықтар үшін түйіндер қалыпты және проблемалық жоспарлауда бірдей ұпай санын жинайтынын көре аласыз, бірақ мәселені жоспарлау жағдайында соңғы нәтиже әртүрлі болады. Осылайша, кейбір басымдықтар үшін балл қою «сахна артында» орын алады деп қорытынды жасауға болады және бізде түйіннің қай басымдылық үшін ұпай алмағанын түсінуге мүмкіндік жоқ. Біз бұл мәселені егжей-тегжейлі сипаттадық іс Github жүйесіндегі Kubernetes репозиторийі. Жазу кезінде әзірлеушілерден Kubernetes v1.15,1.16 және 1.17 жаңартуларында журналды тіркеу қолдауы қосылатыны туралы жауап алынды.
Қазіргі уақытта kube-жоспарлағыштың қандай саясаттар жиынтығымен жұмыс істеп жатқанын түсінудің оңай жолы жоқ. Иә, в құжаттама бұл тізім тізімделген, бірақ ол басымдық саясаттарының әрқайсысы үшін қандай нақты салмақтар орнатылғаны туралы ақпаратты қамтымайды. Сіз тек салмақтарды көре аласыз немесе әдепкі kube жоспарлаушының саясаттарын өңдей аласыз көздері.
Айта кету керек, бір рет біз түйіннің ImageLocalityPriority саясатына сәйкес ұпай жинамағанын түзете алдық, ол қолданбаны іске қосу үшін қажетті кескінге ие болса, түйінге ұпай береді. Яғни, қосымшаның жаңа нұсқасын шығару кезінде cron тапсырмасы екі түйінде жұмыс істеп, оларға докер тізілімінен жаңа кескінді жүктеп алуға үлгерді, осылайша екі түйінге қатысты жоғары қорытынды балл алды. үшінші.
Жоғарыда жазғанымдай, журналдарда біз ImageLocalityPriority саясатын бағалау туралы ақпаратты көрмейміз, сондықтан біздің болжамымызды тексеру үшін қолданбаның жаңа нұсқасымен суретті үшінші түйінге орналастырдық, содан кейін жоспарлау. дұрыс жұмыс істеді. Дәл ImageLocalityPriority саясатының арқасында жоспарлау мәселесі өте сирек байқалды, көбінесе ол басқа нәрсемен байланысты болды. Әдепкі kube-жоспарлаушысының басымдықтар тізіміндегі саясаттардың әрқайсысын толық күйіне келтіре алмағандықтан, бізге подкастты жоспарлау саясаттарын икемді басқару қажеттілігі туындады.
Мәселенің тұжырымы
Біз мәселені шешу мүмкіндігінше мақсатты болғанын қаладық, яғни Kubernetes-тің негізгі нысандары (бұл жерде біз әдепкі kube-жоспарлағышты айтамыз) өзгеріссіз қалуы керек. Біз бір жерде мәселені шешіп, оны басқа жерде жасағымыз келмеді. Осылайша, біз мақаланың кіріспесінде жарияланған мәселені шешудің екі нұсқасына келдік - қосымша жоспарлаушыны жасау немесе өз бетінше жазу. Cron тапсырмаларын жоспарлаудың негізгі талабы үш түйін бойынша жүктемені біркелкі бөлу болып табылады. Бұл талапты бар kube-жоспарлаушы саясаттары қанағаттандыруы мүмкін, сондықтан тапсырмамыз үшін өз жоспарлаушымызды жазудың мағынасы жоқ.
Қосымша kube-жоспарлағышты жасау және орналастыру нұсқаулары мына бөлімде сипатталған құжаттама. Дегенмен, бізге «Орналастыру» нысаны kube-жоспарлаушы сияқты маңызды қызметтің жұмысында ақауларға төзімділікті қамтамасыз ету үшін жеткіліксіз болып көрінді, сондықтан біз Kubelet тікелей бақылайтын жаңа kube-жоспарлағышты Static Pod ретінде орналастыруды шештік. . Осылайша, бізде жаңа kube жоспарлаушыға келесі талаптар қойылады:
Қызмет барлық кластер шеберлерінде Статикалық Pod ретінде орналастырылуы керек
Kube-жоспарлағышы бар белсенді қосқыш қолжетімсіз болған жағдайда, істен шығу қамтамасыз етілуі керек
Жоспарлау кезінде негізгі басымдық түйіндегі қолжетімді ресурстардың көлемі болуы керек (LeastRequestedPriority)
Іске асыру шешімдері
Бірден айта кету керек, біз Kubernetes v1.14.7 нұсқасындағы барлық жұмыстарды орындаймыз, өйткені бұл нұсқа жобада қолданылды. Жаңа kube-жоспарлағышымыз үшін манифест жазудан бастайық. Әдепкі манифестті (/etc/kubernetes/manifests/kube-scheduler.yaml) негізге алып, оны келесі пішінге келтірейік:
Pod және контейнер атауы kube-scheduler-cron болып өзгертілді
Опция анықталғандықтан 10151 және 10159 порттарын пайдалану үшін көрсетілген hostNetwork: true және біз әдепкі kube жоспарлаушысы сияқты порттарды пайдалана алмаймыз (10251 және 10259)
--config параметрін пайдаланып, қызмет басталатын конфигурация файлын көрсетіңіз
Конфигурация файлын (scheduler-custom.conf) және жоспарлау саясаты файлын (scheduler-custom-policy-config.json) хосттан орнату үшін конфигурацияланған
Біздің kube-жоспарлағышымызға әдепкіге ұқсас құқықтар қажет болатынын ұмытпаңыз. Оның кластер рөлін өңдеңіз:
Енді конфигурация файлында және жоспарлау саясаты файлында не болуы керектігі туралы сөйлесейік:
Конфигурация файлы (scheduler-custom.conf)
Әдепкі kube жоспарлаушысының конфигурациясын алу үшін параметрді пайдалану керек --write-config-to -дан құжаттама. Алынған конфигурацияны /etc/kubernetes/scheduler-custom.conf файлына орналастырып, келесі пішінге келтіреміз:
Параметрде lockObjectName біз сондай-ақ қызметіміздің атын орнатуымыз керек және параметрдің екеніне көз жеткізуіміз керек leaderElect шын мәніне орнатыңыз (егер сізде бір негізгі түйін болса, мәнді жалған етіп орнатуға болады).
Параметрде жоспарлау саясаттарының сипаттамасы бар файлға жол көрсетілген algorithmSource.
Екінші абзацқа толығырақ тоқталған жөн, онда біз кілттің параметрлерін өңдейміз. leaderElection. Ақауларға төзімділік үшін біз (leaderElect) біздің kube-жоспарлағыштың қосқыштары арасында олар үшін бір соңғы нүктені пайдалану арқылы көшбасшыны (шеберді) таңдау процесі (resourceLock) kube-жоспарлаушы-cron (lockObjectName) kube жүйесінің аттар кеңістігінде (lockObjectNamespace). Kubernetes негізгі компоненттердің (соның ішінде kube-жоспарлағыштың) жоғары қолжетімділігін қалай қамтамасыз ететінін мына жерден табуға болады мақала.
Жоспарлау саясаты файлы (scheduler-custom-policy-config.json)
Бұрын жазғанымдай, біз тек оның кодын талдау арқылы әдепкі kube жоспарлаушысы қандай нақты саясаттармен жұмыс істейтінін біле аламыз. Яғни, конфигурация файлына ұқсастық бойынша әдепкі kube-жоспарлаушының жоспарлау саясаты бар файлды ала алмаймыз. /etc/kubernetes/scheduler-custom-policy-config.json файлында бізді қызықтыратын жоспарлау саясаттарын төмендегідей сипаттап көрейік:
Сондықтан kube-жоспарлаушы алдымен Pod GeneralPredicates саясатына (PodFitsResources, PodFitsHostPorts, HostName және MatchNodeSelector саясат жиынын қамтиды) сәйкес жоспарлауға болатын түйіндерді тізімдейді. Содан кейін әрбір түйін басымдықтар массивіндегі саясаттар жинағына сәйкес бағаланады. Міндетіміздің шарттарын орындау үшін біз мұндай саясат кешенін ең жақсы шешім деп санадық. Егжей-тегжейлі сипаттамасы бар саясаттар жиынтығы бар екенін еске саламын құжаттама. Тапсырмаңызды орындау үшін сіз жай ғана пайдаланылған саясаттар жинағын өзгерте аласыз және оларға сәйкес салмақтарды тағайындай аласыз.
Біз тараудың басында жасаған жаңа kube-жоспарлаушы манифест kube-scheduler-custom.yaml деп аталады және үш негізгі түйінде /etc/kubernetes/manifests ішіне орналастырылады. Егер бәрі дұрыс орындалса, Kubelet әрбір түйінде қосқышты іске қосады және жаңа kube-жоспарлағышымыздың журналдарында саясат файлымыз сәтті қолданылғаны туралы ақпаратты көреміз:
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:{}]'
Енді біздің CronJob спецификациясында оның подкасттарын жоспарлауға арналған барлық сұрауларды біздің жаңа kube-жоспарлағышымыз өңдеуі керек екенін көрсету ғана қалды:
Соңында біз кубелет арқылы тікелей бақыланатын жоспарлау саясаттарының бірегей жиынтығы бар қосымша kube-жоспарлағыш алдық. Бұған қоса, ескі жетекші қандай да бір себептермен қолжетімсіз болып қалса, кубе-жоспарлағыштың қосқыштары арасында жаңа көшбасшыны сайлауды орнаттық.
Қалыпты қолданбалар мен қызметтер әдепкі kube-жоспарлағыш арқылы жоспарлануда және барлық cron тапсырмалары толығымен жаңасына ауыстырылды. Cron тапсырмаларымен жасалған жүктеме енді барлық түйіндерге біркелкі бөлінеді. Cron тапсырмаларының көпшілігі жобаның негізгі қолданбалары сияқты бір түйіндерде орындалатынын ескере отырып, бұл ресурстардың жетіспеушілігіне байланысты бөтелкелердің қозғалу қаупін айтарлықтай төмендетті. Қосымша kube-жоспарлағышты енгізгеннен кейін, cron тапсырмаларын біркелкі емес жоспарлауда қиындықтар болмады.
Сондай-ақ біздің блогтағы басқа мақалаларды оқыңыз: