AWS Spot инстанцияларында масштабталатын API құру

Бәріңе сәлем! Менің атым Кирилл, мен Adapty компаниясының техникалық директорымын. Біздің архитектурамыздың көпшілігі AWS жүйесінде және бүгін мен өндіріс ортасында спот даналарын пайдалану арқылы сервер шығындарын 3 есеге төмендеткеніміз, сондай-ақ олардың автоматты масштабтауын қалай орнату керектігі туралы айтатын боламын. Алдымен оның қалай жұмыс істейтініне шолу жасалады, содан кейін бастауға арналған егжей-тегжейлі нұсқаулар болады.

Spot инстанциялары дегеніміз не?

Дақ даналар қазіргі уақытта жұмыс істемейтін басқа AWS пайдаланушыларының серверлері және оларды үлкен жеңілдікпен сатады (Amazon 90%-ға дейін жазады, біздің тәжірибемізде ~3x, аймаққа, AZ және дана түріне байланысты өзгереді). Олардың кәдімгілерден басты айырмашылығы - олар кез келген уақытта өшіре алады. Сондықтан, біз ұзақ уақыт бойы оларды таза орталар үшін немесе S3 немесе дерекқорда сақталған аралық нәтижелермен, бірақ сату үшін емес, бірдеңені есептеу тапсырмалары үшін пайдалану қалыпты деп сендік. Өндірісте дақтарды пайдалануға мүмкіндік беретін үшінші тарап шешімдері бар, бірақ біздің ісіміз үшін көптеген балдақтар бар, сондықтан біз оларды жүзеге асырмадық. Мақалада сипатталған тәсіл толығымен стандартты AWS функционалдығында жұмыс істейді, қосымша сценарийлер, тәждер және т.б.

Төменде спот даналарының баға тарихын көрсететін бірнеше скриншоттар берілген.

m5.eu-west-1 (Ирландия) аймағындағы үлкен. Баға негізінен 3 ай бойы тұрақты болды, қазір 2.9 есе үнемдейді.

AWS Spot инстанцияларында масштабталатын API құру

м5.үлкен АҚШ-шығыс-1 аймағында (Н. Вирджиния). Баға 3 ай ішінде үнемі өзгеріп отырады, қазір қолжетімділік аймағына байланысты 2.3 еседен 2.8 есеге дейін үнемдейді.

AWS Spot инстанцияларында масштабталатын API құру

t3.us-шығыс-1 аймағында шағын (Н. Вирджиния). Баға 3 ай бойы тұрақты болды, қазір 3.4 есе үнемдейді.

AWS Spot инстанцияларында масштабталатын API құру

Қызмет архитектурасы

Біз осы мақалада айтатын қызметтің негізгі архитектурасы төмендегі диаграммада көрсетілген.

AWS Spot инстанцияларында масштабталатын API құру

Қолданба жүктемесін теңестіруші → EC2 мақсатты топ → серпімді контейнер қызметі

Қолданба жүктемесін теңестіруші (ALB) EC2 мақсатты тобына (TG) сұрау жіберетін теңгерім ретінде пайдаланылады. TG ALB үшін даналарда порттарды ашуға және оларды Elastic Container Service (ECS) контейнерлерінің порттарына қосуға жауапты. ECS — Docker контейнерлерін басқаратын AWS жүйесіндегі Kubernetes аналогы.

Бір данада бірдей порттары бар бірнеше жұмыс істейтін контейнерлер болуы мүмкін, сондықтан біз оларды тұрақты түрде орната алмаймыз. ECS TG-ге жаңа тапсырманы іске қосып жатқанын айтады (Кубернетес терминологиясында бұл подкаст деп аталады), ол данада бос порттарды тексереді және олардың біреуін іске қосылған тапсырмаға тағайындайды. Сондай-ақ, TG дананың және API интерфейсінің денсаулықты тексеру арқылы жұмыс істеп жатқанын үнемі тексереді және қандай да бір ақауларды көрсе, ол жерге сұрау жіберуді тоқтатады.

EC2 автоматты масштабтау топтары + ECS сыйымдылық провайдерлері

Жоғарыдағы диаграммада EC2 Auto Scaling Groups (ASG) қызметі көрсетілмеген. Атауынан оның даналарды масштабтауға жауапты екенін түсінуге болады. Дегенмен, соңғы уақытқа дейін AWS-де ECS-тен жұмыс істейтін машиналар санын басқарудың кірістірілген мүмкіндігі болған жоқ. ECS тапсырмалар санын, мысалы, процессорды пайдалану, жедел жад немесе сұраулар саны бойынша масштабтауға мүмкіндік берді. Бірақ егер тапсырмалар барлық бос даналарды алып жатса, онда жаңа машиналар автоматты түрде жасалмаған.

