Skalieritava API loomine AWS-i spot-instantides

Tere kĂ”igile! Olen Kirill, Adapty CTO. Suur osa meie arhitektuurist asub AWS-is ja tĂ€na rÀÀgin, kuidas me vĂ€hendasime serverikulud kolmandiku vĂ”rra, kasutades spot-instantte tootmisĂŒmbruses, samuti sellest, kuidas neid automaatselt skaalaida. Esiteks, tutvustus, kuidas see töötab, ja seejĂ€rel pĂ”hjalik juhend kĂ€ivitamiseks.

Mis on spot-instantid?

Spot-instantid on AWS-i teiste kasutajate serverid, mis on hetkel kasutamata, ja nad mĂŒĂŒvad neid suure allahindlusega (Amazon kirjutab kuni 90%, meie kogemuse jĂ€rgi on see ~3x, varieerub olenevalt piirkonnast, AZ-st ja instanttĂŒĂŒbist). Peamine erinevus tavainstantidest on see, et need vĂ”ivad igal hetkel vĂ€lja lĂŒlituda. SeetĂ”ttu arvasime kaua, et nende kasutamine on normaalne arenduskeskkondades vĂ”i ĂŒlesannete arvutamisel, salvestades vahepealsed tulemused S3-sse vĂ”i andmebaasi, kuid mitte tootmises. On olemas kolmandate osapoolte lahendusi, mis vĂ”imaldavad spot-e tootmises kasutada, kuid seal meie juhtumi korral on palju töökohustuslikke lahendusi, seetĂ”ttu ei rakendanud me neid. Artiklis kirjeldatud lĂ€henemine töötab tĂ€ielikult AWS-i standardsete funktsioonide raames, ilma tĂ€iendavate skriptide, cronide jne.

JÀrgnevalt toon mÔned ekraanipildid, mis nÀitavad spot-instantide hindade ajalugu.

m5.large piirkonnas eu-west-1 (Iirimaa). Hind on peamiselt stabiilne 3 kuu jooksul, praegu on kokkuhoid 2.9x.

Skalieritava API loomine AWS-i spot-instantides

m5.large piirkonnas us-east-1 (PÔhja-Virginia). Hind muutub pidevalt 3 kuu jooksul, praegu on kokkuhoid vahemikus 2.3x kuni 2.8x sÔltuvalt kÀttesaadavuse tsoonist.

Skalieritava API loomine AWS-i spot-instantides

t3.small piirkonnas us-east-1 (PÔhja-Virginia). Hind on stabiilne 3 kuu jooksul, praegu on kokkuhoid 3.4x.

Skalieritava API loomine AWS-i spot-instantides

Teenuse arhitektuur

Otsese teenuse pÔhiarhitektuur, millest me selles artiklis rÀÀgime, on kujutatud alloleval diagrammil.

Skalieritava API loomine AWS-i spot-instantides

Application Load Balancer → EC2 sihtgrupp → Elastne konteinerite teenus

Balansseerijana kasutatakse Application Load Balancerit (ALB), mis suunab pÀringud EC2 sihtgruppi (TG). TG vastutab portide avamise eest instantides ALB jaoks ja nende sidumise eest Elastse konteinerite teenuse (ECS) konteinerite portidega. ECS on AWS-i Kubernetes, mis tegeleb Docker konteinerite haldamisega.

Ühel instantsil vĂ”ib olla mitu töötavat konteinerit sama portidega, seega ei saa me neid fikseeritud mÀÀrata. ECS teatab TG-le, et kĂ€ivitab uue ĂŒlesande (Kubernetes'i terminoloogias nimetatakse seda pod'iks), see kontrollib instantsil vabu porte ja mÀÀrab ĂŒhe neist kĂ€itatavale ĂŒlesandele. TG kontrollib regulaarselt, kas instants ja selle API töötavad lĂ€bi tervisekontrolli ning kui mĂ€rkab mingeid probleeme, lĂ”petab see sinna pĂ€ringute edastamise.

EC2 Auto Scaling Groups + ECS Capacity Providers

Ülaltoodud diagrammil ei ole kujutatud EC2 Auto Scaling Groups (ASG) teenust. Nimi ĂŒtleb, et see vastutab instantside skaleerimise eest. Kuid kuni hiljuti ei vĂ”imaldanud AWS integreeritud vĂ”imalust hallata ECS-ist kĂ€ivitatud masinate arvu. ECS vĂ”imaldas skaleerida ĂŒlesannete arvu, nĂ€iteks CPU, RAM vĂ”i pĂ€ringute arvu alusel. Kuid kui ĂŒlesanded hĂ”ivasid kĂ”ik vabad instantsid, siis uusi masinaid automaatselt ei tĂ”statud.

