Биз Yandex.Cloud'та 10 000 окуяны кабыл алабыз. 1-бөлүк

Баарыңарга салам, достор!

* Бул макала REBRAIN & Yandex.Cloud ачык семинарына негизделген, эгер сиз видеону көргүңүз келсе, аны бул шилтемеден таба аласыз - https://youtu.be/cZLezUm0ekE

Биз жакында Yandex.Cloud түз сынап көрүү мүмкүнчүлүгүнө ээ болдук. Биз узак жана катуу изилдегибиз келгендиктен, булут базасы менен жөнөкөй Wordpress блогун ачуу идеясын дароо таштап койдук - бул өтө кызыксыз эле. Бир аз ойлонуп көргөндөн кийин, биз реалдуу убакыт режиминде окуяларды кабыл алуу жана талдоо үчүн өндүрүш кызматынын архитектурасына окшош нерсени колдонууну чечтик.

Мен онлайн (жана гана эмес) бизнестин басымдуу көпчүлүгү кандайдыр бир жол менен алардын колдонуучулары жана алардын иш-аракеттери жөнүндө маалыматтарды чогултууларына толук ишенем. Жок дегенде, бул белгилүү бир чечимдерди кабыл алуу үчүн зарыл - мисалы, эгер сиз онлайн оюнду башкарсаңыз, колдонуучулар кайсы деңгээлде көп тыгылып калган статистиканы карап, оюнчугуңузду өчүрө аласыз. Же эмне үчүн колдонуучулар эч нерсе сатып албай эле сиздин сайттан чыгып кетишет (салам, Yandex.Metrica).

Ошентип, биздин окуя: биз голанг тилинде тиркемени кантип жаздык, kafka vs rabbitmq vs yqs сынап көрдүк, Clickhouse кластеринде маалымат агымын жаздык жана yandex datalens аркылуу маалыматтарды визуализацияладык. Албетте, мунун баары докер, терраформ, гитлаб ci жана, албетте, прометей түрүндөгү инфраструктуралык ырахаттарга ээ болгон. Кеттик!

Мен дароо эскертип койгум келет, биз бир отурушта бардыгын конфигурациялай албайбыз - бул үчүн бизге бир катар макалалар керек болот. структурасы жөнүндө бир аз:

1-бөлүк (сиз аны окуп жатасыз). Биз чечимдин өзгөчөлүктөрүн жана архитектурасын чечебиз, ошондой эле голанг тилинде арыз жазабыз.
2 бөлүк. Биз тиркемени өндүрүшкө чыгарабыз, аны масштабдуу кылып, жүктү сынап жатабыз.
3-бөлүк. Келгиле, эмне үчүн билдирүүлөрдү файлдарда эмес, буферде сактоо керек экенин түшүнүүгө аракет кылалы, ошондой эле kafka, rabbitmq жана yandex кезек кызматын салыштырып көрөлү.
4-бөлүк Биз Clickhouse кластерин орнотобуз, ал жердеги буферден маалыматтарды өткөрүү үчүн агымдык кызматты жазабыз жана datalens визуализациясын орнотобуз.
5-бөлүк Келгиле, бүт инфраструктураны туура формага келтирели - gitlab ci аркылуу ci/cd орнотобуз, прометей менен консулдун жардамы менен мониторинг жана сервистин ачылышын туташтырабыз.

TK

Биринчиден, техникалык тапшырманы түзөлү - натыйжада биз так эмнени алгыбыз келет.

  1. Биз окуялар.kis.im сыяктуу акыркы чекитке ээ болгубуз келет (kis.im - биз бардык макалаларда колдоно турган сыноо домени), ал окуяларды HTTPS аркылуу кабыл алышы керек.
  2. Окуялар жөнөкөй json сыяктуу: {“окуя”: “көрүү”, “os”: “linux”, “браузер”: “chrome”}. Акыркы этапта биз дагы бир аз талааларды кошобуз, бирок бул чоң роль ойнобойт. Кааласаңыз, протобуфка өтсөңүз болот.
  3. Кызмат секундасына 10 000 окуяны иштете алышы керек.
  4. Чечимибизге жаңы инстанцияларды кошуу менен горизонталдуу масштабга мүмкүн болушу керек. Кардардын суроо-талаптары үчүн күтүү убактысын азайтуу үчүн алдыңкы бөлүгүн ар кандай геолокацияларга жылдыра алсак жакшы болот.
  5. Ката толеранттуулук. Чечим жетиштүү туруктуу болушу керек жана кандайдыр бир бөлүктөрдүн кулашына (албетте, белгилүү бир санга чейин) туруштук бере алат.

