موږ په Yandex.Cloud کې 10 پیښې منو. برخه 000

سلام ټولو دوستانو!

* دا مقاله د REBRAIN او Yandex.Cloud خلاص ورکشاپ پراساس ده ، که تاسو غواړئ ویډیو وګورئ ، تاسو یې په دې لینک کې موندلی شئ - https://youtu.be/cZLezUm0ekE

موږ پدې وروستیو کې د Yandex.Cloud ژوندی هڅه کولو فرصت درلود. له هغه ځایه چې موږ غوښتل اوږد او سخت تحقیق وکړو، موږ سمدلاسه د بادل بیس سره د ساده Wordpress بلاګ پیل کولو نظر پریښود - دا خورا ستړی و. د یو څه فکر کولو وروسته ، موږ پریکړه وکړه چې د نږدې ریښتیني وخت حالت کې د پیښو ترلاسه کولو او تحلیل کولو لپاره د تولید خدماتو جوړښت ته ورته یو څه ځای په ځای کړو.

زه په بشپړ ډول ډاډه یم چې ډیری آنلاین (او نه یوازې) سوداګرۍ په یو ډول د خپلو کاروونکو او د دوی کړنو په اړه د معلوماتو غره راټولوي. لږترلږه، دا د ځانګړو پریکړو کولو لپاره اړین دی - د بیلګې په توګه، که تاسو آنلاین لوبه اداره کوئ، تاسو کولی شئ هغه احصایې وګورئ چې په کوم سطح کې کاروونکي اکثرا ودریږي او ستاسو لوبی حذف کوي. یا ولې کاروونکي ستاسو سایټ پرته له کوم څه پیرود پریږدي (سلام، Yandex.Metrica).

نو، زموږ کیسه: څنګه موږ په ګولنګ کې یو اپلیکیشن لیکلی، د کافکا vs rabbitmq vs yqs ازموینه کړې، د کلیک هاوس کلستر کې د ډیټا سټریمینګ لیکلی او د یانډیکس ډیټالینز په کارولو سره ډیټا لیدلی. په طبیعي توګه، دا ټول د ډاکر، ټرافورم، ګیټلاب ci او البته، پرومیتیس په بڼه د زیربناوو خوښیو سره موسم شوي. مخکې شه!

زه غواړم سمدلاسه ریزرویشن وکړم چې موږ به ونه شو کولی هرڅه په یوه ناسته کې تنظیم کړو - د دې لپاره موږ به په لړۍ کې څو مقالو ته اړتیا ولرو. د جوړښت په اړه لږ څه:

لومړۍ برخه (تاسو یې لوستلی شئ). موږ به د حل د ځانګړتیاوو او جوړښت په اړه پریکړه وکړو، او په ګولنګ کې به یو غوښتنلیک ولیکئ.
2 برخه. موږ خپل غوښتنلیک تولید ته خوشې کوو، دا د توزیع وړ جوړوو او بار ازموینه کوو.
دریمه برخه. راځئ هڅه وکړو چې معلومه کړو چې ولې موږ اړتیا لرو چې پیغامونه په بفر کې ذخیره کړو نه په فایلونو کې، او همدارنګه د کافکا، rabbitmq او yandex کتار خدمت پرتله کړو.
څلورمه برخه موږ به د کلک هاؤس کلستر ځای په ځای کړو، د بفر څخه د ډیټا لیږدولو لپاره د سټیمینګ خدمت ولیکئ، او په ډیټالینز کې لید ترتیب کړئ.
پنځمه برخه راځئ چې ټول زیربنا مناسب شکل ته راوړو - د gitlab ci په کارولو سره ci/cd تنظیم کړئ، د پرومیتیس او کونسل په کارولو سره د څارنې او خدماتو کشف سره وصل کړئ.

TK