See muutus koos ECS Capacity Providers (ECS CP) ilmumisega. NĂŒĂŒd saab iga teenuse ECS-is siduda ASG-ga, ja kui ĂŒlesanded ei mahutu töötavatele instantsidele, tĂ”stetakse uusi (kuid ASG kehtestatud piirangute raames). See töötab ka vastupidiselt: kui ECS CP nĂ€eb rippuvaid instantsid ilma ĂŒlesanneteta, annab see ASG-le kĂ€su need vĂ€lja lĂŒlitada. ECS CP-l on vĂ”imalus mÀÀrata sihtkoormuse protsent, et teatud hulk masinaid oleks alati vaba kiireks ĂŒlesannete skaleerimiseks, sellest rÀÀgin vĂ€hese aja pĂ€rast.

EC2 Launch Templates

Viimane teenus, millest ma rÀÀgin enne, kui lĂ€hen selle infrastruktuuri loomise ĂŒksikasjalikule kirjeldamisele, on EC2 Launch Templates. See vĂ”imaldab luua ŃˆĐ°Đ±Đ»ĐŸĐœ, mille jĂ€rgi kĂ”ik masinad kĂ€ivitatakse, et seda ei peaks iga kord nullist kordama. Siin saab valida kĂ€ivitatava masina tĂŒĂŒbi, turvagruppi, ketta kujunduse ja palju muid parameetreid. Samuti saab mÀÀrata kohandatud andmeid, mis laaditakse kĂ”ikidele kĂ€ivitatavatele instantsidele. Kohandatud andmete kaudu saab kĂ€ivitada skripte, nĂ€iteks saab redigeerida faili sisu ECS agendi konfiguratsioon.

Üks kĂ”ige olulisemaid konfiguratsiooni parameetreid antud artiklis on ECS_ENABLE_SPOT_INSTANCE_DRAINING=true. Kui see parameeter on sisse lĂŒlitatud, siis kui ECS saab signaali, et spottinstanss on eemaldamiseks, muudab ta kĂ”ik sellel töötavad ĂŒlesanded staatusesse Draining. Uusi ĂŒlesandeid sellele instantsile ei mÀÀrata, kui on ĂŒlesandeid, mis soovivad sinna voolata, siis need tĂŒhistatakse. Tasakaalustajatelt ei tule ka uusi pĂ€ringuid. Teade instantsi eemaldamisest saabub kaks minutit enne tegelikku sĂŒndmust. SeetĂ”ttu, kui teie teenus ei tee tööd kauem kui 2 minutit ja ei salvesta midagi kettale, siis vĂ”ite kasutada spottinstantsse ilma andmete kaotuseta.

Ketta osas — AWS tegi hiljuti saadaval , et kasutada Elastic File System (EFS) koos ECS-iga; sellise skeemi puhul ei ole ketas takistuseks, kuid me ei ole seda proovinud, kuna pĂ”himĂ”tteliselt ei ole meil ketast oleku salvestamiseks vaja. Vaikimisi, kui saadetakse SIGINT (saadetakse hetkel, kui ĂŒlesanne muudetakse staatusesse Draining), lĂ”petatakse kĂ”ik töötavad ĂŒlesanded 30 sekundi jooksul, isegi kui nad ei ole valmis saanud, seda aega saab muuta parameetri ECS_CONTAINER_STOP_TIMEOUT. Peamine on mitte seada seda rohkem kui 2 minutit spottmasinate jaoks.

Teenuse loomine

Liigume otse nimetatud teenuse loomise juurde. Protsessi kĂ€igus kirjeldan tĂ€iendavalt mitmeid kasulikke punkte, millest eelnevalt ei rÀÀgitud. Üldiselt on see samm-sammult juhend, kuid mĂ”ned tĂ€iesti pĂ”hialused vĂ”i vastupidi, vĂ€ga spetsiifilised juhtumid ei ole mul kavas kĂ€sitleda. KĂ”ik toimingud toimuvad AWS visuaalses konsoolis, kuid neid saab programmiliselt korrata CloudFormationi vĂ”i Terraformi abil. Adapty-s kasutame Terraformi.

EC2 kÀivitamisƥabloon

Selles teenuses luuakse masinate konfiguratsioon, mida kasutatakse. Ć abloonide haldamine toimub jaotises EC2 -> Instances -> Launch templates.

