AWS Spot Instances da Scalable API yaratish

Hammaga salom! Mening ismim Kirill, men Adapty kompaniyasida texnik direktorman. Bizning arxitekturamizning aksariyati AWS-da va bugun men ishlab chiqarish muhitida spot misollardan foydalangan holda server xarajatlarini 3 baravar kamaytirganimiz, shuningdek, ularning avtomatik o'lchamini qanday sozlash haqida gapirib beraman. Avval u qanday ishlashi haqida umumiy ma'lumot, keyin esa boshlash uchun batafsil ko'rsatmalar bo'ladi.

Spot misollar nima?

Spot misollar hozirda ishlamaydigan boshqa AWS foydalanuvchilarining serverlari bo'lib, ularni katta chegirma bilan sotadilar (Amazon 90% gacha yozadi, bizning tajribamizga ko'ra ~3x, mintaqa, AZ va ​​misol turiga qarab farq qiladi). Ularning oddiylardan asosiy farqi shundaki, ular istalgan vaqtda o'chirilishi mumkin. Shu sababli, uzoq vaqt davomida biz ularni bokira muhitlar uchun yoki biror narsani hisoblash vazifalari uchun ishlatish odatiy hol deb hisoblardik, oraliq natijalar S3 da yoki ma'lumotlar bazasida saqlangan, lekin sotish uchun emas. Ishlab chiqarishda dog'lardan foydalanishga imkon beruvchi uchinchi tomon echimlari mavjud, ammo bizning ishimiz uchun ko'plab tayoqchalar mavjud, shuning uchun biz ularni amalga oshirmadik. Maqolada tasvirlangan yondashuv qo'shimcha skriptlar, tojlar va boshqalarsiz to'liq standart AWS funksionalligi doirasida ishlaydi.

Quyida spot misollar uchun narxlar tarixini ko'rsatadigan bir nechta skrinshotlar mavjud.

m5.eu-west-1 (Irlandiya) mintaqasida katta. Narx 3 oy davomida asosan barqaror bo‘lib, hozirda 2.9x tejaydi.

AWS Spot Instances da Scalable API yaratish

m5.katta AQSh-sharq-1 mintaqasida (N. Virjiniya). Narx 3 oy davomida doimiy ravishda o'zgarib turadi, hozirda mavjudlik zonasiga qarab 2.3x dan 2.8x gacha tejaladi.

AWS Spot Instances da Scalable API yaratish

t3.us-sharq-1 mintaqasida kichik (N. Virjiniya). Narx 3 oy davomida barqaror bo‘lib, hozirda 3.4 baravar tejaldi.

AWS Spot Instances da Scalable API yaratish

Xizmat arxitekturasi

Ushbu maqolada biz gaplashadigan xizmatning asosiy arxitekturasi quyidagi diagrammada ko'rsatilgan.

AWS Spot Instances da Scalable API yaratish

Ilova yuki balansi → EC2 maqsadli guruhi → elastik konteyner xizmati

Application Load Balancer (ALB) EC2 Target Group (TG) ga so'rovlarni yuboradigan muvozanatlashtiruvchi sifatida ishlatiladi. TG ALB uchun namunalardagi portlarni ochish va ularni Elastik konteyner xizmati (ECS) konteynerlari portlariga ulash uchun javobgardir. ECS bu Docker konteynerlarini boshqaradigan AWSdagi Kubernetesning analogidir.

Bitta nusxada bir xil portlarga ega bir nechta ishlaydigan konteynerlar bo'lishi mumkin, shuning uchun biz ularni aniq o'rnatolmaymiz. ECS TG ga yangi vazifani ishga tushirayotganini aytadi (Kubernetes terminologiyasida bu pod deb ataladi), u misoldagi bepul portlarni tekshiradi va ulardan birini ishga tushirilgan vazifaga tayinlaydi. TG shuningdek, namuna va API uning ustida ishlayotganligini sog'liq tekshiruvi yordamida muntazam tekshirib turadi va agar biror muammo aniqlansa, u yerga so'rov yuborishni to'xtatadi.

EC2 Avtomatik Scaling Groups + ECS Capacity Provayderlar

Yuqoridagi diagrammada EC2 Avtomatik Scaling Groups (ASG) xizmati ko'rsatilmagan. Nomidan siz misollarni masshtablash uchun javobgar ekanligini tushunishingiz mumkin. Biroq, yaqin vaqtgacha AWS ECS-dan ishlaydigan mashinalar sonini boshqarish uchun o'rnatilgan qobiliyatga ega emas edi. ECS vazifalar sonini, masalan, protsessordan foydalanish, operativ xotira yoki so'rovlar soni bo'yicha kengaytirish imkonini berdi. Ammo agar vazifalar barcha bo'sh nusxalarni egallagan bo'lsa, unda yangi mashinalar avtomatik ravishda yaratilmaydi.

