Мо дар Yandex.Cloud 10 000 ҳодисаро қабул мекунем. Қисми 1

Салом ба ҳама, дӯстон!

* Ин мақола ба семинари кушоди REBRAIN & Yandex.Cloud асос ёфтааст, агар шумо мехоҳед видеоро тамошо кунед, шумо метавонед онро дар ин пайванд пайдо кунед - https://youtu.be/cZLezUm0ekE

Мо ба наздикӣ имкон доштем, ки Yandex.Cloud-ро мустақиман санҷем. Азбаски мо мехостем, ки тӯлонӣ ва сахт тафтиш кунем, мо фавран аз идеяи оғоз кардани блоги оддии Wordpress бо пойгоҳи абрӣ даст кашем - ин хеле дилгиркунанда буд. Пас аз каме фикр кардан, мо тасмим гирифтем, ки чизе монанд ба меъмории хидматрасонии истеҳсолиро барои қабул ва таҳлили рӯйдодҳо дар реҷаи вақти воқеӣ ҷойгир кунем.

Ман комилан итминон дорам, ки аксарияти мутлақи тиҷорати онлайн (ва на танҳо) як навъ маълумотро дар бораи корбарон ва амалҳои онҳо ҷамъ мекунанд. Ҳадди ақал, ин барои қабули қарорҳои муайян зарур аст - масалан, агар шумо як бозии онлайнро идора кунед, шумо метавонед ба омор нигаред, ки корбарон аксар вақт дар кадом сатҳ мемонанд ва бозичаатонро нест мекунанд. Ё чаро корбарон сайти шуморо бе харидани чизе тарк мекунанд (салом, Yandex.Metrica).

Ҳамин тавр, ҳикояи мо: чӣ гуна мо дар голанг барнома навиштем, kafka против rabbitmq против yqs-ро санҷидем, ҷараёни маълумотро дар кластери Clickhouse навиштем ва маълумотро бо истифода аз yandex datalens визуалӣ кардем. Табиист, ки ҳамаи ин бо лаззатҳои инфрасохторӣ дар шакли docker, terraform, gitlab ci ва, албатта, прометей буд. Рафтем!

Ман мехоҳам фавран қайд кунам, ки мо ҳама чизро дар як нишаст танзим карда наметавонем - барои ин ба мо якчанд мақолаҳои силсила лозиманд. Каме дар бораи сохтор:

Қисми 1 (шумо онро хонда истодаед). Мо дар бораи мушаххасот ва меъмории ҳалли қарор қарор хоҳем дод ва инчунин дар голанг ариза нависед.
Қисми 2. Мо замимаи худро ба истеҳсолот мебарорем, онро миқёспазир месозем ва сарбориро месанҷем.
Қисми 3. Биёед кӯшиш кунем фаҳмем, ки чаро мо бояд паёмҳоро дар буфер нигоҳ дорем, на дар файлҳо ва инчунин хидмати навбатии kafka, rabbitmq ва yandex-ро муқоиса кунем.
Қисми 4 Мо кластери Clickhouse ҷойгир мекунем, хидмати ҷараёнро барои интиқоли маълумот аз буфер ба он ҷо менависем ва визуализатсияро дар datalens насб мекунем.
Қисми 5 Биёед тамоми инфрасохторро ба шакли дуруст биёрем - бо истифода аз gitlab ci ci/cd насб кунем, мониторинг ва кашфи хидматро бо истифода аз prometheus ва консул пайваст кунем.

ТЗ