Amazon machine image (AMI) — mÀÀrame ketta kuju, millega kĂ”ik instantsid kĂ€ivituvad. ECS-i jaoks on enamasti mĂ”istlik kasutada Amazon'i optimeeritud kujutist. See uuendatakse regulaarselt ja sisaldab kĂ”ike vajalikku ECS-i tööks. Aktiivse kujutise ID teadmiseks kĂŒlastage lehte Amazon ECS-optimized AMIs, valige kasutatav piirkond ja kopeerige AMI ID selle jaoks. NĂ€iteks us-east-1 piirkonnas on kirjutamise hetkel aktiivne ID — ami-00c7c1cf5bdc913ed. Selle ID tuleks sisestada punkti Specify a custom value.

Instantsi tĂŒĂŒp — mÀÀrake instantsi tĂŒĂŒp. Valige see, mis sobib teie ĂŒlesandele kĂ”ige paremini.

Ava vĂ”tmepaar (sisselogimine) — mÀÀrake sertifikaat, millega saab instantsi SSH kaudu ĂŒhenduda, kui vajadus peaks tekkima.

VĂ”rgu seaded — mÀÀrake vĂ”rgu parameetrid. VĂ”rgustiku platvorm enamikul juhtudel peaks olema Virtuaalne Erakliendi VĂ”rk (VPC). Turvagruppide — turvagruppid teie instantside jaoks. Kuna me kasutame instantside ees koormuse tasakaalustajat, soovitan siin mÀÀrata grupi, mis lubab sissetulevad ĂŒhendused ainult koormuse tasakaalustajalt. See tĂ€hendab, et teil on 2 turvagruppi: ĂŒks koormuse tasakaalustajale, mis lubab sissetulevaid (inbound) ĂŒhendusi igalt poolt portide 80 (http) ja 443 (https) kaudu, ning teine masinate jaoks, mis lubab sissetulevaid ĂŒhendusi mistahes portide kaudu koormuse tasakaalustaja grupilt. VĂ€ljaminevad (outbound) ĂŒhendused mĂ”lemas grupis tuleb avada kĂ”igile portidele TCP protokolli kaudu kĂ”ikidesse aadressidesse. VĂ€ljaminevaid ĂŒhendusi on vĂ”imalik piirata portide ja aadressidega, kuid siis on vaja pidevalt jĂ€lgida, et te ei ĂŒritaks suhelda suletud portide kaudu.

Salvestus (maht) — mÀÀrake masinate ketaste parameetrid. Ketta maht ei tohi olla vĂ€iksem kui see, mis on mÀÀratud AMI-s, ECS Optimizatsiooni jaoks — 30 GiB.

TĂ€iendavad ĂŒksikasjad — mÀÀrake tĂ€iendavad parameetrid.

OstuvĂ”imalus — kas soovime osta spoot instantsid. Me soovime, kuid seda mĂ€rki me siin ei pane, seadistame selle Auto Scaling Groupis, seal on rohkem valikuid.

IAM instantsi profiil — mÀÀrake roll, millega instantsid kĂ€ivituvad. Et instantsid töötaksid ECS-is, on neil vaja Ă”igusi, mis tavaliselt kuuluvad rollile ecsInstanceRole. MĂ”nel juhul vĂ”ib see olla loodud; kui ei, siis siin juhend kuidas seda teha. PĂ€rast loomist mÀÀrame selle mallis.
Edasi on palju parameetreid, enamikul juhtudel vĂ”ib jĂ€tta vaikeseaded, kuid igaĂŒhel on arusaadav kirjeldus. Ma alati lĂŒlitan sisse EBS-optimeeritud instansi ja T2/T3 Unlimited, kui need on kasutusel burstable instantside jaoks.

Kasutajate andmed — mÀÀrake kasutaja andmed. Me redigeerime faili /etc/ecs/ecs.config, kus asub ECS-i agendi konfiguratsioon.
NÀide sellest, milline kasutaja andmed vÀlja vÔivad nÀha:

#!/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 — parameeter nĂ€itab, et instants kuulub mÀÀratud nimega klastrisse, st see klaster saab oma ĂŒlesandeid sellele serverile paigutada. Me pole veel klastrit loonud, kuid selle loomisel kasutame seda nime.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true — parameeter nĂ€itab, et spottinstansi vĂ€ljalĂŒlitamise signaali saamisel peavad kĂ”ik selle ĂŒlesanded olema mÀÀratud staatusele Draining.

ECS_CONTAINER_STOP_TIMEOUT=1m — parameeter nĂ€itab, et pĂ€rast SIGINT signaali saamist on kĂ”igil ĂŒlesannetel 1 minut, enne kui need lĂ”petatakse.

ECS_ENGINE_AUTH_TYPE=docker — parameeter nĂ€itab, et autoriseerimise mehhanismina kasutatakse docker skeemi.