Bu ECS Capacity Providers (ECS CP) paydo bo'lishi bilan o'zgardi. Endi ECSdagi har bir xizmat ASG bilan bog'lanishi mumkin va agar vazifalar ishlaydigan misollarga mos kelmasa, yangilari ko'tariladi (lekin belgilangan ASG chegaralarida). Bu ham teskari yo'nalishda ishlaydi, agar ECS CP vazifalarsiz bo'sh holatlarni ko'rsa, ularni o'chirish uchun ASG buyrug'ini beradi. ECS CP misol yukining maqsadli foizini belgilash qobiliyatiga ega, shuning uchun ma'lum miqdordagi mashinalar har doim vazifalarni tez o'lchash uchun bepul bo'ladi; Men bu haqda biroz keyinroq gaplashaman.

EC2 ishga tushirish shablonlari

Ushbu infratuzilmani yaratish haqida batafsil gapirishdan oldin gaplashadigan oxirgi xizmat EC2 Launch Templates. Bu har safar noldan takrorlanmaslik uchun barcha mashinalar ishga tushadigan shablonni yaratishga imkon beradi. Bu erda siz ishga tushirish uchun mashina turini, xavfsizlik guruhini, disk tasvirini va boshqa ko'plab parametrlarni tanlashingiz mumkin. Siz barcha ishga tushirilgan nusxalarga yuklanadigan foydalanuvchi ma'lumotlarini ham belgilashingiz mumkin. Siz foydalanuvchi ma'lumotlarida skriptlarni ishga tushirishingiz mumkin, masalan, fayl mazmunini tahrirlashingiz mumkin ECS agenti konfiguratsiyasi.

Ushbu maqola uchun eng muhim konfiguratsiya parametrlaridan biri ECS_ENABLE_SPOT_INSTANCE_DRAINING= rost. Agar ushbu parametr yoqilgan bo'lsa, ECS nuqta nusxasi olib tashlanishi haqida signal olishi bilanoq, u ustida ishlaydigan barcha vazifalarni Drenaj holatiga o'tkazadi. Bu misolga hech qanday yangi vazifa tayinlanmaydi; agar hozirda unga topshirilishi kerak boʻlgan vazifalar mavjud boʻlsa, ular bekor qilinadi. Balanslashtiruvchidan so'rovlar ham kelmay qoladi. Namunani o'chirish haqidagi xabar haqiqiy voqeadan 2 daqiqa oldin keladi. Shuning uchun, agar sizning xizmatingiz 2 daqiqadan ortiq vazifalarni bajarmasa va diskda hech narsa saqlamasa, siz ma'lumotlarni yo'qotmasdan spot misollardan foydalanishingiz mumkin.