Бұл ECS Capacity Providers (ECS CP) пайда болуымен өзгерді. Енді ECS-тегі әрбір қызметті ASG-мен байланыстыруға болады және егер тапсырмалар орындалып жатқан даналарға сәйкес келмесе, жаңалары көтеріледі (бірақ белгіленген ASG шегінде). Бұл сондай-ақ қарама-қарсы бағытта жұмыс істейді, егер ECS CP тапсырмаларсыз бос даналарды көрсе, оларды өшіру үшін ASG пәрменін береді. ECS CP даналық жүктеменің мақсатты пайызын анықтау мүмкіндігіне ие, осылайша белгілі бір машиналар саны тапсырмаларды жылдам масштабтау үшін әрқашан бос болады; Мен бұл туралы сәл кейінірек айтамын.

EC2 іске қосу үлгілері

Бұл инфрақұрылымды жасау туралы егжей-тегжейлі айтпас бұрын мен айтатын соңғы қызмет - EC2 іске қосу үлгілері. Бұл әр уақытта нөлден қайталанбау үшін барлық машиналар іске қосылатын үлгіні жасауға мүмкіндік береді. Мұнда іске қосылатын машина түрін, қауіпсіздік тобын, диск кескінін және басқа да көптеген параметрлерді таңдауға болады. Сондай-ақ, барлық іске қосылған даналарға жүктеп салынатын пайдаланушы деректерін көрсетуге болады. Пайдаланушы деректерінде сценарийлерді іске қосуға болады, мысалы, файлдың мазмұнын өңдеуге болады ECS агент конфигурациялары.

Осы мақаланың ең маңызды конфигурация параметрлерінің бірі болып табылады ECS_ENABLE_SPOT_INSTANCE_DRAINING=шын. Егер бұл параметр қосылса, ECS спот данасы жойылып жатқаны туралы сигнал алған бойда, онда жұмыс істейтін барлық тапсырмаларды Төгу күйіне тасымалдайды. Бұл данаға жаңа тапсырмалар тағайындалмайды; дәл қазір оған шығарғысы келетін тапсырмалар болса, олардан бас тартылады. Баланс берушінің сұраныстары да тоқтайды. Дана жою туралы хабарландыру нақты оқиғадан 2 минут бұрын келеді. Сондықтан, егер сіздің қызметіңіз 2 минуттан артық тапсырмаларды орындамаса және дискіге ештеңе сақтамаса, онда деректерді жоғалтпай нүктелік даналарды пайдалануға болады.

Дискіге қатысты - жақында AWS жасалған Серпімді файлдық жүйені (EFS) ECS-пен бірге пайдалануға болады; бұл схемада тіпті диск кедергі емес, бірақ біз мұны көрмедік, өйткені күйді сақтау үшін диск қажет емес. Әдепкі бойынша, SIGINT алғаннан кейін (тапсырма Ағызу күйіне ауыстырылған кезде жіберіледі) барлық орындалып жатқан тапсырмалар, олар әлі аяқталмаған болса да, 30 секундтан кейін тоқтатылады; бұл уақытты параметр арқылы өзгертуге болады. ECS_CONTAINER_STOP_TIMEOUT. Ең бастысы, оны нүктелік машиналар үшін 2 минуттан артық орнатуға болмайды.

Қызметті құру

Сипатталған қызметті құруға көшейік. Бұл процесте мен жоғарыда айтылмаған бірнеше пайдалы тұстарды қосымша сипаттаймын. Жалпы алғанда, бұл қадамдық нұсқаулық, бірақ мен кейбір өте қарапайым немесе, керісінше, өте нақты жағдайларды қарастырмаймын. Барлық әрекеттер AWS көрнекі консолінде орындалады, бірақ оларды CloudFormation немесе Terraform көмегімен бағдарламалық түрде шығаруға болады. Adapty-де біз Terraform-ды қолданамыз.

EC2 іске қосу үлгісі

Бұл қызмет пайдаланылатын машиналар конфигурациясын жасайды. Үлгілер EC2 -> Даналар -> Үлгілерді іске қосу бөлімінде басқарылады.

Amazon машинасының кескіні (AMI) — барлық даналары іске қосылатын диск кескінін көрсетіңіз. ECS үшін көп жағдайда Amazon-дан оңтайландырылған кескінді пайдалану керек. Ол үнемі жаңартылып отырады және ECS жұмыс істеуі үшін қажеттінің барлығын қамтиды. Ағымдағы кескін идентификаторын білу үшін бетке өтіңіз Amazon ECS оңтайландырылған AMI, пайдаланып жатқан аймақты таңдап, оған AMI идентификаторын көшіріңіз. Мысалы, АҚШ-шығыс-1 аймағы үшін жазу кезіндегі ағымдағы идентификатор болып табылады ami-00c7c1cf5bdc913ed. Бұл идентификатор Теңшелетін мәнді көрсету элементіне енгізілуі керек.

