Біз Yandex.Cloud жүйесінде 10 000 оқиғаны қабылдаймыз. 1 бөлім

Барлығына сәлем, достар!

* Бұл мақала REBRAIN & Yandex.Cloud ашық семинарына негізделген, егер сіз бейнені көргіңіз келсе, оны мына сілтемеден таба аласыз - https://youtu.be/cZLezUm0ekE

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

Мен онлайн (тек қана емес) бизнестің басым көпшілігі қандай да бір жолмен өз пайдаланушылары мен олардың әрекеттері туралы көптеген ақпарат жинайтынына толық сенімдімін. Кем дегенде, бұл белгілі бір шешімдер қабылдау үшін қажет - мысалы, егер сіз онлайн ойынды басқарсаңыз, пайдаланушылардың қай деңгейде жиі тұрып қалуы және ойыншығыңыздың жойылуы туралы статистиканы қарауға болады. Немесе пайдаланушылар неге сіздің сайтыңызды ештеңе сатып алмай тастайды (сәлеметсіз бе, Yandex.Metrica).

Сонымен, біздің тарихымыз: біз голанг тілінде қосымшаны қалай жаздық, kafka vs rabbitmq және yqs сынадық, Clickhouse кластерінде деректер ағынын жазды және yandex datalens көмегімен деректерді визуализациялады. Әрине, мұның бәрі докер, terraform, gitlab ci және, әрине, прометей түріндегі инфрақұрылымдық ләззаттармен толықтырылды. Барайық!

Мен бірден ескерткім келеді, біз бір отырыста бәрін конфигурациялай алмаймыз - бұл үшін сериядағы бірнеше мақалалар қажет болады. Құрылым туралы аздап:

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

ТЗ

Алдымен техникалық тапсырманы тұжырымдап алайық - нәтижесінде біз нақты нені алғымыз келеді.

  1. Біз оқиғалар.kis.im (kis.im — біз барлық мақалаларда қолданатын сынақ домені) сияқты соңғы нүктеге ие болғымыз келеді, ол оқиғаларды HTTPS арқылы қабылдайды.
  2. Оқиғалар қарапайым json болып табылады, мысалы: {“event”: “view”, “os”: “linux”, “browser”: “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-бапта).

Бұл дизайн әр қабатты көлденеңінен тәуелсіз масштабтауға мүмкіндік береді. Бейне серверлері төтеп бере алмайды - тағы бір нәрсені қосайық - олар азаматтығы жоқ қолданбалар, сондықтан оны автоматты түрде жасауға болады. Кафка стиліндегі буфер жұмыс істемейді - көбірек серверлерді қосып, оларға тақырыбымыздың кейбір бөлімдерін тасымалдайық. Clickhouse оны жеңе алмайды - бұл мүмкін емес :) Шын мәнінде, біз серверлерді қосамыз және деректерді бөлеміз.

Айтпақшы, егер сіз біздің техникалық сипаттамаларымыздың қосымша бөлігін және әртүрлі геолокацияларда масштабты енгізгіңіз келсе, онда қарапайым ештеңе жоқ:

Біз Yandex.Cloud жүйесінде 10 000 оқиғаны қабылдаймыз. 1 бөлім

Әрбір геолокацияда біз қолданбасы мен кафкасы бар жүктеме балансын орналастырамыз. Тұтастай алғанда, клиенттің бастапқы IP мекенжайы негізінде геолокация бойынша қолданба түйіндерінің және теңгерім сұрауларының қолжетімділігін тексеретін 2 қолданба сервері, 3 кафка түйіні және бұлтты теңдестіргіш, мысалы, cloudflare жеткілікті. Осылайша, американдық клиент жіберген деректер американдық серверлерге түседі. Ал Африкадан алынған деректер африкалық тілінде.

Содан кейін бәрі өте қарапайым - біз Кафка жинағындағы айна құралын қолданамыз және барлық деректерді Ресейде орналасқан орталық деректер орталығына көшіреміз. Ішкі түрде біз деректерді талдап, кейінгі визуализация үшін Clickhouse жүйесінде жазамыз.

Сонымен, біз архитектураны сұрыптадық - Yandex.Cloud-ты шайқауды бастайық!

Өтініш жазу

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

Бір сағаттан кейін (мүмкін бірнеше сағат) біз келесідей нәрсені аламыз: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Мен мұнда қандай негізгі ойларды атап өткім келеді:

1. Қолданбаны іске қосқан кезде екі жалаушаны көрсетуге болады. Біреуі біз кіріс http сұрауларын (-addr) тыңдайтын портқа жауапты. Екіншісі kafka серверінің мекенжайына арналған, онда біз оқиғаларымызды жазамыз (-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) хабарларды kafka кластеріне жіберу үшін. Біз бірден максималды өңдеу жылдамдығына бағытталған параметрлерді орнаттық:

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 ресурстарын алуға болады.

Мәселенің даму жағына қоса, біз бірден болашақ инфрақұрылымымыз туралы ойладық және қолданбамызды докер арқылы орналастыруды шештік. Қолданбаны құруға арналған соңғы 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/

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

Біздің жұмысымызда біз барлық үш әдісті біріктіреміз - веб-интерфейс, консоль утилитасы және терраформ.

Виртуалды желілер

Шынымды айтсам, бұл қадамды өткізіп жіберуге болады, өйткені жаңа бұлтты жасаған кезде сізде автоматты түрде бөлек желі және әрбір қолжетімділік аймағы үшін бір-бірден жасалған 3 ішкі желі болады. Бірақ біз әлі де өз жобамыз үшін жеке адрестеумен бөлек желі жасағымыз келеді. Яндекс.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.

Тамаша! Біз желіні құрдық және енді ішкі қызметтерімізді жасауға дайынбыз.

Виртуалды машиналарды құру

Қолданбаны сынау үшін бізге тек екі виртуалды машина жасау керек болады - бізге біріншісі қолданбаны құрастыру және іске қосу үшін қажет, екіншісі - кіріс хабарламаларды сақтау үшін пайдаланылатын kafka іске қосу. Біз қосымшаны бақылау үшін прометейді конфигурациялайтын басқа машина жасаймыз.

Виртуалды машиналар ansible көмегімен конфигурацияланады, сондықтан terraform қолданбасын бастамас бұрын, сізде ansible соңғы нұсқаларының бірі бар екеніне көз жеткізіңіз. Қажетті рөлдерді ansible galaxy арқылы орнатыңыз:

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. Логин / пароль стандарты: admin / admin
  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 мекенжайларын қолданамын. Терраформға қосылған 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) $

Қолданба жазбаның сәтті аяқталуымен және хабарлама енгізілген бөлімнің және офсеттің идентификаторын көрсете отырып жауап берді. Яндекс.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 тегін аудит бар, мүмкін сіздің жобаңыз солардың бірі болуы мүмкін.

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

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