Disk haqida - AWS yaqinda qilingan Elastik fayl tizimini (EFS) ECS bilan birgalikda ishlatish mumkin; bu sxema bilan hatto disk ham to'siq emas, lekin biz buni sinab ko'rmadik, chunki printsipial ravishda holatni saqlash uchun disk kerak emas. Odatiy bo'lib, SIGINT qabul qilingandan so'ng (topshiriq drenaj holatiga o'tkazilganda yuboriladi) barcha bajarilayotgan vazifalar, hatto ular hali tugallanmagan bo'lsa ham, 30 soniyadan so'ng to'xtatiladi; bu vaqtni parametr yordamida o'zgartirishingiz mumkin. ECS_CONTAINER_STOP_TIMEOUT. Asosiysi, uni spotli mashinalar uchun 2 daqiqadan ko'proq vaqtga o'rnatmaslikdir.

Xizmat yaratish

Keling, tavsiflangan xizmatni yaratishga o'tamiz. Jarayonda men yuqorida aytib o'tilmagan bir nechta foydali fikrlarni qo'shimcha ravishda tasvirlab beraman. Umuman olganda, bu bosqichma-bosqich ko'rsatma, lekin men juda oddiy yoki aksincha, juda aniq holatlarni ko'rib chiqmayman. Barcha harakatlar AWS vizual konsolida amalga oshiriladi, ammo ularni CloudFormation yoki Terraform yordamida dasturiy tarzda qayta ishlab chiqarish mumkin. Adapty-da biz Terraformdan foydalanamiz.

EC2 ishga tushirish shabloni

Ushbu xizmat foydalaniladigan mashinalar konfiguratsiyasini yaratadi. Shablonlar EC2 -> Instances -> Ishga tushirish shablonlari bo'limida boshqariladi.

Amazon mashinasi tasviri (AMI) — barcha nusxalar ishga tushiriladigan disk tasvirini belgilang. ECS uchun ko'p hollarda Amazon-dan optimallashtirilgan tasvirdan foydalanishga arziydi. U muntazam ravishda yangilanadi va ECS ishlashi uchun zarur bo'lgan hamma narsani o'z ichiga oladi. Joriy rasm identifikatorini bilish uchun sahifaga o'ting Amazon ECS-optimallashtirilgan AMI, foydalanayotgan mintaqani tanlang va uning uchun AMI identifikatoridan nusxa oling. Misol uchun, us-sharq-1 mintaqasi uchun, yozish paytidagi joriy identifikator ami-00c7c1cf5bdc913ed. Ushbu identifikatorni maxsus qiymatni belgilash elementiga kiritish kerak.

Namuna turi — misol turini ko'rsating. Vazifangizga eng mos keladiganini tanlang.

Kalitlar juftligi (kirish) — agar kerak bo'lsa, SSH orqali instansiyaga ulanishingiz mumkin bo'lgan sertifikatni belgilang.

Tarmoq sozlamalari — tarmoq parametrlarini belgilang. Tarmoq platformasi ko'p hollarda Virtual Private Cloud (VPC) bo'lishi kerak. Xavfsizlik guruhlari — misollaringiz uchun xavfsizlik guruhlari. Biz misollar oldida balanslashtiruvchidan foydalanamiz, men bu erda faqat balanslashtiruvchidan kiruvchi ulanishlarga ruxsat beruvchi guruhni ko'rsatishni tavsiya qilaman. Ya'ni, sizda 2 ta xavfsizlik guruhi bo'ladi, biri balanslashtiruvchi uchun, bu 80 (http) va 443 (https) portlarida istalgan joydan kirish ulanishlarini ta'minlaydi, ikkinchisi esa balanslash guruhining istalgan portlarida kiruvchi ulanishlarni ta'minlaydigan mashinalar uchun. . Ikkala guruhdagi chiquvchi ulanishlar TCP protokoli yordamida barcha manzillarning barcha portlariga ochilishi kerak. Chiquvchi ulanishlar uchun portlar va manzillarni cheklashingiz mumkin, ammo keyin siz yopiq portda biror narsaga kirishga harakat qilmayotganingizni doimiy ravishda kuzatib borishingiz kerak.

Saqlash (hajmlar) — mashinalar uchun disk parametrlarini belgilang. Disk hajmi AMIda ko'rsatilganidan kam bo'lishi mumkin emas; ECS Optimized uchun bu 30 GiB.

Kengaytirilgan tafsilotlar — qo'shimcha parametrlarni belgilang.

Sotib olish opsiyasi — biz spot misollarni sotib olishni xohlaymizmi. Biz xohlaymiz, lekin biz bu katakchani belgilamaymiz; biz uni Avtomatik Scaling guruhida sozlaymiz, u erda ko'proq imkoniyatlar mavjud.

IAM namunasi profili — misollar ishga tushiriladigan rolni ko'rsating. Misollar ECSda ishlashi uchun ular odatda rolda topiladigan ruxsatlarga muhtoj ecsInstanceRole. Ba'zi hollarda uni yaratish mumkin, agar bo'lmasa, bu erda ko'rsatmalar buni qanday qilish haqida. Yaratgandan so'ng, biz uni shablonda ko'rsatamiz.
Keyinchalik ko'plab parametrlar mavjud, asosan siz hamma joyda standart qiymatlarni qoldirishingiz mumkin, ammo ularning har biri aniq tavsifga ega. Men har doim EBS-optimallashtirilgan namunani va agar foydalanilsa, T2/T3 Unlimited opsiyalarini yoqaman portlash mumkin holatlar.

Foydalanuvchi ma'lumotlari — foydalanuvchi maʼlumotlarini koʻrsatish. Biz faylni tahrir qilamiz /etc/ecs/ecs.config, unda ECS agent konfiguratsiyasi mavjud.
Foydalanuvchi ma'lumotlari qanday ko'rinishi mumkinligiga misol:

#!/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 — parametr namunaning berilgan nomga ega klasterga tegishli ekanligini bildiradi, yaʼni bu klaster oʻz vazifalarini shu serverga joylashtirishi mumkin. Biz hali klaster yaratmadik, lekin uni yaratishda bu nomdan foydalanamiz.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true — parametr nuqta namunasini oʻchirish uchun signal qabul qilinganda undagi barcha vazifalarni Drenaj holatiga oʻtkazish kerakligini bildiradi.

ECS_CONTAINER_STOP_TIMEOUT=1m - parametr SIGINT signalini olgandan so'ng, barcha vazifalarni o'ldirishdan oldin 1 daqiqa borligini bildiradi.

ECS_ENGINE_AUTH_TYPE=docker — parametr avtorizatsiya mexanizmi sifatida Docker sxemasidan foydalanilganligini bildiradi

ECS_ENGINE_AUTH_DATA=... — Docker tasvirlaringiz saqlanadigan shaxsiy konteyner registriga ulanish parametrlari. Agar u ommaviy bo'lsa, unda siz hech narsani ko'rsatishingiz shart emas.

Ushbu maqolaning maqsadlari uchun men Docker Hub-dan umumiy rasmdan foydalanaman, shuning uchun parametrlarni belgilang ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA Kerakmas.

Bilish yaxshi: AMI ni muntazam yangilab turish tavsiya etiladi, chunki yangi versiyalar Docker, Linux, ECS agent va boshqalar versiyalarini yangilaydi. Buni unutmaslik uchun bildirishnomalarni sozlash yangi versiyalarning chiqarilishi haqida. Siz bildirishnomalarni elektron pochta orqali olishingiz va qo'lda yangilashingiz mumkin yoki yangilangan AMI bilan ishga tushirish shablonining yangi versiyasini avtomatik ravishda yaratadigan Lambda funksiyasini yozishingiz mumkin.

EC2 Avtomatik masshtablash guruhi

Auto Scaling Group misollarni ishga tushirish va masshtablash uchun javobgardir. Guruhlar EC2 -> Avtomatik masshtablash -> Avtomatik masshtablash guruhlari boʻlimida boshqariladi.

Shablonni ishga tushirish — oldingi bosqichda yaratilgan shablonni tanlang. Biz standart versiyani qoldiramiz.

Xarid qilish imkoniyatlari va namuna turlari — klaster uchun namunalar turlarini belgilang. Ishga tushirish shabloniga rioya qilish ishga tushirish shablonidagi namuna turidan foydalanadi. Xarid opsiyalari va namuna turlarini birlashtirish sizga namuna turlarini moslashuvchan tarzda sozlash imkonini beradi. Biz undan foydalanamiz.

Ixtiyoriy talab asosida — har doim ishlaydigan muntazam, dog'siz misollar soni.

Talab bo'yicha foiz bazadan yuqori — oddiy va spot instansiyalarning foiz nisbati, 50-50 teng taqsimlanadi, har bir oddiy misol uchun 20-80 4 ta nuqta ko'tariladi. Ushbu misol uchun men 50-50 ni ko'rsataman, lekin aslida biz ko'pincha 20-80, ba'zi hollarda 0-100 ni qilamiz.

Namuna turlari — bu yerda siz klasterda qo'llaniladigan misollarning qo'shimcha turlarini belgilashingiz mumkin. Biz uni hech qachon ishlatmadik, chunki men hikoyaning ma'nosini tushunmayapman. Ehtimol, bu muayyan turdagi misollardagi cheklovlar bilan bog'liq, ammo ularni qo'llab-quvvatlash orqali osongina oshirish mumkin. Agar siz ilovani bilsangiz, uni sharhlarda o'qishdan xursand bo'laman)

AWS Spot Instances da Scalable API yaratish

tarmoq — tarmoq sozlamalari, VPC va mashinalar uchun pastki tarmoqlarni tanlang, ko'p hollarda barcha mavjud pastki tarmoqlarni tanlashingiz kerak.

Yuklarni muvozanatlash - balanschi sozlamalari, lekin biz buni alohida qilamiz, bu erda hech narsaga tegmaymiz. Salomatlik tekshiruvlari keyin ham sozlanadi.

Guruh hajmi — biz klasterdagi mashinalar sonining chegaralarini va boshida kerakli mashinalar sonini ko'rsatamiz. Klasterdagi mashinalar soni hech qachon ko'rsatilgan minimaldan kam va maksimaldan ko'p bo'lmaydi, hatto ko'rsatkichlar bo'yicha masshtablash amalga oshirilishi kerak.

Masshtablash siyosati — masshtablash parametrlari, lekin biz bajarilayotgan ECS vazifalari asosida masshtablashtiramiz, shuning uchun masshtabni keyinroq sozlaymiz.

Namuna miqyosidagi himoya — masshtabni kichraytirishda misollarni oʻchirishdan himoya qilish. ASG ishlaydigan vazifalari bo'lgan mashinani o'chirmasligi uchun uni yoqamiz. ECS Capacity Provider vazifalari bo'lmagan holatlar uchun himoyani o'chirib qo'yadi.

Teg qo'shing — misollar uchun teglarni belgilashingiz mumkin (buning uchun yangi nusxalarni belgilash katakchasi belgilanishi kerak). Men Nom tegini belgilashni tavsiya qilaman, keyin guruh ichida ishga tushirilgan barcha misollar bir xil nomga ega bo'ladi va ularni konsolda ko'rish qulay.

AWS Spot Instances da Scalable API yaratish

Guruhni yaratgandan so'ng, uni oching va "Kengaytirilgan konfiguratsiyalar" bo'limiga o'ting.Nega barcha variantlar yaratish bosqichida konsolda ko'rinmaydi.

Tugatish qoidalari — misollarni oʻchirishda hisobga olinadigan qoidalar. Ular tartibda qo'llaniladi. Biz odatda quyidagi rasmdagilardan foydalanamiz. Birinchidan, eng eski ishga tushirish shabloniga ega bo'lgan nusxalar o'chiriladi (masalan, agar biz AMI-ni yangilagan bo'lsak, biz yangi versiya yaratdik, ammo barcha nusxalar unga o'tishga muvaffaq bo'ldi). Keyin keyingi hisob-kitob soatiga eng yaqin bo'lgan misollar tanlanadi. Va keyin eng qadimgilari ishga tushirish sanasiga qarab tanlanadi.