Дана түрі — дананың түрін көрсетіңіз. Тапсырмаңызға сәйкес келетінін таңдаңыз.

Кілттер жұбы (логин) — қажет болса, данаға SSH арқылы қосылуға болатын сертификатты көрсетіңіз.

Желі параметрлері — желі параметрлерін көрсетіңіз. Желілік платформа көп жағдайда виртуалды жеке бұлт (VPC) болуы керек. Қауіпсіздік топтары — сіздің даналарыңыз үшін қауіпсіздік топтары. Даналардың алдында балансизаторды қолданатындықтан, мен мұнда тек балансизатордан кіріс қосылымдарға рұқсат беретін топты көрсетуді ұсынамын. Яғни, сізде 2 (http) және 80 (https) порттарындағы кез келген жерден кіріс қосылымдарға мүмкіндік беретін теңгерімдеуші үшін 443 қауіпсіздік тобы болады, ал екіншісі баланстауыш тобының кез келген порттарында кіріс қосылымдарына мүмкіндік беретін машиналар үшін. . Екі топтағы шығыс қосылымдар TCP протоколы арқылы барлық мекенжайлардың барлық порттарына ашылуы керек. Сіз шығыс қосылымдар үшін порттар мен мекенжайларды шектей аласыз, бірақ содан кейін жабық портта бір нәрсеге қол жеткізуге тырыспағаныңызды үнемі бақылауыңыз керек.

Жад (томдар) — машиналар үшін диск параметрлерін көрсетіңіз. Диск өлшемі AMI-де көрсетілгеннен кем болмауы керек; ECS Optimized үшін ол 30 ГБ құрайды.

Жетілдірілген мәліметтер — қосымша параметрлерді көрсетіңіз.

Сатып алу опциясы — спот даналарын сатып алғымыз келе ме. Біз қалаймыз, бірақ бұл жерде бұл құсбелгіні қоймаймыз; біз оны Автоматты масштабтау тобында конфигурациялаймыз, онда басқа опциялар бар.

IAM данасы профилі — даналар іске қосылатын рөлді көрсетіңіз. Даналардың ECS жүйесінде іске қосылуы үшін оларға әдетте рөлде болатын рұқсаттар қажет ecsInstanceRole. Кейбір жағдайларда оны жасауға болады, егер жоқ болса, онда осында нұсқаулық мұны қалай істеу керектігі туралы. Жасалғаннан кейін біз оны үлгіде көрсетеміз.
Әрі қарай көптеген параметрлер бар, негізінен әдепкі мәндерді барлық жерде қалдыруға болады, бірақ олардың әрқайсысында нақты сипаттама бар. Мен әрқашан EBS оңтайландырылған данасын және егер пайдаланылса, T2/T3 Unlimited опцияларын қосамын жарылғыш даналары.

Пайдаланушы деректері — пайдаланушы деректерін көрсетеді. Біз файлды өңдейміз /etc/ecs/ecs.config, ол ECS агент конфигурациясын қамтиды.
Пайдаланушы деректері қандай болуы мүмкін мысалы:

#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.config

ECS_CLUSTER=DemoApiClusterProd — параметр дананың берілген аты бар кластерге жататынын көрсетеді, яғни бұл кластер өз тапсырмаларын осы серверде орналастыра алады. Біз әлі кластерді құрған жоқпыз, бірақ оны жасау кезінде осы атауды қолданамыз.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true — параметр нүктелік дананы өшіру сигналы қабылданған кезде ондағы барлық тапсырмаларды «Төгу» күйіне ауыстыру керектігін көрсетеді.

ECS_CONTAINER_STOP_TIMEOUT=1m - параметр SIGINT сигналын алғаннан кейін барлық тапсырмаларды өлтіруге дейін 1 минут бар екенін көрсетеді.

ECS_ENGINE_AUTH_TYPE=docker — параметр авторизациялау механизмі ретінде Docker схемасы қолданылатынын көрсетеді

ECS_ENGINE_AUTH_DATA=... — Docker кескіндері сақталатын жеке контейнер тізіліміне қосылу параметрлері. Егер ол жалпыға ортақ болса, онда ештеңе көрсетудің қажеті жоқ.

Осы мақаланың мақсаттары үшін мен Docker Hub-тен жалпыға ортақ кескінді пайдаланамын, сондықтан параметрлерді көрсетіңіз ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA керек емес.