ECS_ENGINE_AUTH_DATA=... — seosed privaatse konteineriregistriga, kus teie Docker pildid asuvad. Kui see on avalik, pole midagi tĂ€psustama.

KÀesolevas artiklis kasutan avalikku pilti Docker Hub'ist, seega ei tule seoseid tÀpsustada. ECS_ENGINE_AUTH_TYPE ja ECS_ENGINE_AUTH_DATA ei ole vajalik.

Kasulik teada: soovitatakse regulaarselt uuendada AMI-d, sest uutes versioonides uuendatakse Docker, Linux, ECS agente jne. Et sellest mitte unustada, vÔite seada teavitused uusversioonide vÀljatulekust. Saate teavitusi e-posti teel ja uuendada kÀsitsi vÔi saate kirjutada Lambda-funktsiooni, mis loob automaatselt uue versiooni Launch Template'ist koos uuendatud AMI-ga.

EC2 Auto Scaling Group

Auto Scaling Group vastutab instantside kÀivitamise ja skaleerimise eest. Gruppide juhtimine toimub jaotises EC2 -> Auto Scaling -> Auto Scaling Groups.

Launch template — valime eelmisel sammul loodud mall. Versioon jÀÀb vaikeseadeks.

Ostuvalikud ja instantside tĂŒĂŒbid — mÀÀrame klastrile instantside tĂŒĂŒbid. Adhere to launch template kasutab Launch Template'ist instantsitĂŒĂŒpi. Combine purchase options and instance types vĂ”imaldab paindlikult konfigureerida instantside tĂŒĂŒpe. Me kasutame seda.

Valikuline On-Demand baaspunkt — tavaliste, mitte-spottinstantside arv, mis töötavad alati.

On-Demand protsentuaalne suhe baaspunkti ĂŒle — tavaliste ja spottinstantside protsentuaalne suhe, 50-50 jagab vĂ”rdselt, 20-80 tĂ€hendab, et iga tavalise instantsi kohta tĂ”useb 4 spottinstantsi. Antud nĂ€ites mÀÀran 50-50, kuid tegelikult teeme enamasti 20-80, mĂ”nedel juhtudel 0-100.

Instantside tĂŒĂŒbid — siit saab tĂ€psustada tĂ€iendavaid instantsi tĂŒĂŒpe, mida kasutatakse klastris. Me ei ole seda kunagi kasutanud, kuna ma ei mĂ”ista eriti selle loo eesmĂ€rki. VĂ”ib-olla on teema instantsi tĂŒĂŒpide piirangutes, kuid need suurenevad toetuse kaudu kergesti. Kui tead rakendusest, oleksin tĂ€nulik, kui jagaksid kommentaarides)

Skalieritava API loomine AWS-i spot-instantides

VĂ”rk — vĂ”rguseaded, valida VPC ja alamvĂ”rgud masinate jaoks, enamikul juhtudel tasub valida kĂ”ik saadaval olevad alamvĂ”rgud.

Koormuse tasakaalustamine — tasakaalustaja seaded, kuid selle teeme eraldi, siin me midagi ei muuda. Tervisekontrollid ka seadistatakse hiljem.

RĂŒhma suurus — mÀÀrame piirangud klastris olevate masinate arvu ja soovitud masinate arvu alguses. Klastris olevate masinate arv ei muutu kunagi vĂ€iksemaks kui minimaalne ja suuremaks kui maksimaalne, isegi kui mÔÔdikute puhul peaks toimuma skaleerimine.

Skaleerimisreeglid — skaleerimise seaded, kuid me skaleerime kĂ€ivitatud ECS ĂŒlesandeid silmas pidades, seetĂ”ttu seadistame skaleerimise hiljem.

Instantsi skalaarse sissetoodud kaitse — instantside kaitse eemaldamise eest skaleerimise ajal alla poole. LĂŒlitame sisse, et ASG ei kustutaks masinat, millel on kĂ€ivitatud ĂŒlesanded. Kaitse eemaldamine instantsidelt, millel pole ĂŒlesandeid, toimub ECS Capacity Provideri kaudu.

Lisa silte — saab mÀÀrata silte instantsidele (selleks peab olema mĂ€rgitud kinnitus 'Tag new instances'). Soovitan mÀÀrata sildi Nimi, siis on kĂ”ik grupis kĂ€ivitatavad instantsid sama nimega, neid on mugav vaadata konsoolis.

Skalieritava API loomine AWS-i spot-instantides

PÀrast grupi loomist avage see ja minge jaotisse TÀiendavad seaded, miks ei ole loomise etapis konsoolis nÀhtavad kÔik valikud.