Аввалан, биёед шартҳои техникиро тартиб диҳем - дар натиҷа мо маҳз он чизеро ба даст овардан мехоҳем.

  1. Мо мехоҳем як нуқтаи ниҳоӣ ба монанди events.kis.im дошта бошем (kis.im домени санҷишӣ аст, ки мо дар тамоми мақолаҳо истифода хоҳем кард), ки бояд рӯйдодҳоро бо истифодаи HTTPS қабул кунад.
  2. Ҳодисаҳо як json оддӣ мебошанд, ба монанди: {“event”: “view”, “os”: “linux”, “browser”: “chrome”}. Дар марҳилаи ниҳоӣ мо каме бештар майдонҳоро илова мекунем, аммо ин нақши калон нахоҳад дошт. Агар хоҳед, шумо метавонед ба protobuf гузаред.
  3. Хидмат бояд қодир ба коркарди 10 ҳодиса дар як сония бошад.
  4. Он бояд ба таври уфуқӣ тавассути илова кардани мисолҳои нав ба ҳалли мо имконпазир бошад. Ва хуб мешавад, агар мо қисмати пеширо ба ҷуғрофии гуногун интиқол диҳем, то таъхири дархостҳои муштариро кам кунем.
  5. Таҳаммулпазирии хатогиҳо. Маҳлул бояд ба қадри кофӣ устувор бошад ва қодир ба афтидани ҳама қисмҳо наҷот ёбад (албатта, то шумораи муайян).

меъморӣ

Умуман, барои ин намуди вазифаҳо, меъмориҳои классикӣ кайҳо боз ихтироъ шудаанд, ки миқёси муассирро имкон медиҳанд. Дар расм мисоли ҳалли мо нишон дода шудааст.

Мо дар Yandex.Cloud 10 000 ҳодисаро қабул мекунем. Қисми 1

Пас он чизе ки мо дорем:

1. Дар тарафи чап дастгоҳҳои мо ҳастанд, ки рӯйдодҳои гуногунро ба вуҷуд меоранд, хоҳ бозигароне, ки сатҳро дар бозича дар смартфон ба анҷом мерасонанд ё дар мағозаи онлайн тавассути браузери муқаррарӣ фармоиш медиҳанд. Ҳодиса, тавре ки дар мушаххасот нишон дода шудааст, як json оддӣ аст, ки ба нуқтаи ниҳоии мо фиристода мешавад - events.kis.im.

2. Ду сервери аввал тавозуни оддӣ мебошанд, вазифаҳои асосии онҳо инҳоянд:

  • Ҳамеша дастрас бошед. Барои ин, шумо метавонед, масалан, keepalived-ро истифода баред, ки дар сурати мушкилот IP-и виртуалиро байни гиреҳҳо иваз мекунад.
  • TLS-ро қатъ кунед. Бале, мо TLS-ро дар онҳо қатъ мекунем. Якум, то ки ҳалли мо ба мушаххасоти техникӣ мувофиқат кунад ва дуюм, барои сабук кардани бори барқарор кардани пайвасти рамзшуда аз серверҳои пуштибонии мо.
  • Тавозуни дархостҳои воридотӣ ба серверҳои паси дастрас. Калимаи калидӣ дар ин ҷо дастрас аст. Дар асоси ин, мо ба фаҳмиш меоем, ки мувозинатҳои сарборӣ бояд тавонанд серверҳои моро бо барномаҳо назорат кунанд ва мувозинати трафикро ба гиреҳҳои ноком қатъ кунанд.

3. Пас аз мувозинат, мо серверҳои барномавӣ дорем, ки як барномаи хеле соддаро иҷро мекунанд. Он бояд қодир бошад, ки дархостҳои воридшударо тавассути HTTP қабул кунад, json-и фиристодашударо тасдиқ кунад ва маълумотро ба буфер гузорад.

4. Дар диаграмма кафка ҳамчун буфер нишон дода шудааст, гарчанде албатта дар ин сатҳ дигар хидматҳои шабеҳро метавон истифода бурд. Мо дар мақолаи сеюм Кафка, rabbitmq ва yqs-ро муқоиса мекунем.

5. Нуқтаи охирини меъмории мо Clickhouse - пойгоҳи сутунӣ мебошад, ки ба шумо имкон медиҳад миқдори зиёди маълумотро нигоҳ доред ва коркард кунед. Дар ин сатҳ, мо бояд маълумотро аз буфер ба худи системаи нигаҳдорӣ интиқол диҳем (бештар дар ин бора дар мақолаи 4).