білу пайдалы: AMI жүйесін үнемі жаңартып отыру ұсынылады, себебі жаңа нұсқалар Docker, Linux, ECS агенті және т.б. нұсқаларын жаңартады. Бұл туралы ұмытпау үшін хабарландыруларды орнату жаңа нұсқаларды шығару туралы. Хабарландыруларды электрондық пошта арқылы алуға және қолмен жаңартуға болады немесе жаңартылған AMI көмегімен іске қосу үлгісінің жаңа нұсқасын автоматты түрде жасайтын Lambda функциясын жаза аласыз.

EC2 автоматты масштабтау тобы

Автоматты масштабтау тобы даналарды іске қосу және масштабтау үшін жауап береді. Топтар EC2 -> Автоматты масштабтау -> Автоматты масштабтау топтары бөлімінде басқарылады.

Үлгіні іске қосу — алдыңғы қадамда жасалған үлгіні таңдаңыз. Біз әдепкі нұсқаны қалдырамыз.

Сатып алу опциялары және дана түрлері — кластерге арналған даналардың түрлерін көрсетіңіз. Іске қосу үлгісін іске қосу үлгісінен үлгі түрін пайдаланады. Сатып алу опциялары мен дана түрлерін біріктіру дана түрлерін икемді конфигурациялауға мүмкіндік береді. Біз оны қолданамыз.

Қосымша сұраныс бойынша база — әрқашан жұмыс істейтін тұрақты, дақсыз даналардың саны.

Сұраныс бойынша пайыздық базадан жоғары — тұрақты және спот даналарының пайыздық арақатынасы, 50-50 тең бөлінеді, әрбір тұрақты данаға 20-80 4 нүкте көтеріледі. Осы мысалдың мақсаттары үшін мен 50-50-ні көрсетемін, бірақ іс жүзінде біз көбінесе 20-80, кейбір жағдайларда 0-100 жасаймыз.

Дана түрлері — мұнда кластерде қолданылатын даналардың қосымша түрлерін көрсетуге болады. Біз оны ешқашан пайдаланбадық, өйткені мен әңгіменің мағынасын түсінбеймін. Мүмкін, бұл даналардың белгілі бір түрлеріне шектеулерге байланысты болуы мүмкін, бірақ оларды қолдау арқылы оңай көбейтуге болады. Егер сіз қосымшаны білсеңіз, мен оны түсініктемелерде оқуға қуаныштымын)

AWS Spot инстанцияларында масштабталатын API құру

Желі — желі параметрлері, VPC және машиналар үшін ішкі желілерді таңдаңыз, көп жағдайда барлық қолжетімді ішкі желілерді таңдау керек.

Жүктемелерді теңестіру - теңгергіш параметрлері, бірақ біз мұны бөлек жасаймыз, мұнда ештеңеге қол тигізбейміз. Денсаулықты тексеру кейінірек конфигурацияланады.

Топ мөлшері — біз кластердегі машиналар санының шектеулерін және іске қосу кезінде қажетті машиналар санын көрсетеміз. Кластердегі машиналар саны ешқашан көрсетілген минимумнан кем және максимумнан көп болмайды, тіпті егер масштабтау метрикаға сәйкес орын алса да.

Масштабтау саясаты — масштабтау параметрлері, бірақ біз іске қосылған ECS тапсырмалары негізінде масштабтаймыз, сондықтан масштабтауды кейінірек конфигурациялаймыз.

Дана масштабын қорғау — масштабты азайту кезінде даналарды жоюдан қорғау. Біз оны ASG орындалатын тапсырмалары бар құрылғыны жоймауы үшін қосамыз. ECS Capacity Provider тапсырмалары жоқ даналарды қорғауды өшіреді.

Тегтер қосыңыз — даналар үшін тегтерді көрсетуге болады (бұл үшін Жаңа даналарды белгілеу құсбелгісін қою керек). Мен Name тегін көрсетуді ұсынамын, содан кейін топ ішінде іске қосылған барлық даналар бірдей атқа ие болады және оларды консольде қарау ыңғайлы.

AWS Spot инстанцияларында масштабталатын API құру

Топты жасағаннан кейін оны ашып, «Қосымша конфигурациялар» бөліміне өтіңіз.Неліктен барлық опциялар жасау кезеңінде консольде көрінбейді.

Тоқтату саясаты — даналарды жою кезінде ескерілетін ережелер. Олар ретімен қолданылады. Біз әдетте төмендегі суреттегілерді қолданамыз. Біріншіден, ең ескі іске қосу үлгісі бар даналар жойылады (мысалы, егер біз AMI жаңартылған болса, біз жаңа нұсқаны жасадық, бірақ барлық даналар оған ауыса алды). Содан кейін келесі есеп айырысу сағатына ең жақын даналар таңдалады. Содан кейін ең ескілері іске қосу күніне қарай таңдалады.