AWS Spot Instances da Scalable API yaratish

Bilish yaxshi: foydalanish uchun qulay klasterdagi barcha mashinalarni yangilash Namunani yangilash. Agar siz buni oldingi bosqichdagi Lambda funksiyasi bilan birlashtirsangiz, sizda to'liq avtomatlashtirilgan namunani yangilash tizimi bo'ladi. Barcha mashinalarni yangilashdan oldin, siz guruhdagi barcha nusxalar uchun namuna o'lchamidan himoya qilishni o'chirib qo'yishingiz kerak. Guruhdagi konfiguratsiya emas, balki mashinalarning o'zidan himoya qilish, bu "Instance management" yorlig'ida amalga oshiriladi.

Application Load Balancer va EC2 Target Group

Balanslashtiruvchi EC2 → Yukni muvozanatlash → Yukni muvozanatlash bo'limida yaratilgan. Biz Application Load Balancer-dan foydalanamiz; har xil turdagi balanslashtirgichlarni taqqoslashni quyidagi havolada o'qishingiz mumkin xizmat sahifasi.

Tinglovchilar - 80 va 443 portlarni yaratish va keyinroq balanslash qoidalaridan foydalangan holda 80 dan 443 gacha yo'naltirish mantiqiy.

Mavjud zonalar — aksariyat hollarda biz hamma uchun qulaylik zonalarini tanlaymiz.