архитектура

Жалпысынан алганда, тапшырманын бул түрү үчүн, натыйжалуу масштабдаштырууга мүмкүндүк берет классикалык архитектура көптөн бери ойлоп табылган. Сүрөттө биздин чечимибиздин мисалы көрсөтүлгөн.

Биз Yandex.Cloud'та 10 000 окуяны кабыл алабыз. 1-бөлүк

Ошентип, бизде эмне бар:

1. Сол жакта смартфондогу оюнчуктун деңгээлин аяктаган оюнчулар же кадимки браузер аркылуу интернет-дүкөндө буйрутма түзгөн оюнчулар болобу, ар кандай окуяларды жаратуучу биздин түзмөктөр. Окуя, спецификацияда көрсөтүлгөндөй, биздин акыркы чекитибизге жөнөтүлгөн жөнөкөй json - events.kis.im.

2. Биринчи эки сервер жөнөкөй баланстоочу болуп саналат, алардын негизги милдеттери:

  • Дайыма жеткиликтүү болуңуз. Бул үчүн, мисалы, көйгөйлөр болгон учурда виртуалдык IPди түйүндөрдүн ортосунда алмаштыра турган keepalived колдоно аласыз.
  • TLS токтотуу. Ооба, биз алар боюнча TLSти токтотобуз. Биринчиден, биздин чечим техникалык мүнөздөмөлөргө ылайык келиши үчүн, экинчиден, биздин серверлерден шифрленген байланышты орнотуу жүгүн жеңилдетүү үчүн.
  • Жеткиликтүү серверлерге кирүүчү суроо-талаптарды баланстаңыз. Бул жерде негизги сөз жеткиликтүү. Ушунун негизинде, биз жүк баланстоочулар биздин серверлерибизди тиркемелер менен көзөмөлдөй алышы керек жана ката түйүндөрүнө трафиктин тең салмактуулугун токтотушу керек деген түшүнүккө келдик.

3. Балансерлерден кийин бизде өтө жөнөкөй тиркемени иштеткен тиркеме серверлери бар. Ал HTTP аркылуу кирүүчү суроо-талаптарды кабыл алып, жөнөтүлгөн jsonду текшерип, маалыматтарды буферге кое алышы керек.

4. Диаграмма буфер катары кафканы көрсөтөт, бирок, албетте, ушул деңгээлде башка ушул сыяктуу кызматтарды колдонсо болот. Үчүнчү макалада Кафканы, rabbitmq жана yqsды салыштырабыз.

5. Биздин архитектурабыздын акыркы чекити Clickhouse - чоң көлөмдөгү маалыматтарды сактоого жана иштетүүгө мүмкүндүк берген мамычалык маалымат базасы. Бул деңгээлде биз буферден маалыматтарды сактоо тутумунун өзүнө өткөрүп беришибиз керек (бул тууралуу кененирээк 4-беренеде).

Бул дизайн ар бир катмарды горизонталдуу түрдө өз алдынча масштабдоо мүмкүнчүлүгүн берет. Backend серверлери туруштук бере албайт - келгиле дагы бир нерсени кошолу - баары бир, алар жарандыгы жок тиркемелер, ошондуктан, бул автоматтык түрдө жасалышы мүмкүн. Кафка стилиндеги буфер иштебейт — келгиле, көбүрөөк серверлерди кошуп, темабыздын айрым бөлүктөрүн аларга өткөрүп берели. 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. Биздин тиркемеде прометейдин орнотулган кардары бар, ал ар кандай көрсөткүчтөрдү чогултат, мисалы:

  • биздин арызга суроо-талаптардын саны;
  • суроо-талапты аткаруудагы каталардын саны (посттун өтүнүчүн окуу мүмкүн эмес, бузулган json, Кафкага жазуу мүмкүн эмес);
  • Кардардын бир өтүнүчүн иштетүү убактысы, анын ичинде Кафкага билдирүү жазуу убактысы.