AWS Spot инстанцияларында масштабталатын API құру

білу пайдалы: кластердегі барлық машиналарды жаңарту үшін, пайдалануға ыңғайлы Дана жаңартуы. Егер сіз мұны алдыңғы қадамдағы Lambda функциясымен біріктірсеңіз, сізде толық автоматтандырылған дананы жаңарту жүйесі болады. Барлық машиналарды жаңарту алдында топтағы барлық даналар үшін дананы масштабтаудан қорғауды өшіру керек. Топтағы конфигурация емес, машиналардың өздерінен қорғау, бұл Даналарды басқару қойындысында жасалады.

Application Load Balancer және EC2 Target Group

Баланс EC2 → Жүктемені теңестіру → Жүктеме теңестірушілер бөлімінде жасалады. Біз Application Load Balancer қолданамыз; әр түрлі теңдестіргіштердің салыстыруын мына жерден оқуға болады қызмет көрсету беті.

Тыңдаушылар - 80 және 443 порттарын жасау және кейінірек балансирлеу ережелерін пайдаланып 80-ден 443-ке қайта бағыттау мағынасы бар.

Қол жетімділік аймақтары — көп жағдайда біз барлығына қолжетімділік аймақтарын таңдаймыз.

Қауіпсіздік параметрлерін конфигурациялаңыз — мұнда теңгерушіге арналған SSL сертификаты көрсетілген, ең қолайлы нұсқа сертификат жасау ACM-де. Айырмашылықтар туралы Қауіпсіздік саясаты ішінде оқуға болады құжаттама, оны әдепкі бойынша таңдалған қалдыра аласыз ELBSecurityPolicy-2016-08. Балансты жасағаннан кейін сіз оны көресіз DNS атауыдоменіңіз үшін CNAME конфигурациялауыңыз қажет. Мысалы, бұл Cloudflare-де осылай көрінеді.

AWS Spot инстанцияларында масштабталатын API құру

Қауіпсіздік тобы — балансизатор үшін қауіпсіздік тобын жасаңыз немесе таңдаңыз, мен бұл туралы жоғарыда EC2 іске қосу үлгісі → Желі параметрлері бөлімінде толығырақ жаздым.

Мақсатты топ — біз теңгерімдегі сұраныстарды машиналарға бағыттауға және ақаулық туындаған жағдайда оларды ауыстыру үшін олардың қолжетімділігін тексеруге жауапты топ құрамыз. Мақсат түрі болуы керек, Хаттама и порт кез келген, егер балансизатор мен даналар арасындағы байланыс үшін HTTPS қолдансаңыз, оларға сертификатты жүктеп салуыңыз керек. Бұл мысалдың мақсаттары үшін біз мұны жасамаймыз, біз жай ғана 80 портты қалдырамыз.

Денсаулықты тексеру — қызметтің функционалдығын тексеру параметрлері. Нақты қызметте бұл бизнес логикасының маңызды бөліктерін жүзеге асыратын жеке сұрау болуы керек; осы мысалдың мақсаттары үшін мен әдепкі параметрлерді қалдырамын. Содан кейін сұрау аралығын, күту уақытын, сәттілік кодтарын және т.б. таңдауға болады. Біздің мысалда біз 200-399 Сәттілік кодтарын көрсетеміз, себебі пайдаланылатын Docker кескіні 304 кодын қайтарады.

AWS Spot инстанцияларында масштабталатын API құру

Мақсаттарды тіркеу — мұнда топқа арналған машиналар таңдалады, бірақ біздің жағдайда мұны ECS жасайды, сондықтан біз бұл қадамды өткізіп жібереміз.

білу пайдалы: баланстауыш деңгейінде белгілі бір уақытта S3 ішінде сақталатын журналдарды қосуға болады формат. Сол жерден оларды аналитика үшін үшінші тарап қызметтеріне экспорттауға болады немесе S3 жүйесіндегі деректерге тікелей SQL сұрауларын жасауға болады. Афинаны пайдалану. Бұл ыңғайлы және ешқандай қосымша кодсыз жұмыс істейді. Мен сондай-ақ белгілі бір уақыт кезеңінен кейін S3 шелегінен журналдарды жоюды орнатуды ұсынамын.

ECS тапсырмасының анықтамасы

Алдыңғы қадамдарда біз сервистік инфрақұрылымға қатысты барлығын жасадық, енді біз іске қосатын контейнерлерді сипаттауға көшеміз. Бұл ECS → Task Definitions бөлімінде орындалады.

Іске қосу түрінің үйлесімділігі - EC2 таңдаңыз.