Xavfsizlik sozlamalarini sozlang — bu yerda balanslashtiruvchi uchun SSL sertifikati ko'rsatilgan, eng qulay variant sertifikat qilish ACMda. Farqlar haqida Xavfsizlik siyosati ichida o'qilishi mumkin hujjatlar, siz uni sukut bo'yicha tanlagan holda qoldirishingiz mumkin ELBSecurityPolicy-2016-08. Balanslashtiruvchini yaratgandan so'ng, siz uni ko'rasiz DNS nomi, bu sizning domeningiz uchun CNAME-ni sozlashingiz kerak. Masalan, Cloudflare-da u shunday ko'rinadi.

AWS Spot Instances da Scalable API yaratish

Xavfsizlik guruhi — muvozanatlashtiruvchi uchun xavfsizlik guruhini yarating yoki tanlang, men bu haqda yuqorida EC2 ishga tushirish shablonini → Tarmoq sozlamalari bo'limida ko'proq yozganman.

Nishon guruh — biz balanslashtiruvchidan so'rovlarni mashinalarga yo'naltirish va muammolar yuzaga kelganda ularni almashtirish uchun ularning mavjudligini tekshirish uchun mas'ul bo'lgan guruh yaratamiz. Maqsad turi misol bo'lishi kerak, Protokol и port har qanday, agar siz muvozanatlashtiruvchi va misollar o'rtasidagi aloqa uchun HTTPS dan foydalansangiz, ularga sertifikat yuklashingiz kerak. Ushbu misol maqsadlari uchun biz buni qilmaymiz, shunchaki 80-portni qoldiramiz.

Salomatlik tekshiruvlari — xizmatning funksionalligini tekshirish parametrlari. Haqiqiy xizmatda bu biznes mantig'ining muhim qismlarini amalga oshiradigan alohida so'rov bo'lishi kerak, bu misol uchun men standart sozlamalarni qoldiraman. Keyinchalik, so'rovlar oralig'i, vaqt tugashi, muvaffaqiyat kodlari va boshqalarni tanlashingiz mumkin. Bizning misolimizda biz 200-399 muvaffaqiyat kodlarini ko'rsatamiz, chunki foydalaniladigan Docker tasviri 304 kodini qaytaradi.

AWS Spot Instances da Scalable API yaratish

Maqsadlarni ro'yxatdan o'tkazish — bu yerda guruh uchun mashinalar tanlanadi, ammo bizning holatlarimizda bu ECS tomonidan amalga oshiriladi, shuning uchun biz bu bosqichni o'tkazib yuboramiz.

Bilish yaxshi: balanslash darajasida siz S3 da ma'lum bir vaqtda saqlanadigan jurnallarni yoqishingiz mumkin format. U yerdan ularni tahlil qilish uchun uchinchi tomon xizmatlariga eksport qilish mumkin yoki siz to'g'ridan-to'g'ri S3 ma'lumotlariga SQL so'rovlarini amalga oshirishingiz mumkin. Afina yordamida. Bu qulay va qo'shimcha kodsiz ishlaydi. Bundan tashqari, belgilangan vaqtdan keyin S3 paqiridan jurnallarni olib tashlashni sozlashni tavsiya etaman.

ECS vazifasi ta'rifi

Oldingi bosqichlarda biz xizmat ko'rsatish infratuzilmasi bilan bog'liq hamma narsani yaratdik, endi biz ishga tushiradigan konteynerlarni tavsiflashga o'tamiz. Bu ECS → Task Definitions bo'limida amalga oshiriladi.

Ishga tushirish turining mosligi - EC2 ni tanlang.

Vazifani bajarish IAM roli - tanlash ecsTaskExecutionRole. Undan foydalanib, jurnallar yoziladi, maxfiy o'zgaruvchilarga kirish huquqi beriladi va hokazo.