LĂ”petamisreeglid — reeglid, mida arvesse vĂ”etakse instantside eemaldamisel. Need rakenduvad jĂ€rjekorras. Me kasutame tavaliselt selliseid, nagu alloleval joonisel. Esiteks kustutatakse instantsid, millel on kĂ”ige vanem Launch Template (nĂ€iteks kui oleme uuendanud AMI, oleme loonud uue versiooni, kuid kĂ”ik instantsid on jĂ”udnud sellele ĂŒle minna). Siis valitakse instantsid, mis on kĂ”ige lĂ€hemal jĂ€rgmisele arvelduseale. Ja edasi valitakse vanimad kĂ€ivitamise kuupĂ€eva jĂ€rgi.

Skalieritava API loomine AWS-i spot-instantides

Kasulik teada: kĂ”igi klastris olevate masinate uuendamiseks on mugav kasutada Instantsi vĂ€rskendus. Kui kombineerida see eelneva sammu Lambda funktsiooniga, on teil tĂ€ielikult automatiseeritud instantside vĂ€rskendamise sĂŒsteem. Enne kĂ”igi masinate vĂ€rskendamist tuleb kĂ”igi grupi instantside jaoks keelata instantsi skaalakaitse. See ei ole grupi seade, vaid kaitse ise masinatel, mida saab teha Instantsihalduse vahekaardil.

Rakenduse Load Balancer ja EC2 sihtrĂŒhm

Balansseerija luuakse EC2 → Load Balancing → Load Balancers. Kasutame rakenduse Load Balancerit, erinevate tasemete balansseerijate vĂ”rdlemist saate lugeda teenuse lehelt.

Kuulajad — on mĂ”istlik teha 80 ja 443 porti ning suunata 80-lt 443-le balanseerija reeglite abil.

Saadavuspiirkonnad — enamikul juhtudel valime kĂ”ik saadavuspiirkonnad.

Konfigureeri turvaseaded — siin mÀÀratakse SSL-sertifikaat balansseerija jaoks, mugavaim valik on teha sertifikaat ACM-is. Erinevuste kohta Turvapoliitika vĂ”ite lugeda dokumentatsioon, vĂ”ib jĂ€tta vaikimisi valitud ELBSecurityPolicy-2016-08. PĂ€rast balansseerija loomist nĂ€ete selle DNS nime, millele tuleb seadistada CNAME teie domeeni jaoks. NĂ€iteks nĂ€eb see Cloudflays vĂ€lja nii.

Skalieritava API loomine AWS-i spot-instantides

Turgrupp — loome vĂ”i valime balansseerija jaoks turvagruppi, mille kohta olen varem rohkem kirjutanud jaotisest EC2 Launch Template → VĂ”rguseaded.

SihtrĂŒhm — loome rĂŒhma, mis vastutab pĂ€ringute suunamise eest balansseerijalt masinatele ja kontrollib nende kĂ€ttesaadavust, et neid probleemide korral asendada. Sihi tĂŒĂŒp peab olema Instants, Protokoll ja Port igat tĂŒĂŒpi, kui kasutate HTTPS-i kontakteerumiseks balansseerija ja instantside vahel, tuleb neile laadida sertifikaat. Antud nĂ€ites me seda ei tee, jĂ€etakse lihtsalt 80 port.

Tervisekontrollid — teenuse töökindluse kontrollimise parameetrid. TĂ”eliselt teenuses peaks see olema eraldi pĂ€ring, mis viib lĂ€bi olulised Ă€riloogika osad, antud nĂ€ites jĂ€tan vaikeseaded. Edasi saab valida pĂ€ringute intervalli, aegumise, eduka vastuse koodid jne. Meie nĂ€ites mÀÀrame eduka koodid 200-399, sest Docker pilt, mida kasutatakse, tagastab 304 koodi.

Skalieritava API loomine AWS-i spot-instantides

Registreeri sihid — siin valitakse grupile masinad, kuid meie juhul tegeleb sellega ECS, seega jĂ€tame selle sammu vahele.

Kasulik teada: balansseerija tasemel saab lubada logid, mis salvestatakse S3-s kindlas formaadis. Sealt, mida saab eksportida kolmandate osapoolte analĂŒĂŒsiteenustesse, vĂ”i teha SQL-pĂ€ringuid otse S3 andmete pĂ”hjal Athena abil. See on mugav ja töötab ilma tĂ€iendava koodita. Samuti soovitan seadistada logide eemaldamine S3 kaustast mÀÀratud aja möödudes.

ECS Ülesande MÀÀratlemine

Varasemates etappides lĂ”ime kĂ”ik, mis on seotud teenuse infrastruktuuriga, nĂŒĂŒd liigume konteinerite kirjeldamise juurde, mida hakkame kĂ€ivitama. Seda tehakse ECS → Task Definitions jaos.