Ин тарҳ ба мо имкон медиҳад, ки ҳар як қабатро мустақилона ба таври уфуқӣ васеъ кунем. Серверҳои пуштибонӣ аз ӯҳдаи худ баромада наметавонанд - биёед як чизи дигарро илова кунем - дар ниҳоят, онҳо барномаҳои бидуни шаҳрвандӣ мебошанд ва аз ин рӯ, ин корро ҳатто ба таври худкор анҷом додан мумкин аст. Буфери услуби Кафка кор намекунад - биёед серверҳои бештар илова кунем ва баъзе қисмҳои мавзӯи моро ба онҳо интиқол диҳем. Clickhouse ин корро карда наметавонад - ин ғайриимкон аст :) Дар асл, мо инчунин серверҳоро пайваст мекунем ва маълумотро тақсим мекунем.

Дар омади гап, агар шумо хоҳед, ки қисми ихтиёрии мушаххасоти техникии мо ва миқёсро дар ҷуғрофии гуногун татбиқ кунед, пас ҳеҷ чизи соддатаре нест:

Мо дар Yandex.Cloud 10 000 ҳодисаро қабул мекунем. Қисми 1

Дар ҳар як геолокатсия мо мувозинати сарборро бо барнома ва кафка ҷойгир мекунем. Умуман, 2 сервери барномавӣ, 3 гиреҳи кафка ва баланси абрӣ, масалан, cloudflare, кифоя аст, ки мавҷудияти гиреҳҳои барномаҳо ва дархостҳои тавозунро аз рӯи геолокатсия дар асоси суроғаи IP манбаи муштарӣ тафтиш мекунанд. Ҳамин тариқ, маълумоте, ки муштарии амрикоӣ фиристодааст, ба серверҳои амрикоӣ меафтад. Ва маълумот аз Африқо дар Африқо аст.

Пас ҳама чиз хеле оддӣ аст - мо асбоби оинаро аз маҷмӯи Кафка истифода мебарем ва тамоми маълумотро аз ҳама ҷойҳо ба маркази марказии маълумотҳои мо, ки дар Русия ҷойгир аст, нусхабардорӣ мекунем. Дар дохили он, мо маълумотро таҳлил мекунем ва онро дар Clickhouse барои визуализатсияи минбаъда сабт мекунем.

Ҳамин тавр, мо меъмориро ҷудо кардем - биёед ба ларзиши Yandex.Cloud оғоз кунем!

Навиштани ариза

Пеш аз Абр, шумо бояд ба ҳар ҳол каме сабр кунед ва барои коркарди рӯйдодҳои воридотӣ як хидмати хеле содда нависед. Мо голангро истифода хоҳем кард, зеро он худро ҳамчун забон барои навиштани замимаҳои шабакавӣ хеле хуб исбот кардааст.

Пас аз сарф кардани як соат (шояд якчанд соат), мо чунин чизе мегирем: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Нуқтаҳои асосие, ки ман мехоҳам дар ин ҷо қайд кунам, кадомҳоянд:

1. Ҳангоми оғоз кардани барнома, шумо метавонед ду парчамро муайян кунед. Яке барои порте масъул аст, ки дар он мо дархостҳои http-и воридотӣ (-addr) -ро гӯш мекунем. Дуюм барои суроғаи сервери кафка аст, ки мо рӯйдодҳои худро сабт мекунем (-kafka):