لومړی، راځئ چې د حوالې شرایط جوړ کړو - هغه څه چې موږ یې په پایله کې ترلاسه کول غواړو.

  1. موږ غواړو د پای ټکی لکه events.kis.im (kis.im د ازموینې ډومین دی چې موږ به یې په ټولو مقالو کې وکاروو)، کوم چې باید د HTTPS په کارولو سره پیښې ترلاسه کړي.
  2. پیښې یو ساده json دی لکه: {"ایونټ": "لید"، "os": "لینکس"، "براوزر": "کروم"}. په وروستي مرحله کې به موږ یو څه نور ساحې اضافه کړو، مګر دا به لوی رول ولوبوي. که تاسو وغواړئ، تاسو کولی شئ پروټوبف ته لاړ شئ.
  3. خدمت باید وړتیا ولري چې په هره ثانیه کې 10 پیښې پروسس کړي.
  4. دا باید ممکنه وي چې زموږ حل ته په ساده ډول د نوي مثالونو اضافه کولو سره په افقی ډول اندازه کړئ. او دا به ښه وي که موږ وکولی شو مخکینۍ برخه مختلف جیو ځایونو ته واړوو ترڅو د پیرودونکي غوښتنو لپاره ځنډ کم کړي.
  5. د خطا زغم. حل باید په کافي اندازه باثباته وي او د دې وړتیا ولري چې د هرې برخې له سقوط څخه ژوندي پاتې شي (البته تر یو ټاکلي شمیر پورې).

معمارۍ

په عموم کې، د دې ډول دندې لپاره، کلاسیک جوړښتونه د اوږدې مودې لپاره اختراع شوي چې د اغیزمن اندازه کولو اجازه ورکوي. شکل زموږ د حل یوه بیلګه ښیې.

موږ په Yandex.Cloud کې 10 پیښې منو. برخه 000

نو هغه څه چې موږ لرو:

1. په کیڼ اړخ کې زموږ وسایل دي چې بیلابیل پیښې رامینځته کوي ، که دا لوبغاړي په سمارټ فون کې د لوبو لیول بشپړ کړي یا د منظم براوزر له لارې آنلاین پلورنځي کې آرډر رامینځته کړي. یوه پیښه، لکه څنګه چې په مشخصاتو کې مشخص شوي، یو ساده json دی چې زموږ پای ټکی ته لیږل کیږي - events.kis.im.

2. لومړی دوه سرورونه ساده بیلانسران دي، اصلي دندې یې دا دي:

  • په دوامداره توګه شتون ولري. د دې کولو لپاره، تاسو کولی شئ د بیلګې په توګه، Keepalived وکاروئ، کوم چې د ستونزو په صورت کې د نوډونو ترمنځ مجازی IP بدلوي.
  • TLS ختم کړئ. هو، موږ به په دوی باندې TLS ختم کړو. لومړی، د دې لپاره چې زموږ حل د تخنیکي مشخصاتو سره مطابقت ولري، او دویم، زموږ د بیک انډ سرورونو څخه د کوډ شوي پیوستون رامینځته کولو بار څخه د خلاصون لپاره.
  • د شته پس منظر سرورونو ته د راتلونکو غوښتنو توازن. دلته کلیدي کلمه د لاسرسي وړ ده. د دې پراساس، موږ پوهیږو چې د بار توازن کونکي باید د دې وړتیا ولري چې زموږ سرورونه د غوښتنلیکونو سره وڅاري او ناکامه نوډونو ته د ترافیک توازن مخه ونیسي.

3. د بیلانسونو وروسته، موږ د غوښتنلیک سرورونه لرو چې په کافي اندازه ساده غوښتنلیک پرمخ وړي. دا باید د HTTP له لارې د راتلونکو غوښتنو منلو وړ وي، لیږل شوي json تایید کړي او ډاټا په بفر کې واچوي.

4. ډیاګرام کافکا د بفر په توګه ښیي، که څه هم، البته، په دې کچه نور ورته خدمتونه کارول کیدی شي. موږ به په دریمه مقاله کې کافکا، rabbitmq او yqs پرتله کړو.

5. زموږ د جوړښت پای پای ټکی کلک هاؤس دی - یو کالم ډیټابیس چې تاسو ته اجازه درکوي د ډیټا لوی مقدار ذخیره او پروسس کړئ. په دې کچه، موږ اړتیا لرو چې د بفر څخه ډاټا پخپله د ذخیره کولو سیسټم ته انتقال کړو (په دې اړه نور په 4 مقاله کې).