KĂ€ivitustĂŒĂŒbi ĂŒhilduvus — valime EC2.

Ülesande tĂ€itmise IAM-roll — valime ecsTaskExecutionRole. Selle abil kirjutatakse logisid, saadakse juurdepÀÀs salajastele muutujatele jne.

Container Definitions jaos vajutame Lisa konteiner.

Pilt — link projekti koodi pildile, kasutame selle nĂ€ite raames avalikku pilti Docker Hubist bitnami/node-example:0.0.1.

MĂ€lu piirangud — konteineri jaoks mĂ”eldud mĂ€lu piirangud. JĂ”hkrad piirangud — jĂ”hkrad piirangud, kui konteiner ĂŒletab mÀÀratud vÀÀrtuse, kĂ€ivitatakse kĂ€sk docker kill, konteiner sureb koheselt. Pehmed piirangud — pehmed piirangud, konteiner vĂ”ib ĂŒletada mÀÀratud vÀÀrtuse, kuid ĂŒlesannete paigutamisel masinatele vĂ”etakse see parameeter arvesse. NĂ€iteks, kui masinal on 4 GiB RAM-i ja konteineri pehme piirang on 2048 MiB, siis vĂ”ib sellel masinal olla maksimaalselt 2 jooksvas ĂŒlesandes selle konteineriga. Tegelikult on 4 GiB RAM veidi vĂ€hem kui 4096 MiB, seda saab vaadata klastris ECS Instances vahelehelt. Pehme piirang ei saa olla suurem kui jĂ”hkrad piirangud. Oluline on mĂ”ista, et kui ĂŒhes ĂŒlesandes on mitu konteinerit, siis nende piirangud summeeruvad.

Sadama kaardistamine — Hosti port mÀÀrame 0, see tĂ€hendab, et port mÀÀratakse dĂŒnaamiliselt, seda jĂ€lgib Target Group. Konteineri port — port, millel teie rakendus töötab, mÀÀratakse sageli tĂ€itmise kĂ€sus vĂ”i mÀÀratakse teie rakenduse koodis, Dockerfile'is jne. Kasutame oma nĂ€ites 3000, sest see on mÀÀratud Dockerfile kasutatavas pildis.

Tervisekontroll — konteineri töökindluse kontrollimise parameetrid, mitte segi ajada with Target Group'is seadistatud.

Keskkond — keskkonnaseaded. CPU ĂŒksused — sarnane mĂ€lu piirangutega, ainult protsessori kohta. Iga protsessorituuma kohta on 1024 ĂŒhikut, seega kui serveril on kahetuumaline protsessor ja konteineril on vÀÀrtus 512, siis saab ĂŒhel serveril kĂ€ivitada 4 ĂŒlesannet selle konteineriga. CPU ĂŒhikud vastavad alati tuumade arvule, neid ei saa olla natuke vĂ€hem, nagu mĂ€lu puhul.

KĂ€sk — kĂ€sk teenuse kĂ€ivitamiseks konteineri sees, kĂ”ik parameetrid nĂ€idatakse koma kaudu. See vĂ”ib olla gunicorn, npm jne. Kui ei ole mÀÀratud, kasutatakse Dockerfile'i direktiivi CMD vÀÀrtust. NĂ€itame npm,start.

Keskkonnamuutujad — konteineri keskkonnamuutujad. Need vĂ”ivad olla nii lihtsalt tekstilised andmed kui ka salajased muutujad Secrets Manager vĂ”i Parameter Store.

Salvestamine ja logimine — siin seadistame logimise CloudWatch Logs'i (AWS-i logiteenus). Selleks piisab Auto-configure CloudWatch Logs'i mĂ€rkimisest. PĂ€rast Task Definition'i loomist luuakse automaatselt logigrupp CloudWatch'is. Vaikimisi sĂ€ilitatakse logid seal lĂ”pmatult; soovitan muuta Retention period'i 'Never Expire' pealt soovitud ajavahemikule. Seda tehakse CloudWatch Log groups'is, tuleb klĂ”psata praegusel perioodil ja valida uus.

Skalieritava API loomine AWS-i spot-instantides

ECS klastri ja ECS mahutuse pakkuja

Liigume jaotisse ECS → Clusters, et luua klaster. Mallina valime EC2 Linux + Networking.

Klastri nimi — vĂ€ga oluline, anname siin sama nime nagu Launch Template'i parameetris ECS_CLUSTER, meie juhul — DemoApiClusterProd. MĂ€rkige Create an empty cluster. Valikuline on lubada Container Insights, et nĂ€ha teenuste metrikaid CloudWatch'is. Kui olete kĂ”ik Ă”igesti teinud, nĂ€ete jaotises ECS Instances masinaid, mis loodi Auto Scaling gruppi.