Тапсырманы орындау IAM рөлі - таңдау ecsTaskExecutionRole. Оның көмегімен журналдар жазылады, құпия айнымалыларға рұқсат беріледі және т.б.

Контейнер анықтамалары бөлімінде Контейнерді қосу түймешігін басыңыз.

бейне — жоба коды бар суретке сілтеме; бұл мысал үшін мен Docker Hub-тен жалпыға ортақ кескінді қолданамын bitnami/түйін-мысал: 0.0.1.

Жад шектеулері — контейнерге арналған жад шектеулері. Қатаң шектеу — қатаң шектеу, егер контейнер көрсетілген мәннен асып кетсе, докерді өлтіру командасы орындалады, контейнер бірден өледі. Жұмсақ лимит — жұмсақ шек, контейнер көрсетілген мәннен шығуы мүмкін, бірақ бұл параметр машиналарда тапсырмаларды орналастыру кезінде ескерілетін болады. Мысалы, машинада 4 ГБ жедел жады болса және контейнердің жұмсақ шегі 2048 МБ болса, онда бұл құрылғыда осы контейнермен ең көбі 2 орындалатын тапсырма болуы мүмкін. Шындығында, 4 ГБ жедел жады 4096 МБ-тан сәл аз, оны кластердегі ECS даналары қойындысында көруге болады. Жұмсақ шектеу қатаң шектеуден үлкен болмауы керек. Түсіну керек, егер бір тапсырмада бірнеше контейнер болса, онда олардың шектері қорытындыланады.

Портты салыстыру - in Хост порты Біз 0-ді көрсетеміз, бұл порттың динамикалық түрде тағайындалатынын және Мақсатты топтың бақылауында болатынын білдіреді. Контейнер порты — қолданбаңыз жұмыс істейтін порт көбінесе орындау пәрменінде көрсетіледі немесе қолданба кодында, Dockerfile және т.б. тағайындалады. Біздің мысал үшін біз 3000-ды қолданамыз, себебі ол тізімде көрсетілген Докер файлы қолданылатын сурет.

Денсаулықты тексеру — мақсатты топта конфигурацияланғанмен шатастырмау үшін контейнер денсаулығын тексеру параметрлері.

қоршаған орта - орта параметрлері. CPU блоктары - жад шектеулеріне ұқсас, тек процессор туралы. Әрбір процессор өзегі 1024 бірлік, сондықтан серверде екі ядролы процессор болса және контейнер 512-ге орнатылған болса, бір серверде осы контейнермен 4 тапсырманы іске қосуға болады. CPU блоктары әрқашан өзектер санына сәйкес келеді; жадтағыдай олардың саны аз болуы мүмкін емес.

бұйрық — контейнер ішіндегі қызметті бастау пәрмені, барлық параметрлер үтірмен бөлінген. Бұл gunicorn, npm және т.б. болуы мүмкін. Көрсетілмесе, Dockerfile файлындағы CMD директивасының мәні пайдаланылады. көрсетеміз npm,start.

Қоршаған ортаның айнымалылары — контейнер ортасының айнымалылары. Бұл қарапайым мәтіндік деректер немесе құпия айнымалылар болуы мүмкін Құпиялар менеджері немесе Параметрлерді сақтау.

Сақтау және журналға жазу — мұнда біз CloudWatch Logs жүйесінде (AWS журналдарына арналған қызмет) жүйеге кіруді орнатамыз. Мұны істеу үшін CloudWatch журналдарын автоматты түрде конфигурациялау құсбелгісін қойыңыз. Тапсырма анықтамасын жасағаннан кейін журналдар тобы CloudWatch қолданбасында автоматты түрде жасалады. Әдепкі бойынша, журналдар онда шексіз сақталады; Мен Сақтау мерзімін Ешқашан бітпеуден қажетті кезеңге өзгертуді ұсынамын. Бұл CloudWatch Log топтарында жасалады, ағымдағы кезеңді басып, жаңасын таңдау керек.

AWS Spot инстанцияларында масштабталатын API құру

ECS кластері және ECS сыйымдылық провайдері

Кластер жасау үшін ECS → Кластерлер бөліміне өтіңіз. Үлгі ретінде EC2 Linux + Networking таңдаймыз.

Кластер атауы - өте маңызды, біз мұнда шаблонды іске қосу параметрінде көрсетілген атауды жасаймыз ECS_CLUSTER, біздің жағдайда - DemoApiClusterProd. Бос кластерді жасау құсбелгісін қойыңыз. Қосымша түрде CloudWatch қызметіндегі көрсеткіштерді көру үшін Container Insights мүмкіндігін қосуға болады. Егер сіз бәрін дұрыс орындасаңыз, онда ECS Instances бөлімінде Автоматты масштабтау тобында жасалған машиналарды көресіз.