4. Колдонмобуз иштеткен үч акыркы чекит:

  • /статус - тирүү экенибизди көрсөтүү үчүн жөн гана OK кайтарыңыз. Кафка кластеринин болушу сыяктуу кээ бир текшерүүлөрдү кошо аласыз.
  • /метрика - бул url боюнча, prometheus кардары чогулткан метрикасын кайтарып берет.
  • /post - ичиндеги json менен POST сурамдары жөнөтүлө турган негизги акыркы чекит. Биздин тиркеме json жарактуулугун текшерет жана баары жакшы болсо, ал маалыматтарды Кафка кластерине жазат.

Мен код кемчиликсиз эмес деп эскертем - ал бүтүшү мүмкүн (жана керек!). Мисалы, сиз орнотулган net/http колдонууну токтотуп, тезирээк http'ге өтсөңүз болот. Же сиз json жарактуулугун текшерүүнү кийинки этапка жылдыруу менен процесстик убакытты жана CPU ресурстарын ала аласыз - маалыматтар буферден Clickhouse кластерине өткөрүлүп берилгенде.

Маселенин өнүгүү жагына кошумча, биз дароо эле келечектеги инфраструктурабыз жөнүндө ойлонуп, биздин тиркемени докер аркылуу жайылтууну чечтик. Тиркемени куруу үчүн акыркы 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 үчүн плагин булут ресурстарын башкаруу үчүн. Мен өз кезегинде гит репозиторийин даярдадым, анда мен макаланын бир бөлүгү катары түзүлө турган бардык ресурстарды сүрөттөп бердим - 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/

Терраформада колдонулган бардык негизги өзгөрмөлөр 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 сайтында биз DNS жазууларын түзүү жана негизги окуялар.kis.im доменин серверлерибизге прокси үчүн Cloudflare маалыматтарын көрсөттүк. Эгер сиз cloudflare колдонгуңуз келбесе, анда main.tf ичиндеги cloudflare провайдеринин инициализациясын жана керектүү dns жазууларын түзүүгө жооптуу dns.tf файлын алып салыңыз.

Биздин ишибизде биз үч ыкманы тең бириктиребиз - веб-интерфейс, консолдук программа жана терраформ.

Виртуалдык тармактар

Чынын айтсам, бул кадамды өткөрүп жиберсеңиз болот, анткени сиз жаңы булутту түзгөндө, сизде автоматтык түрдө өзүнчө тармак жана 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-агент иштеп жатканын жана 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 ага орнотулган. Логин / сырсөз стандарты: администратор / администратор
  3. kafka - 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 даректерин ала алабыз. Андан ары мен ssh аркылуу туташуу жана тиркемени сыноо үчүн IP даректерди колдоном. Эгер сизде terraform менен байланышкан cloudflare аккаунтуңуз болсо, жаңы түзүлгөн 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) $

Тиркеме жазууну ийгиликтүү аткарып, билдирүү камтылган бөлүмдүн жана офсеттин идентификаторун көрсөтүү менен жооп берди. Болгону 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

Биз сактагычыбыздын идентификатору жөнүндө маалымат алабыз, ачкычты өткөрүп беребиз жана киребиз:

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:~$

Сүрөттү реестрге жүктөө үчүн бизге контейнер реестринин идентификатору керек, биз аны 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 суроону кабыл алабыз - https://youtu.be/cZLezUm0ekE

Эгер сиз онлайн режиминде ушундай иш-чараларга катышууга жана реалдуу убакыт режиминде суроо берүүгө кызыкдар болсоңуз, байланышыңыз REBRAIN каналынын DevOps.

Мындай иш-чараны өткөрүү мүмкүнчүлүгү үчүн Yandex.Cloud компаниясына өзгөчө ыраазычылык билдиргибиз келет. Аларга шилтеме - https://cloud.yandex.ru/prices

Булутка өтүшүңүз керек болсо же инфраструктураңыз тууралуу суроолоруңуз болсо, Сураныч тапшыруудан тартынбаңыз.

PS Бизде айына 2 акысыз аудит бар, балким сиздин долбооруңуз алардын бири болушу мүмкүн.

Source: www.habr.com

Комментарий кошуу