دا ډیزاین موږ ته اجازه راکوي چې هر پرت په خپلواک ډول په افقی ډول اندازه کړو. بیکنډ سرورونه نشي کولی مقابله وکړي - راځئ چې یو بل شی اضافه کړو - په هرصورت ، دا بې ریاسته غوښتنلیکونه دي ، او له همدې امله ، دا حتی په اوتومات ډول ترسره کیدی شي. د کافکا سټایل بفر کار نه کوي — راځئ چې نور سرورونه اضافه کړو او زموږ د موضوع ځینې برخې دوی ته واستوو. کلیک هاؤس نشي کولی دا اداره کړي - دا ناشونې ده :) په حقیقت کې، موږ به سرورونه هم وصل کړو او ډاټا به یې شریک کړو.

په هرصورت ، که تاسو غواړئ زموږ د تخنیکي مشخصاتو اختیاري برخه پلي کړئ او په مختلف جیو ځایونو کې پیمانه وکړئ ، نو هیڅ ساده شتون نلري:

موږ په Yandex.Cloud کې 10 پیښې منو. برخه 000

په هر جغرافیه کې موږ د اپلیکیشن او کافکا سره د بار بیلانسر ځای په ځای کوو. په عموم کې ، د غوښتنلیک 2 سرورونه ، 3 کافکا نوډونه او یو کلاوډ بیلنسر ، د مثال په توګه ، کلاوډ فلیر ، کافي دي ، کوم چې به د غوښتنلیک نوډونو شتون او د پیرودونکي سرچینې IP پتې پراساس د جیو ځای په واسطه د توازن غوښتنې چیک کړي. پدې توګه ، د امریکایی پیرودونکي لخوا لیږل شوي معلومات به په امریکایی سرورونو کې ځای په ځای شي. او د افریقا څخه ډاټا افریقی ده.

بیا هرڅه خورا ساده دي - موږ د کافکا سیټ څخه د عکس وسیله کاروو او د ټولو ځایونو څخه ټول معلومات په روسیه کې زموږ مرکزي ډیټا مرکز ته کاپي کوو. په داخلي توګه، موږ ډاټا تجزیه کوو او د راتلونکي لید لپاره یې په کلک هاؤس کې ثبت کوو.

نو، موږ جوړښت ترتیب کړی دی - راځئ چې د Yandex.Cloud ټکان پیل کړو!

د غوښتنلیک لیکل

د کلاوډ څخه دمخه ، تاسو باید لاهم یو څه صبر وکړئ او د راتلونکو پیښو پروسس کولو لپاره خورا ساده خدمت ولیکئ. موږ به ګولنګ وکاروو ځکه چې دا ځان د شبکې غوښتنلیکونو لیکلو لپاره د ژبې په توګه خورا ښه ثابت کړی.

د یو ساعت مصرف کولو وروسته (شاید څو ساعته)، موږ داسې یو څه ترلاسه کوو: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

اصلي ټکي کوم دي چې زه غواړم دلته یادونه وکړم:

1. کله چې غوښتنلیک پیل کړئ، تاسو کولی شئ دوه بیرغونه مشخص کړئ. یو د هغه بندر لپاره مسؤل دی چیرې چې موږ به د راتلونکو HTTP غوښتنو ته غوږ ونیسو (-addr). دوهم د کافکا سرور ادرس لپاره دی چیرې چې موږ به خپلې پیښې ثبت کړو (-کافکا):

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