Konteyner ta'riflari bo'limida Konteyner qo'shish-ni bosing.

surat — loyiha kodi bilan rasmga havola; bu misol uchun men Docker Hub’dan umumiy rasmdan foydalanaman bitnami/tugun-misol: 0.0.1.

Xotira chegaralari — konteyner uchun xotira chegaralari. Qattiq chegara — qattiq chegara, agar konteyner belgilangan qiymatdan oshib ketsa, docker kill buyrug'i bajariladi, konteyner darhol o'ladi. Yumshoq chegara — yumshoq chegara, konteyner belgilangan qiymatdan oshib ketishi mumkin, ammo bu parametr mashinalarga vazifalarni joylashtirishda hisobga olinadi. Misol uchun, agar mashinada 4 GiB operativ xotira bo'lsa va konteynerning yumshoq chegarasi 2048 MiB bo'lsa, bu mashinada ushbu konteyner bilan maksimal 2 ta ishlaydigan vazifa bo'lishi mumkin. Aslida, 4 GiB operativ xotira 4096 Mb dan biroz kamroq, buni klasterdagi ECS Instances yorlig'ida ko'rish mumkin. Yumshoq chegara qattiq chegaradan katta bo'lishi mumkin emas. Shuni tushunish kerakki, agar bitta vazifada bir nechta konteyner bo'lsa, unda ularning chegaralari umumlashtiriladi.

Port xaritalari - In Xost porti Biz 0 ni ko'rsatamiz, bu port dinamik ravishda tayinlanishi va maqsadli guruh tomonidan nazorat qilinishini anglatadi. Konteyner porti — ilovangiz ishlaydigan port ko'pincha bajarish buyrug'ida ko'rsatiladi yoki dastur kodida, Dockerfile va hokazolarda tayinlanadi. Bizning misolimiz uchun biz 3000 dan foydalanamiz, chunki u ro'yxatga kiritilgan Docker fayli foydalanilayotgan tasvir.

Salomatlik tekshiruvi - konteyner sog'lig'ini tekshirish parametrlari, maqsadli guruhda sozlangan bilan adashtirmaslik kerak.

Atrof-muhit - atrof-muhit sozlamalari. CPU birliklari - Xotira chegaralariga o'xshash, faqat protsessor haqida. Har bir protsessor yadrosi 1024 birlik, shuning uchun agar serverda ikki yadroli protsessor bo'lsa va konteyner 512 ga o'rnatilgan bo'lsa, u holda bitta serverda ushbu konteyner bilan 4 ta vazifa ishga tushirilishi mumkin. CPU birliklari har doim yadrolar soniga to'g'ri keladi; xotirada bo'lgani kabi, ulardan bir oz kamroq bo'lishi mumkin emas.

buyruq — konteyner ichida xizmatni ishga tushirish buyrug'i, barcha parametrlar vergul bilan ajratilgan holda ko'rsatilgan. Bu gunicorn, npm va boshqalar bo'lishi mumkin. Agar ko'rsatilmagan bo'lsa, Dockerfile'dan CMD direktivasi qiymati ishlatiladi. bildiramiz npm,start.

Atrof-muhit o'zgaruvchilari — konteyner muhiti o‘zgaruvchilari. Bu oddiy matn ma'lumotlari yoki maxfiy o'zgaruvchilar bo'lishi mumkin Sirlar menejeri yoki Parametrlar do'koni.

Saqlash va ro'yxatga olish — bu yerda biz CloudWatch Logs (AWS jurnallari uchun xizmat) tizimiga kirishni o‘rnatamiz. Buni amalga oshirish uchun CloudWatch jurnallarini avtomatik sozlash katagiga belgi qo'ying. Vazifa ta'rifini yaratgandan so'ng, CloudWatch-da avtomatik ravishda jurnallar guruhi yaratiladi. Odatiy bo'lib, jurnallar unda cheksiz saqlanadi; Men Saqlash muddatini "Hech qachon tugamaydi" dan kerakli muddatga o'zgartirishni tavsiya qilaman. Bu CloudWatch Log guruhlarida amalga oshiriladi, siz joriy davrni bosishingiz va yangisini tanlashingiz kerak.

AWS Spot Instances da Scalable API yaratish

ECS Cluster va ECS Capacity Provider

Klaster yaratish uchun ECS → Klasterlar bo'limiga o'ting. Biz shablon sifatida EC2 Linux + Networking ni tanlaymiz.

Klaster nomi - juda muhim, biz bu erda shablonni ishga tushirish parametrida ko'rsatilgan nomni qilamiz ECS_CLUSTER, bizning holatlarimizda - DemoApiClusterProd. Bo'sh klaster yaratish katagiga belgi qo'ying. Majburiy emas, CloudWatch’dagi xizmatlar ko‘rsatkichlarini ko‘rish uchun Container Insights’ni yoqishingiz mumkin. Agar siz hamma narsani to'g'ri bajargan bo'lsangiz, ECS Instances bo'limida siz Auto Scaling guruhida yaratilgan mashinalarni ko'rasiz.