addr     = flag.String("addr", ":8080", "TCP address to listen to")
kafka    = flag.String("kafka", "127.0.0.1:9092", "Kafka endpoints”)

2. Барнома китобхонаи sarama ([] github.com/Shopify/sarama) барои фиристодани паёмҳо ба кластери кафка. Мо фавран танзимотро муқаррар кардем, ки ба суръати максималии коркард нигаронида шудаанд:

config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true

3. Замимаи мо инчунин муштарии дарунсохташудаи prometheus дорад, ки ченакҳои гуногунро ҷамъ меорад, ба монанди:

  • шумораи дархостҳо ба аризаи мо;
  • шумораи хатогиҳо ҳангоми иҷрои дархост (имконнопазир хондани дархости почта, шикаста json, имконнопазирии навиштан ба Кафка);
  • вақти коркарди як дархости муштарӣ, аз ҷумла вақти навиштани паём ба Кафка.

4. Се нуқтаи ниҳоӣ, ки дархости мо коркард мекунад:

  • /status - танҳо баргардед, то нишон диҳад, ки мо зиндаем. Гарчанде ки шумо метавонед якчанд чекҳоро илова кунед, ба монанди мавҷудияти кластери Кафка.
  • /метрика - мувофиқи ин URL, муштарии prometheus ченакҳои ҷамъкардаашро бармегардонад.
  • /пост нуқтаи асосии ниҳоӣ мебошад, ки дар он дархостҳои POST бо json дар дохили он фиристода мешаванд. Замимаи мо дурустии json-ро месанҷад ва агар ҳама чиз хуб бошад, он маълумотро ба кластери Кафка менависад.

Ман қайд мекунам, ки код комил нест - он метавонад (ва бояд!) анҷом дода шавад. Масалан, шумо метавонед истифодаи net/http-и дарунсохтро қатъ кунед ва ба тезтар http гузаред. Ё шумо метавонед вақти коркард ва захираҳои CPU-ро тавассути интиқоли санҷиши дурустии json ба марҳилаи баъдӣ ба даст оред - вақте ки маълумот аз буфер ба кластери кликхона интиқол дода мешавад.

Илова ба паҳлӯи рушди масъала, мо фавран дар бораи инфрасохтори ояндаи худ фикр кардем ва тасмим гирифтем, ки замимаи худро тавассути docker ҷойгир кунем. Файли ниҳоии Dockerfile барои сохтани барнома ин аст https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Умуман, ин хеле содда аст, ягона нуктае, ки ман мехоҳам ба он диққат диҳам, ин монтажи бисёрзинагӣ мебошад, ки ба мо имкон медиҳад симои ниҳоии контейнерамонро кам кунем.

Қадамҳои аввалин дар абр

Пеш аз ҳама, ба қайд гиред cloud.yandex.ru. Пас аз пур кардани ҳамаи майдонҳои зарурӣ, ба мо ҳисоб эҷод карда мешавад ва ба маблағи муайян грант дода мешавад, ки онро барои санҷиши хидматҳои абрӣ истифода бурдан мумкин аст. Агар шумо хоҳед, ки ҳамаи қадамҳои мақолаи моро такрор кунед, ин грант бояд барои шумо кофӣ бошад.

Пас аз бақайдгирӣ, абри алоҳида ва директорияи пешфарз барои шумо эҷод карда мешавад, ки дар он шумо метавонед ба эҷоди захираҳои абрӣ шурӯъ кунед. Умуман, дар Yandex.Cloud, муносибати захираҳо чунин аст:

Мо дар Yandex.Cloud 10 000 ҳодисаро қабул мекунем. Қисми 1

Шумо метавонед якчанд абрҳоро барои як ҳисоб эҷод кунед. Ва дар дохили абр, барои лоиҳаҳои гуногуни ширкат феҳристҳои гуногун созед. Шумо метавонед бештар дар ин бора дар ҳуҷҷатҳо хонед - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Зимнан, ман дар матни зер ба он аксар вақт муроҷиат мекунам. Вақте ки ман тамоми инфрасохторро аз сифр таъсис додам, ҳуҷҷатҳо ба ман на як маротиба кӯмак карданд, бинобар ин ман ба шумо маслиҳат медиҳам, ки онро омӯзед.

Барои идоракунии абр, шумо метавонед ҳам интерфейси веб ва ҳам утилитаи консол - yc -ро истифода баред. Насбкунӣ бо як фармон анҷом дода мешавад (барои Linux ва Mac Os):

curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash

Агар мутахассиси амнияти дохилии шумо дар бораи иҷро кардани скриптҳо аз Интернет хашмгин бошад, пас, аввал, шумо метавонед скриптро кушоед ва онро хонед ва дуюм, мо онро зери корбари худ - бидуни ҳуқуқи реша иҷро мекунем.

Агар шумо хоҳед, ки муштариро барои Windows насб кунед, шумо метавонед дастурҳоро истифода баред дар ин ҷо ва сипас иҷро кунед yc initбарои пурра танзим кардани он:

vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.

Please enter OAuth token:
Please select cloud to use:
 [1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
 [2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
 [1] default (id = b1g5r6h11knotfr8vjp7)
 [2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
 [1] ru-central1-a
 [2] ru-central1-b
 [3] ru-central1-c
 [4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $

Аслан, раванд оддӣ аст - аввал шумо бояд аломати oauth-ро барои идоракунии абр гиред, абр ва ҷузвдони истифодашударо интихоб кунед.

Агар шумо дар як абр якчанд ҳисоб ё ҷузвдон дошта бошед, шумо метавонед профилҳои иловагиро бо танзимоти алоҳида тавассути профили конфигуратсияи yc эҷод кунед ва байни онҳо гузаред.

Илова ба усулҳои дар боло зикршуда, дастаи Yandex.Cloud хеле хуб навишт плагин барои terraform барои идоракунии захираҳои абрӣ. Дар навбати худ, ман як анбори git омода кардам, ки дар он ман тамоми захираҳоеро тавсиф кардам, ки ҳамчун як қисми мақола сохта мешаванд - https://github.com/rebrainme/yandex-cloud-events/. Мо ба филиали усто таваҷҷӯҳ дорем, биёед онро ба таври маҳаллӣ клон кунем:


vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/

Ҳама тағирёбандаҳои асосие, ки дар terraform истифода мешаванд, дар файли main.tf навишта мешаванд. Барои оғоз кардан, дар папкаи terraform файли private.auto.tfvars бо мундариҷаи зерин эҷод кунед:

# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""

Ҳама тағирёбандаҳоро аз рӯйхати танзимоти yc гирифтан мумкин аст, зеро мо аллакай утилитаи консолро танзим кардаем. Ман ба шумо маслиҳат медиҳам, ки фавран private.auto.tfvars-ро ба .gitignore илова кунед, то маълумоти шахсиро тасодуфан нашр накунед.

Дар private.auto.tfvars мо инчунин маълумотро аз Cloudflare муайян кардем - барои эҷод кардани сабтҳои DNS ва прокси домени асосии events.kis.im ба серверҳои мо. Агар шумо намехоҳед cloudflare-ро истифода баред, пас оғозкунии провайдери cloudflare-ро дар main.tf ва файли dns.tf, ки барои эҷоди сабтҳои зарурии dns масъул аст, хориҷ кунед.

Дар кори худ мо ҳар се усулро муттаҳид хоҳем кард - интерфейси веб, утилитаи консол ва терраформ.

Шабакаҳои виртуалӣ

Рости гап, шумо метавонед ин қадамро гузаред, зеро вақте ки шумо абри нав эҷод мекунед, шумо ба таври худкор шабакаи алоҳида ва 3 зершабакаи эҷодшуда хоҳед дошт - яке барои ҳар як минтақаи дастрас. Аммо мо ба ҳар ҳол мехоҳем, ки барои лоиҳаи худ як шабакаи алоҳида бо суроғаи худ созем. Диаграммаи умумии кори шабака дар Yandex.Cloud дар расми зер нишон дода шудааст (воқеан аз https://cloud.yandex.ru/docs/vpc/concepts/)

Мо дар Yandex.Cloud 10 000 ҳодисаро қабул мекунем. Қисми 1

Ҳамин тавр, шумо як шабакаи умумӣ эҷод мекунед, ки дар дохили он захираҳо бо ҳамдигар муошират карда метавонанд. Барои ҳар як минтақаи дастрас, зершабака бо суроғаи худ сохта мешавад ва ба шабакаи умумӣ пайваст мешавад. Дар натиҷа, ҳама захираҳои абрӣ дар он метавонанд муошират кунанд, ҳатто агар онҳо дар минтақаҳои гуногуни дастрас бошанд. Манбаъҳое, ки ба шабакаҳои абрии гуногун пайвастанд, метавонанд ҳамдигарро танҳо тавассути суроғаҳои беруна бубинанд. Воқеан, ин ҷодугарӣ дар дохили он чӣ гуна кор мекунад, дар Хабре хуб тавсиф карда шудааст.

Эҷоди шабака дар файли network.tf аз анбор тасвир шудааст. Дар он ҷо мо як шабакаи умумии хусусии дохилиро эҷод мекунем ва ба он се зершабақаро дар минтақаҳои гуногуни дастрас пайваст мекунем - дохилӣ-a (172.16.1.0/24), дохилӣ-b (172.16.2.0/24), дохилӣ-c (172.16.3.0/24). ).

Терраформро оғоз кунед ва шабакаҳоро эҷод кунед:

vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c

... skipped ...

Plan: 4 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Аҷоиб! Мо шабакаи худро таъсис додем ва ҳоло омодаем хидматҳои дохилии худро эҷод кунем.

Эҷоди мошинҳои виртуалӣ

Барои санҷидани барнома, ба мо лозим меояд, ки танҳо ду мошини виртуалӣ эҷод кунем - ба мо лозим аст, ки аввалин барномаро созад ва иҷро кунад, дуюмӣ барои иҷро кардани кафка, ки мо барои нигоҳ доштани паёмҳои воридотӣ истифода хоҳем кард. Ва мо мошини дигаре эҷод мекунем, ки дар он мо прометейро барои назорат кардани барнома танзим мекунем.

Мошинҳои виртуалӣ бо истифода аз ansible танзим карда мешаванд, аз ин рӯ пеш аз оғози terraform, боварӣ ҳосил кунед, ки шумо яке аз версияҳои охирини ansible доред. Ва нақшҳои заруриро бо галактикаи ansible насб кунед:

vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $

Дар дохили ҷузвдони ansible як файли конфигуратсияи .ansible.cfg мавҷуд аст, ки ман онро истифода мебарам. Он метавонад муфид бошад.

Пеш аз сохтани мошинҳои виртуалӣ, боварӣ ҳосил кунед, ки шумо ssh-agent кор карда истодаед ва калиди ssh илова карда шудааст, вагарна terraform ба мошинҳои сохташуда пайваст шуда наметавонад. Ман, албатта, бо хатогие дар os x дучор шудам: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Барои он ки ин такрор нашавад, пеш аз оғози Terraform ба env як тағирёбандаи хурд илова кунед:

vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

Дар папкаи terraform мо захираҳои заруриро эҷод мекунем:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

... skipped ...

Plan: 3 to add, 0 to change, 0 to destroy.

... skipped ...

Агар ҳама чиз бомуваффақият анҷом ёбад (ва он бояд бошад), мо се мошини виртуалӣ хоҳем дошт:

  1. сохтан - мошин барои озмоиш ва сохтани барнома. Docker аз ҷониби Ansible ба таври худкор насб карда шуд.
  2. мониторинг - мошини мониторинг - prometheus & grafana дар он насб карда шудааст. Стандарти воридшавӣ / парол: admin / admin
  3. кафка як мошини хурдест, ки кафка насб шудааст ва дар порти 9092 дастрас аст.

Биёед боварӣ ҳосил кунем, ки ҳамаи онҳо дар ҷои худ ҳастанд:

vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
|          ID          |    NAME    |    ZONE ID    | STATUS  |  EXTERNAL IP  | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka      | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build      | ru-central1-a | RUNNING | 84.201.132.3  | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+

Захираҳо ҷой доранд ва аз ин ҷо мо метавонем суроғаҳои IP-и онҳоро гирем. Дар тӯли он чизҳои зерин ман суроғаҳои IP-ро барои пайвастшавӣ тавассути ssh ва санҷиши барнома истифода хоҳам кард. Агар шумо ҳисоби cloudflare дошта бошед, ки ба terraform пайваст аст, озодона истифода бурдани номҳои навтаъсиси DNS-ро истифода баред.
Дар омади гап, ҳангоми сохтани мошини виртуалӣ, IP-и дохилӣ ва номи дохилии DNS дода мешавад, то шумо метавонед ба серверҳои дохили шабака бо ном дастрасӣ пайдо кунед:

ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms

Ин барои мо муфид хоҳад буд, ки ба барнома нуқтаи ниҳоиро бо kafk нишон диҳем.

Ҷамъоварии барнома

Аҷоиб, серверҳо ҳастанд, барнома вуҷуд дорад - танҳо ҷамъ кардани он ва нашр кардани он боқӣ мемонад. Барои сохтан мо сохти муқаррарии докерро истифода мебарем, аммо ҳамчун нигаҳдории тасвир мо хидмати Яндекс - реестри контейнериро истифода мебарем. Аммо чизҳои аввал.

Мо барномаро ба мошини сохта нусхабардорӣ мекунем, тавассути ssh ворид мешавем ва тасвирро ҷамъ мекунем:

vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ [email protected]:app/

... skipped ...

sent 3849 bytes  received 70 bytes  7838.00 bytes/sec
total size is 3644  speedup is 0.93

vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon  6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...

Successfully built 9760afd8ef65
Successfully tagged app:latest

Нисфи ҷанг анҷом ёфт - акнун мо метавонем кори барномаамонро тавассути оғоз ва фиристодани он ба кафка тафтиш кунем:

ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>

С локальной машинки можно отправить тестовый event и посмотреть на ответ:

<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41

{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $

Ариза бо муваффақияти сабт ҷавоб дод ва бо нишон додани id-и қисм ва офсет, ки дар он паём дохил карда шудааст. Танҳо чизе боқӣ мемонад, ки феҳристро дар Yandex.Cloud эҷод кунед ва тасвири моро дар он ҷо бор кунед (чӣ гуна ин корро бо истифода аз се сатр дар файли registry.tf тавсиф карда шудааст). Захира эҷод кунед:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events

... skipped ...

Plan: 1 to add, 0 to change, 0 to destroy.

... skipped ...

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Якчанд роҳҳо барои тасдиқи аутентификатсия дар реестри контейнер мавҷуданд - бо истифода аз аломати oauth, аломати iam ё калиди ҳисоби хидматӣ. Тафсилоти бештарро дар бораи ин усулҳо дар ҳуҷҷатҳо пайдо кардан мумкин аст. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Мо калиди ҳисоби хидматро истифода мебарем, аз ин рӯ ҳисоб эҷод мекунем:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher

... skipped ...

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Ҳоло танҳо сохтани калид барои он боқӣ мемонад:

vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048

Мо дар бораи ID-и нигаҳдории худ маълумот мегирем, калидро интиқол медиҳем ва ворид мешавем:

vozerov@mba:~/events/terraform (master) $ scp key.json [email protected]:
key.json                                                                                                                    100% 2392   215.1KB/s   00:00

vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu

ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
ubuntu@build:~$

Барои бор кардани тасвир ба реестр ба мо ID реестри контейнер лозим аст, мо онро аз утилитаи yc мегирем:

vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"

Пас аз он мо тасвири худро бо номи нав нишон медиҳем ва боргузорӣ мекунем:

ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946

Мо метавонем тасдиқ кунем, ки тасвир бомуваффақият бор карда шудааст:

vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
|          ID          |            NAME             |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+

Дар омади гап, агар шумо утилитаи yc-ро дар мошини Linux насб кунед, шумо метавонед фармонро истифода баред

yc container registry configure-docker

барои танзим кардани докер.

хулоса

Мо кори бисьёреро анчом додем ва дар натича:

  1. Мо меъмории хидмати ояндаи худро таҳия кардем.
  2. Мо ба забони голанг ариза навиштем, ки мантиқи тиҷорати моро амалӣ мекунад.
  3. Мо онро ҷамъ карда, ба реестри контейнерҳои хусусӣ рехтем.

Дар қисми навбатӣ, мо ба чизҳои ҷолиб мегузарем - мо замимаи худро ба истеҳсолот мебарорем ва дар ниҳоят бори онро ба кор меандозем. Гузар накунед!

Ин мавод дар сабти видеоии коргоҳи кушодаи REBRAIN & Yandex.Cloud мавҷуд аст: Мо дар як сония 10 000 дархостро дар Yandex Cloud қабул мекунем - https://youtu.be/cZLezUm0ekE

Агар шумо хоҳиши иштирок дар чунин чорабиниҳои онлайнӣ дошта бошед ва дар вақти воқеӣ савол диҳед, ба он пайваст шавед канали DevOps аз ҷониби REBRAIN.

Мо мехоҳем ба Yandex.Cloud барои имкони баргузории чунин чорабинӣ ташаккури махсус баён кунем. Истинод ба онҳо - https://cloud.yandex.ru/prices

Агар ба шумо лозим аст, ки ба абр гузаред ё дар бораи инфрасохтори худ савол дошта бошед, озодона дархост гузоред.

PS Мо дар як моҳ 2 аудити ройгон дорем, шояд лоиҳаи шумо яке аз онҳо бошад.

Манбаъ: will.com

Илова Эзоҳ