AWS Spot инстанцияларында масштабталатын API құру

Қойындыға өтіңіз Сыйымдылықты қамтамасыз етушілер және жаңасын жасаңыз. Естеріңізге сала кетейін, ECS тапсырмаларының санына байланысты машиналарды жасауды және өшіруді бақылау қажет. Провайдер тек бір топқа тағайындалуы мүмкін екенін ескеру маңызды.

Автоматты масштабтау тобы — бұрын жасалған топты таңдаңыз.

Басқарылатын масштабтау — провайдер қызметті масштабтай алатындай етіп қосыңыз.

Мақсатты сыйымдылық % — бізге тапсырмалар жүктелген машиналардың қанша пайызы қажет. Егер сіз 100% көрсетсеңіз, онда барлық машиналар әрқашан орындалатын тапсырмалармен бос болады. Егер сіз 50% көрсетсеңіз, онда автомобильдердің жартысы әрқашан бос болады. Бұл жағдайда жүктің күрт секіруі орын алса, жаңа таксилер даналарды орналастыруды күтпей-ақ, бірден бос көліктерге жетеді.

Басқарылатын тоқтату қорғауы — қосу, бұл параметр провайдерге жоюдан даналарды қорғауды алып тастауға мүмкіндік береді. Бұл құрылғыда белсенді тапсырмалар болмаған кезде орын алады және Мақсатты сыйымдылыққа% мүмкіндік береді.

ECS қызметі және масштабтауды орнату

Соңғы қадам :) Қызметті жасау үшін Қызметтер қойындысында бұрын жасалған кластерге өту керек.

Іске қосу түрі — Сыйымдылық провайдеріне ауысу стратегиясын басып, бұрын жасалған провайдерлерді таңдау керек.

AWS Spot инстанцияларында масштабталатын API құру

Тапсырма анықтамасы — бұрын жасалған тапсырма анықтамасын және оны қайта қарауды таңдаңыз.

Қызмет атауы — шатастырмау үшін біз әрқашан Task Definition сияқты көрсетеміз.

Қызмет түрі - әрқашан Көшірме.

Тапсырмалар саны — қызметтегі белсенді тапсырмалардың қажетті саны. Бұл параметр масштабтау арқылы басқарылады, бірақ әлі де көрсетілуі керек.

Ең аз сау пайыз и Максималды пайыз — орналастыру кезіндегі тапсырмалардың тәртібін анықтау. Әдепкі мәндер 100 және 200 болып табылады, бұл орналастыру кезінде тапсырмалар саны бірнеше есе артып, содан кейін қажетті мәнге оралатынын көрсетеді. Егер сізде 1 тапсырма орындалса, min=0 және max=100, онда орналастыру кезінде ол жойылады, содан кейін жаңасы көтеріледі, яғни бос уақыт болады. Егер 1 тапсырма орындалса, min=50, max=150, онда орналастыру мүлде болмайды, себебі 1 тапсырманы екіге бөлу немесе бір жарым есе көбейту мүмкін емес.

Орналастыру түрі — Rolling жаңартуын қалдырыңыз.

Орналастыру үлгілері — машиналарға тапсырмаларды орналастыру ережелері. Әдепкі мән – AZ Balanced Spread – бұл әрбір жаңа тапсырма барлық қолжетімділік аймақтарындағы машиналар көтерілгенше жаңа данаға орналастырылатынын білдіреді. Біз әдетте BinPack - CPU және Spread - AZ жасаймыз; бұл саясатпен тапсырмалар бір процессорға бір машинада мүмкіндігінше тығыз орналастырылады. Жаңа машина жасау қажет болса, ол жаңа қолжетімділік аймағында жасалады.

AWS Spot инстанцияларында масштабталатын API құру

Жүктеме балансының түрі — Application Load Balancer таңдаңыз.

Қызмет IAM рөлі - таңдау ecsServiceRole.

Жүктеме балансының атауы — бұрын жасалған балансизаторды таңдаңыз.

Денсаулықты тексерудің жеңілдік кезеңі — жаңа тапсырманы орындағаннан кейін денсаулықты тексеру алдында үзіліс жасаңыз, біз оны әдетте 60 секундқа орнатамыз.

Жүктеме балансы үшін контейнер — Мақсатты топ атауы элементінде бұрын жасалған топты таңдаңыз, сонда бәрі автоматты түрде толтырылады.

AWS Spot инстанцияларында масштабталатын API құру

Автоматты масштабтау қызметі — қызметті масштабтау параметрлері. Қызметіңіздің қажетті санын реттеу үшін Қызметті автоматты масштабтауды конфигурациялау опциясын таңдаңыз. Масштабтау кезінде тапсырмалардың ең аз және максималды санын белгілейміз.