AWS Spot Instances da Scalable API yaratish

Tabga o'ting Imkoniyatlar provayderlari va yangisini yarating. Sizga shuni eslatib o'tamanki, ishlaydigan ECS vazifalari soniga qarab mashinalarni yaratish va o'chirishni boshqarish kerak. Shuni ta'kidlash kerakki, provayder faqat bitta guruhga tayinlanishi mumkin.

Avtomatik masshtablash guruhi — avval yaratilgan guruhni tanlang.

Boshqariladigan masshtablash — provayder xizmat ko'lamini kengaytirishi uchun uni yoqing.

Maqsadli sig'im % — bizga vazifalar yuklangan mashinalarning necha foizi kerak. Agar siz 100% ni belgilasangiz, unda barcha mashinalar har doim ishlaydigan vazifalar bilan band bo'ladi. Agar siz 50% ni belgilasangiz, unda avtomobillarning yarmi har doim bepul bo'ladi. Bunday holda, yukning keskin sakrashi bo'lsa, yangi taksilar instantsiyalarning joylashishini kutmasdan, darhol bepul avtomobillarga etib boradi.

Boshqariladigan tugatish himoyasi — yoqish, bu parametr provayderga nusxalarni oʻchirishdan himoya qilishni olib tashlash imkonini beradi. Bu mashinada faol vazifalar bo'lmaganda sodir bo'ladi va Maqsadli sig'im% ga ruxsat beradi.

ECS xizmati va masshtabni sozlash

Oxirgi qadam :) Xizmatni yaratish uchun Xizmatlar yorlig'ida avval yaratilgan klasterga o'tishingiz kerak.

Ishga tushirish turi — Imkoniyatlar provayderi strategiyasiga o‘tish tugmasini bosishingiz va avval yaratilgan provayderlarni tanlashingiz kerak.

AWS Spot Instances da Scalable API yaratish

Vazifa ta'rifi — avval yaratilgan Task Definition va uning tahririni tanlang.

Xizmat nomi — chalkashmaslik uchun biz har doim Task Definition bilan bir xil narsani ko'rsatamiz.

Xizmat turi - har doim Replika.

Vazifalar soni — xizmatdagi faol vazifalarning kerakli soni. Ushbu parametr masshtablash orqali boshqariladi, ammo baribir ko'rsatilishi kerak.

Minimal sog'lom foiz и Maksimal foiz — joylashtirish vaqtida vazifalarning harakatini aniqlash. Standart qiymatlar 100 va 200 ni tashkil qiladi, bu ularni joylashtirish vaqtida vazifalar soni bir necha marta ko'payishini va keyin kerakli qiymatga qaytishini ko'rsatadi. Agar sizda 1 ta vazifa bajarilsa, min=0 va max=100, u holda joylashtirish paytida u o'chiriladi va shundan keyin yangisi ko'tariladi, ya'ni ishlamay qoladi. Agar 1 ta vazifa bajarilayotgan bo'lsa, min=50, max=150, u holda joylashtirish umuman bo'lmaydi, chunki 1 ta vazifani yarmiga bo'lish yoki bir yarim barobarga oshirish mumkin emas.

Joylashtirish turi — Rolling yangilanishini qoldiring.

Joylashtirish shablonlari — vazifalarni mashinalarga joylashtirish qoidalari. Sukut boʻyicha AZ Balanced Spread – bu har bir yangi vazifa barcha mavjudlik zonalaridagi mashinalar koʻtarilmaguncha yangi namunaga joylashtirilishini anglatadi. Biz odatda BinPack - CPU va Spread - AZ ni bajaramiz; bu siyosat bilan vazifalar har bir protsessorga bitta mashinada iloji boricha zichroq joylashtiriladi. Agar yangi mashina yaratish zarur bo'lsa, u yangi mavjudlik zonasida yaratiladi.

AWS Spot Instances da Scalable API yaratish

Yuk balansi turi — Application Load Balancer-ni tanlang.

Xizmat IAM roli - tanlash ecsServiceRole.

Yuklash balansi nomi — avval yaratilgan balanserni tanlang.

Salomatlikni tekshirish uchun imtiyozli davr — yangi vazifani ishga tushirgandan so'ng sog'lig'ingizni tekshirishdan oldin pauza qiling, biz odatda uni 60 soniyaga o'rnatamiz.

Balansni yuklash uchun konteyner — Maqsadli guruh nomi bandida avval yaratilgan guruhni tanlang, shunda hammasi avtomatik ravishda to‘ldiriladi.

AWS Spot Instances da Scalable API yaratish

Avtomatik masshtablash xizmati — xizmat ko'rsatishni o'lchash parametrlari. Xizmatingizning kerakli sonini rostlash uchun Xizmatni avtomatik masshtablashni sozlash-ni tanlang. Masshtablashda biz minimal va maksimal vazifalar sonini belgilaymiz.