Skalieritava API loomine AWS-i spot-instantides

Liigume vahekaardile Mahutuse pakkujad ja loome uue. Meenutan, et see on vajalik masinate loomise ja vĂ€ljalĂŒlitamise haldamiseks sĂ”ltuvalt töötavate ECS ĂŒlesannete arvust. Oluline on mĂ€rkida, et pakkuja saab olla seotud ainult ĂŒhe grupiga.

Auto Scaling grupp — valime varem loodud grupi.

Hallitav skaleerimine — lubame, et pakkuja saaks teenust skaleerida.

Sihtkapasiteet % — kui suur on autode koormuse protsent, mida vajame ĂŒlesannete jaoks. Kui mÀÀrata 100%, siis on kĂ”ik autod alati töötavate ĂŒlesannete poolt hĂ”ivatud. Kui mÀÀrata 50%, siis on pool autoreid alati vabad. Sellisel juhul, kui koormus jĂ€rsult suureneb, saavad uued ĂŒlesanded kohe vaba autot kasutada, ilma et oleks vaja oodata instantside kĂ€ivitamist.

Haldatud lĂ”petamisprotection — lĂŒlitame sisse, see parameeter lubab teenusepakkujal kaitsta instantside kustutamist. See juhtub, kui masinal ei ole aktiivseid ĂŒlesandeid ja see vĂ”imaldab Target capacity %.

ECS teenus ja skaleerimise seadistamine

Viimane samm:) Et luua teenus, peame minema varem loodud klastrisse vahekaardile Teenused.

KĂ€ivitamise tĂŒĂŒp — tuleb klĂ”psata valikul Switch to capacity provider strategy ja valida varem loodud pakkuja.

Skalieritava API loomine AWS-i spot-instantides

Ülesande mÀÀratlemine — valime varem loodud Ülesande mÀÀratluse ja selle versiooni.

Teenuse nimi — et mitte eksida, mÀÀrame selle alati samaks, mis Ülesande mÀÀratlemine.

Teenuse tĂŒĂŒp — alati Replica.

Ülesannete arv — soovitud aktiivsete ĂŒlesannete arv teenuses. Seda parameetrit hallatakse skaleerimise abil, kuid seda tuleb ikkagi mÀÀrata.

Minimaalne tervislik protsent ja Maksimaalne protsent — mÀÀravad ĂŒlesannete kĂ€itumise juurutamise ajal. Vaikimisi vÀÀrtused on 100 ja 200, mis nĂ€itavad, et juurutamise ajal suureneb ĂŒlesannete arv mitu korda, seejĂ€rel naaseb see soovitud tasemele. Kui teil töötab 1 ĂŒlesanne, min=0, ja max=100, siis juurutamise ajal see tapetakse, ja pĂ€rast seda tĂ”useb uus, see tĂ€hendab, et toimub seiskamine. Kui töötab 1 ĂŒlesanne, min=50, max=150, siis juurutamine ei toimu, sest 1 ĂŒlesannet ei saa jagada pooleks vĂ”i suurendada 1.5 korda.

Juurutamise tĂŒĂŒp — jĂ€tame Rolling update.

Paigutuse mallid — reeglid ĂŒlesannete paigutamiseks masinatesse. Vaikimisi on AZ Balanced Spread — see tĂ€hendab, et iga uus ĂŒlesanne paigutatakse uude instantsi, kuni masinad tĂ”usevad kĂ”igis kĂ€ttesaadavuse tsoonides. Me tavaliselt teeme BinPack — CPU ja Spread — AZ, sellise poliitikaga paigutatakse ĂŒlesanded maksimaalselt tihedalt ĂŒhe masina jĂ€rgi CPU. Uue masina vajadusel luuakse see uude kĂ€ttesaadavuse tsooni.

Skalieritava API loomine AWS-i spot-instantides

Koormuse tasakaalustaja tĂŒĂŒp — valime Application Load Balancer.

Teenuse IAM roll — valime ecsServiceRole.

Koormuse tasakaalustaja nimi — valime varem loodud tasakaalustaja.

Tervisekontrolli ootamisperiood — paus enne uute ĂŒlesannete töötamise kontrollide sooritamist, mÀÀrame tavaliselt 60 sekundit.

Konteiner, mida tasakaalustada — valige 'Target group name' jaoks varem loodud rĂŒhm ja kĂ”ik tĂ€itub automaatselt.

Skalieritava API loomine AWS-i spot-instantides