Қызметті автоматты масштабтау үшін IAM рөлі - таңдау AWSServiceRoleForApplicationAutoScaling_ECSService.

Автоматты тапсырмаларды масштабтау саясаттары — масштабтау ережелері. 2 түрі бар:

  1. Мақсатты бақылау — мақсатты көрсеткіштерді бақылау (CPU/RAM пайдалану немесе әрбір тапсырма үшін сұраулар саны). Мысалы, процессордың орташа жүктемесі 85% болғанын қалаймыз, ол жоғарылағанда, ол мақсатты мәнге жеткенше жаңа тапсырмалар қосылады. Егер жүктеме аз болса, масштабты азайтудан қорғау қосылмайынша, тапсырмалар жойылады (Масштабтауды өшіру).
  2. Қадамды масштабтау - ерікті оқиғаға реакция. Мұнда кез келген оқиғаға реакцияны конфигурациялауға болады (CloudWatch Alarm), ол орын алған кезде тапсырмалардың көрсетілген санын қосуға немесе жоюға немесе тапсырмалардың нақты санын көрсетуге болады.

Қызметте бірнеше масштабтау ережелері болуы мүмкін, бұл пайдалы болуы мүмкін, бастысы олардың бір-біріне қайшы келмеуін қамтамасыз ету.

қорытынды

Нұсқауларды орындасаңыз және бірдей Docker кескінін пайдалансаңыз, қызметіңіз осындай бетті қайтаруы керек.

AWS Spot инстанцияларында масштабталатын API құру

  1. Біз үлгіні жасадық, оған сәйкес қызметтегі барлық машиналар іске қосылады. Үлгі өзгерген кезде біз машиналарды қалай жаңарту керектігін де білдік.
  2. Біз нүктелік дананы тоқтату сигналын өңдеуді конфигурацияладық, сондықтан оны алғаннан кейін бір минут ішінде барлық орындалатын тапсырмалар құрылғыдан жойылады, сондықтан ештеңе жоғалмайды немесе үзілмейді.
  3. Жүкті машиналарға біркелкі бөлу үшін теңгерімді көтердік.
  4. Біз машина шығындарын шамамен 3 есе азайтатын спот даналарында жұмыс істейтін қызметті жасадық.
  5. Біз бос уақыт шығындарынсыз ұлғайған жұмыс жүктемелерін өңдеу үшін екі бағытта да автомасштабтауды конфигурацияладық.
  6. Қолданба инфрақұрылымды (машиналарды) басқаратындай етіп, басқа жолмен емес, біз Capacity Provider пайдаланамыз.
  7. Біз кереметпіз.

Жүктемеде болжамды өсулер болса, мысалы, үлкен электрондық пошта науқанында жарнама жасап жатсаңыз, масштабтауды келесі арқылы орнатуға болады. кесте.

Сондай-ақ жүйенің әртүрлі бөліктерінен алынған деректер негізінде масштабтауға болады. Мысалы, бізде функционалдылық бар жеке жарнамалық ұсыныстарды жіберу мобильді қосымшаның пайдаланушылары. Кейде науқан 1 миллионнан астам адамға жіберіледі. Мұндай таратудан кейін API-ге сұраныстар әрқашан үлкен өседі, өйткені көптеген пайдаланушылар қолданбаға бір уақытта кіреді. Жарнамалық push хабарландыруларын жіберу кезегінде стандартты көрсеткіштердің әлдеқайда көп екенін көрсек, жүктемеге дайын болу үшін бірден бірнеше қосымша машиналар мен тапсырмаларды іске қоса аламыз.

Түсініктемелерде нүктелік инстанцияларды және ECS пайдаланудың қызықты жағдайларын немесе масштабтау туралы бірдеңе айтсаңыз, мен қуаныштымын.

Жақында негізінен серверсіз стекте (ақшамен) секундына мыңдаған аналитикалық оқиғаларды қалай өңдейтініміз және GitLab CI және Terraform Cloud көмегімен қызметтерді орналастыру қалай жұмыс істейтіні туралы мақалалар шығады.

Бізге жазылыңыз, бұл қызықты болады!

Сауалнамаға тек тіркелген пайдаланушылар қатыса алады. Кіру, өтінемін.

Өндірісте спот даналарын пайдаланасыз ба?

  • 22,2%Иә6

  • 66,7%№18

  • 11,1%Мен олар туралы мақаладан білдім және оларды пайдалануды жоспарлап отырмын3

27 пайдаланушы дауыс берді. 5 пайдаланушы қалыс қалды.

Ақпарат көзі: www.habr.com

пікір қалдыру