Avtomatik xizmat ko'rsatish uchun IAM roli - tanlash AWSServiceRoleForApplicationAutoScaling_ECSService.

Avtomatik vazifalarni masshtablash siyosati — masshtablash qoidalari. 2 turi mavjud:

  1. Maqsadni kuzatish — maqsadli koʻrsatkichlarni kuzatish (CPU/RAMdan foydalanish yoki har bir vazifa uchun soʻrovlar soni). Misol uchun, biz protsessor yukining o'rtacha 85% bo'lishini xohlaymiz, u yuqoriroq bo'lganda, maqsadli qiymatga yetguncha yangi vazifalar qo'shiladi. Agar yuk kamroq bo'lsa, vazifalar o'chiriladi, aksincha, kichraytirishdan himoya yoqilmasa (O'lchovni o'chirib qo'ying).
  2. Bosqichli masshtablash - ixtiyoriy hodisaga munosabat. Bu yerda siz har qanday hodisaga munosabatni sozlashingiz mumkin (CloudWatch Alarm), u sodir bo'lganda, belgilangan miqdordagi vazifalarni qo'shishingiz yoki olib tashlashingiz yoki aniq vazifalar sonini belgilashingiz mumkin.

Xizmat bir nechta masshtablash qoidalariga ega bo'lishi mumkin, bu foydali bo'lishi mumkin, asosiysi ularning bir-biriga zid kelmasligini ta'minlashdir.

xulosa

Agar siz ko'rsatmalarga amal qilgan bo'lsangiz va xuddi shu Docker tasviridan foydalansangiz, xizmatingiz shunga o'xshash sahifani qaytarishi kerak.

AWS Spot Instances da Scalable API yaratish

  1. Biz shablonni yaratdik, unga ko'ra xizmatdagi barcha mashinalar ishga tushiriladi. Shablon o'zgarganda mashinalarni qanday yangilashni ham o'rgandik.
  2. Biz spot misolni to'xtatish signalini qayta ishlashni sozladik, shuning uchun uni qabul qilgandan so'ng bir daqiqa ichida barcha ishlaydigan vazifalar mashinadan o'chiriladi, shuning uchun hech narsa yo'qolmaydi yoki to'xtatilmaydi.
  3. Yukni mashinalar bo'ylab teng ravishda taqsimlash uchun balansni ko'tardik.
  4. Biz spot misollarda ishlaydigan xizmatni yaratdik, bu mashina xarajatlarini taxminan 3 barobar kamaytiradi.
  5. Biz to‘xtab qolish xarajatlarisiz ortib borayotgan ish yuklarini boshqarish uchun har ikki yo‘nalishda ham avtomatik o‘lchovni sozladik.
  6. Biz Capacity Provider-dan dastur infratuzilmani (mashinalarni) boshqarishi uchun foydalanamiz, aksincha emas.
  7. Biz ajoyibmiz.

Agar sizda yuklanishda bashorat qilinadigan o'sishlar bo'lsa, masalan, siz katta elektron pochta kampaniyasida reklama qilayotgan bo'lsangiz, masshtabni o'rnatishingiz mumkin: jadval.

Bundan tashqari, tizimingizning turli qismlaridan olingan ma'lumotlarga asoslanib o'lchovni o'lchashingiz mumkin. Masalan, bizda funksionallik mavjud individual reklama takliflarini yuborish mobil ilova foydalanuvchilari. Ba'zan kampaniya 1M+ kishiga yuboriladi. Bunday tarqatishdan so'ng, API-ga so'rovlar har doim katta o'sishda bo'ladi, chunki ko'plab foydalanuvchilar bir vaqtning o'zida dasturga kirishadi. Shunday qilib, agar reklama push-bildirishnomalarini yuborish uchun navbatdagi standart ko'rsatkichlar sezilarli darajada ko'proq ekanligini ko'rsak, biz darhol yuklashga tayyor bo'lish uchun bir nechta qo'shimcha mashinalar va vazifalarni ishga tushirishimiz mumkin.

Izohlarda spot misollar va ECS dan foydalanishning qiziqarli holatlari yoki masshtablash haqida biror narsa aytsangiz xursand bo'laman.

Tez orada biz sekundiga minglab analitik hodisalarni asosan serversiz stekda (pul bilan) qanday qayta ishlashimiz va GitLab CI va Terraform Cloud yordamida xizmatlarni joylashtirish qanday ishlashi haqida maqolalar bo'ladi.

Bizga obuna bo'ling, bu qiziqarli bo'ladi!

So'rovda faqat ro'yxatdan o'tgan foydalanuvchilar ishtirok etishlari mumkin. tizimga kirishiltimos.

Ishlab chiqarishda spot misollardan foydalanasizmi?

  • 22,2%Ha 6

  • 66,7%№18

  • 11,1%Men ular haqida maqoladan bilib oldim va ulardan foydalanishni rejalashtirdim3

27 foydalanuvchi ovoz berdi. 5 nafar foydalanuvchi betaraf qolgan.

Manba: www.habr.com

a Izoh qo'shish