2. غوښتنلیک د ساراما کتابتون کاروي ([] github.com/Shopify/saramaد کافکا کلستر ته د پیغامونو لیږلو لپاره. موږ سمدلاسه تنظیمات تنظیم کړل چې هدف یې د پروسس اعظمي سرعت دی:

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

3. زموږ غوښتنلیک یو جوړ شوی پرومیتیس پیرودونکی هم لري، کوم چې مختلف میټریکونه راټولوي، لکه:

  • زموږ غوښتنلیک ته د غوښتنو شمیر؛
  • د غوښتنې د اجرا کولو په وخت کې د غلطیو شمیر (د پوسټ غوښتنې لوستل ناممکن دي، مات شوي جیسن، کافکا ته لیکل ناممکن دي)؛
  • د پیرودونکي څخه د یوې غوښتنې لپاره د پروسس کولو وخت، په شمول کافکا ته د پیغام لیکلو وخت.

4. درې پای ټکي چې زموږ غوښتنلیک پروسس کوي:

  • /status - په ساده ډول بیرته راستون شو ترڅو وښیو چې موږ ژوندي یو. که څه هم تاسو کولی شئ ځینې چکونه اضافه کړئ، لکه د کافکا کلستر شتون.
  • /metrics - د دې url مطابق، د پرومیتیس پیرودونکی به هغه میترونه بیرته راولي چې دا راټول شوي.
  • /post اصلي پای ټکی دی چیرې چې د json دننه د POST غوښتنې به لیږل کیږي. زموږ غوښتنلیک د اعتبار لپاره json چک کوي او که هرڅه سم وي، دا د کافکا کلستر ته ډاټا لیکي.

زه به یو ریزرویشن وکړم چې کوډ بشپړ نه دی - دا کیدی شي (او باید!) بشپړ شي. د مثال په توګه، تاسو کولی شئ د جوړ شوي net/http کارولو مخه ونیسئ او په چټکۍ سره چټک HTTP ته لاړ شئ. یا تاسو کولی شئ د پروسس کولو وخت او د cpu سرچینې ترلاسه کړئ د json اعتبار چیک وروسته مرحلې ته لیږدولو سره - کله چې ډاټا د بفر څخه د کلک هاؤس کلستر ته لیږدول کیږي.

د مسلې د پراختیا اړخ سربیره ، موږ سمدلاسه زموږ د راتلونکي زیربنا په اړه فکر وکړ او پریکړه یې وکړه چې زموږ غوښتنلیک د ډاکر له لارې ځای په ځای کړو. د غوښتنلیک جوړولو لپاره وروستی ډاکر فایل دی https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. په عموم کې ، دا خورا ساده دی ، یوازینی ټکی چې زه غواړم ورته پاملرنه وکړم د څو مرحلو مجلس دی ، کوم چې موږ ته اجازه راکوي زموږ د کانټینر وروستی عکس کم کړو.

په بادل کې لومړی ګامونه

لومړی، راجستر کړئ cloud.yandex.ru. د ټولو اړینو ساحو ډکولو وروسته، موږ به یو حساب جوړ کړو او د یوې ټاکلې اندازې پیسو لپاره به وړیا مرسته ورکړو، کوم چې د بادل خدماتو ازموینې لپاره کارول کیدی شي. که تاسو غواړئ زموږ د مقالې څخه ټول مرحلې تکرار کړئ ، دا مرستې باید ستاسو لپاره کافي وي.

د راجسټریشن وروسته ، یو جلا بادل او یو ډیفالټ لارښود به ستاسو لپاره رامینځته شي ، په کوم کې چې تاسو کولی شئ د کلاوډ سرچینې رامینځته کول پیل کړئ. په عموم کې، په Yandex.Cloud کې، د سرچینو اړیکه داسې ښکاري:

موږ په Yandex.Cloud کې 10 پیښې منو. برخه 000

تاسو کولی شئ د یو حساب لپاره څو بادلونه جوړ کړئ. او د بادل دننه، د مختلفو شرکتونو پروژو لپاره مختلف لارښودونه جوړ کړئ. تاسو کولی شئ پدې اړه نور معلومات په اسنادو کې ولولئ - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. په لاره کې، زه به ډیری وختونه دا په متن کې لاندې حواله کړم. کله چې ما ټول زیربنا له سکریچ څخه جوړه کړه، اسنادو له ما سره یو ځل مرسته وکړه، نو زه تاسو ته مشوره درکوم چې دا مطالعه کړئ.

د کلاوډ اداره کولو لپاره ، تاسو کولی شئ دواړه ویب انٹرفیس او کنسول افادیت وکاروئ - yc. نصب کول د یوې کمانډ سره ترسره کیږي (د لینکس او ماک OS لپاره):

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

که ستاسو د داخلي امنیت متخصص د انټرنیټ څخه د سکریپټونو چلولو په اړه ناراض وي، نو لومړی، تاسو کولی شئ سکریپټ پرانیزئ او لوستل یې کړئ، او دویم، موږ دا زموږ د کارونکي لاندې چلوو - پرته له روټ حقونو.

که تاسو غواړئ د وینډوز لپاره پیرودونکي نصب کړئ، تاسو کولی شئ لارښوونې وکاروئ دلته او بیا یې اجرا کړئ 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:~ $

په اصولو کې ، پروسه ساده ده - لومړی تاسو اړتیا لرئ د کلاوډ اداره کولو لپاره د سند نښه ترلاسه کړئ ، بادل او هغه فولډر غوره کړئ چې تاسو به یې کاروئ.

که تاسو په ورته کلاوډ کې ډیری حسابونه یا فولډرې لرئ ، تاسو کولی شئ د 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 config لیست څخه اخیستل کیدی شي، ځکه چې موږ دمخه د کنسول افادیت ترتیب کړی دی. زه تاسو ته مشوره درکوم چې سمدلاسه په .gitignore کې private.auto.tfvars اضافه کړئ ، ترڅو په ناڅاپي ډول شخصي معلومات خپاره نشي.

په private.auto.tfvars کې موږ د Cloudflare څخه ډاټا هم مشخص کړې - د DNS ریکارډونو رامینځته کولو او زموږ سرورونو ته اصلي ډومین events.kis.im پراکسي کولو لپاره. که تاسو نه غواړئ کلاوډ فلیر وکاروئ ، نو په main.tf او dns.tf فایل کې د کلاوډ فلیر چمتو کونکي ابتکار لرې کړئ ، کوم چې د اړین dns ریکارډونو رامینځته کولو مسؤل دی.

زموږ په کار کې به موږ ټولې درې میتودونه سره یوځای کړو - ویب انٹرفیس، د کنسول افادیت، او ټرافارم.

مجازی شبکې

د ریښتیني کیدو لپاره ، تاسو کولی شئ دا مرحله پریږدئ ، ځکه چې کله تاسو نوی کلاوډ رامینځته کوئ ، نو تاسو به په اوتومات ډول جلا شبکه ولرئ او 3 فرعي نیټونه رامینځته کړئ - یو د هر شتون زون لپاره. مګر موږ بیا هم غواړو چې زموږ د پروژې لپاره د خپل پته سره جلا شبکه جوړه کړو. عمومي ډیاګرام چې څنګه شبکه په Yandex.Cloud کې کار کوي په لاندې شکل کې ښودل شوي (په صادقانه توګه له دې څخه اخیستل شوي https://cloud.yandex.ru/docs/vpc/concepts/)

موږ په Yandex.Cloud کې 10 پیښې منو. برخه 000

نو، تاسو یو مشترکه شبکه جوړه کړئ چې په کې سرچینې کولی شي د یو بل سره اړیکه ونیسي. د هر موجودیت زون لپاره، یو فرعي نیټ د خپل پته سره رامینځته شوی او د عمومي شبکې سره وصل شوی. د پایلې په توګه ، پدې کې ټولې بادل سرچینې کولی شي اړیکه ونیسي ، حتی که دوی د شتون مختلف زونونو کې وي. د مختلف بادل شبکو سره تړلې سرچینې کولی شي یو بل وګوري یوازې د بهرني ادرسونو له لارې. په لاره کې، دا جادو څنګه دننه کار کوي، په هابري کې ښه تشریح شوی.

د شبکې جوړول د ذخیره کولو څخه د 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.

غوره! موږ خپله شبکه جوړه کړې او اوس چمتو یو چې خپل داخلي خدمات رامینځته کړو.

د مجازی ماشینونو جوړول

د اپلیکیشن ازموینې لپاره ، موږ به یوازې دوه مجازی ماشینونو رامینځته کولو ته اړتیا ولرو - موږ به لومړی د اپلیکیشن جوړولو او چلولو ته اړتیا ولرو ، دوهم د کافکا چلولو لپاره ، کوم چې موږ به د راتلونکو پیغامونو ذخیره کولو لپاره وکاروو. او موږ به یو بل ماشین جوړ کړو چیرې چې موږ به د غوښتنلیک نظارت کولو لپاره پرومیتیس تنظیم کړو.

مجازی ماشینونه به د ځواب وړ په کارولو سره تنظیم شي، نو مخکې له دې چې د ټیرفارم پیل کړئ، ډاډ ترلاسه کړئ چې تاسو د ځواب وړ وروستۍ نسخه لرئ. او د ځواب وړ کهکشان سره اړین رولونه نصب کړئ:

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.cfg ترتیب فایل شتون لري چې زه یې کاروم. دا ممکن په لاس کې راشي.

د مجازی ماشینونو جوړولو دمخه، ډاډ ترلاسه کړئ چې تاسو د ssh-agent روان یاست او د ssh کیلي اضافه شوي، که نه نو ټیرافارم به د جوړ شوي ماشینونو سره وصل نشي. زه، البته، په 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

په فولډر کې د Teraform سره موږ اړین سرچینې رامینځته کوو:

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. جوړول - د غوښتنلیک ازموینې او جوړولو لپاره ماشین. ډاکر د ځواب وړ لخوا په اوتومات ډول نصب شوی.
  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 پتې ترلاسه کړو. د هغه څه په جریان کې چې لاندې به زه د ssh له لارې وصل کیدو او غوښتنلیک ازموینې لپاره IP پتې وکاروم. که تاسو د کلاوډ فلیر حساب لرئ چې د ټیرفارم سره وصل دی ، نو د تازه رامینځته شوي 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

دا به زموږ لپاره ګټور وي چې غوښتنلیک ته د کافک سره پای ټکی په ګوته کړو.

د غوښتنلیک راټولول

عالي ، سرورونه شتون لري ، یو غوښتنلیک شتون لري - ټول هغه څه چې پاتې دي هغه راټولول او خپاره کول دي. د جوړونې لپاره به موږ د عادي ډاکر جوړونې څخه کار واخلو، مګر د عکس ذخیره کولو په توګه به موږ د Yandex - کانټینر راجستر څخه یو خدمت وکاروو. مګر لومړی شیان لومړی.

موږ غوښتنلیک د جوړونې ماشین ته کاپي کوو ، د 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 token، iam token، یا د خدماتو حساب کیلي په کارولو سره. د دې میتودونو په اړه نور توضیحات په اسنادو کې موندل کیدی شي. 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 یوټیلیټ نصب کړئ، تاسو کولی شئ کمانډ وکاروئ

yc container registry configure-docker

د ډاکر تنظیم کولو لپاره.

پایلې

موږ ډیر سخت کار کړی او په پایله کې:

  1. موږ د خپل راتلونکي خدمت جوړښت سره مخ شو.
  2. موږ په ګولنګ کې یو غوښتنلیک لیکلی چې زموږ د سوداګرۍ منطق پلي کوي.
  3. موږ دا راټول کړل او په شخصي کانټینر کې یې ثبت کړل.

په راتلونکې برخه کې، موږ به په زړه پورې توکو ته لاړ شو - موږ به خپل غوښتنلیک تولید ته خپور کړو او په پای کې به یې بار پیل کړو. مه بدلوئ!

دا مواد د خلاص ورکشاپ REBRAIN او Yandex.Cloud ویډیو ثبتولو کې دي: موږ په هر ثانیه کې 10 غوښتنې په Yandex کلاوډ کې منو - https://youtu.be/cZLezUm0ekE

که تاسو لیوالتیا لرئ چې آنلاین داسې پیښو کې برخه واخلئ او په ریښتیني وخت کې پوښتنې وکړئ، اړیکه ونیسئ د REBRAIN لخوا د DevOps چینل.

موږ غواړو د Yandex.Cloud څخه د داسې یوې غونډې کوربه توب کولو فرصت لپاره ځانګړې مننه ووایو. د هغوی سره اړیکه - https://cloud.yandex.ru/prices

که تاسو بادل ته تللو ته اړتیا لرئ یا ستاسو د زیربنا په اړه پوښتنې لرئ، د غوښتنې پریښودلو لپاره وړیا احساس وکړئ.

PS موږ په میاشت کې 2 وړیا پلټنې لرو، شاید ستاسو پروژه به یو له دوی څخه وي.

سرچینه: www.habr.com

Add a comment