Teenuse automaatne skaleerimine — teenuse skaleerimise parameetrid. Valige 'Configure Service Auto Scaling to adjust your service’s desired count'. MÀÀrake minimaalne ja maksimaalne tööde arv skaleerimise ajal.

IAM-rolle teenuse automaatseks skaleerimiseks — valime AWSServiceRoleForApplicationAutoScaling_ECSService.

Automaatne tööde skaleerimise poliitika — skaleerimise reeglid. On 2 tĂŒĂŒpi:

  1. Sihtimise jĂ€lgimine — sihtmĂ€rkide mÔÔdikute jĂ€lgimine (CPU/RAM-i kasutamine vĂ”i pĂ€ringute arv tööde kohta). NĂ€iteks, kui soovime, et protsessori keskmine koormus oleks 85%, siis kui see tĂ”useb, lisatakse uusi töid seni, kuni see jĂ”uab sihttaseme juurde. Kui koormus on madalam, siis tööd eemaldatakse, vĂ€lja arvatud juhul, kui on lubatud skaleerimise allapoole kaitse (Keela skaleerimine).
  2. Samm-sammuline skaleerimine — reageerimine igasugusele sĂŒndmusele. Siit saab seadistada reaktsiooni mis tahes sĂŒndmusele (CloudWatch Alarm), kui see aset leiab, saab lisada vĂ”i eemaldada mÀÀratud arvu töid vĂ”i mÀÀrata tĂ€pselt vajalike tööde arvu.

Teenusel vĂ”ivad olla mitu skaleerimise reeglit, see vĂ”ib olla kasulik, peamine on jĂ€lgida, et need ĂŒksteisega ei konfliktiks.

KokkuvÔte

Kui jÀrgite juhiseid ja kasutate sama Docker'i pilti, peaks teie teenus tagastama sellise lehe.

Skalieritava API loomine AWS-i spot-instantides

  1. Oleme loonud ƥablooni, mille alusel kÀivitatakse kÔik teenuse masinad. Oleme ka Ôppinud masinaid uuendama, kui ƥabloon muutub.
  2. Olemegi seadnud ĂŒles spot-instantse peatamissignaali töötlemise, seega ĂŒhe minuti jooksul pĂ€rast selle saamist eemaldatakse kĂ”ik töötavad tööd masinast, nii et midagi ei kao ega katkeda.
  3. Oleme seadnud ĂŒles koormuse tasakaalustaja, et jaotada koormus masinate vahel ĂŒhtlaselt.
  4. Oleme loonud teenuse, mis töötab spot-instantidel, mille tÔttu vÀhenevad masina kulud umbes 3 korda.
  5. Oleme seadnud ĂŒles automaatse skaleerimise kahes suunas, et töödelda koormuste suurenemist, kuid samas mitte maksta seismise eest.
  6. Kasutame Capacity Provideri, et rakendus hallaks infrastruktuuri (masinad), mitte vastupidi.
  7. Me oleme toredad.

Kui teil on ettearvatavad koormuspiigid, nÀiteks reklaamite suurt e-kirjade jagamist, saate seadistada skaleerimise vastavalt ajakavale.

Samuti on vĂ”imalik teha skaleerimist, tuginedes erinevate osade andmetele teie sĂŒsteemis. NĂ€iteks on meil funktsionaalsus iseseisvate reklaampakkumiste saatmiseks mobiilirakenduse kasutajatele. MĂ”nikord saadetakse kampaania rohkem kui 1M inimesele. PĂ€rast sellist saadet on alati mĂ€rgata suurt kasvu API-pĂ€ringutes, kuna paljud kasutajad logivad rakendusse samal ajal sisse. Nii et kui me nĂ€eme, et reklaampushide saatmiseks on jĂ€rjekorras oluliselt rohkem, kui tavaliselt, saame koheselt kĂ€ivitada mitu tĂ€iendavat masinat ja ĂŒlesannet, et valmis olla koormuseks.

Oleks tore, kui jagaksite kommentaarides huvitavaid nÀiteid spottinstantside ja ECS kasutamisest vÔi midagi skaleerimise kohta.

Varsti tulevad artiklid selle kohta, kuidas me tĂ”husalt töötleme tuhandeid analĂŒĂŒtilisi sĂŒndmusi sekundis peamiselt serverless arhitektuuril (rahaga) ja kuidas teenuste juurutamine toimub GitLab CI ja Terraform Cloud abil.

Liituge meiega, see on huvitav!

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, palun.

Kas kasutate spottinstantsse tootmises?

  • 22,2%Jah6

  • 66,7%Ei18

  • 11,1%Kuulsin neist artiklist, plaanin neid kasutada3

HÀÀletas 27 kasutajat. VÀltis 5 kasutajat.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster