اسان Yandex.Cloud ۾ 10 واقعا قبول ڪريون ٿا. حصو 000

سڀني کي سلام، دوستو!

* هي آرٽيڪل REBRAIN ۽ Yandex.Cloud اوپن ورڪشاپ تي ٻڌل آهي، جيڪڏهن توهان وڊيو ڏسڻ چاهيو ٿا، توهان ان کي هن لنڪ تي ڳولي سگهو ٿا - https://youtu.be/cZLezUm0ekE

اسان کي تازو موقعو مليو هو ڪوشش ڪرڻ جو Yandex.Cloud لائيو. جيئن ته اسان ڊگهو ۽ سخت تحقيق ڪرڻ چاهيون ٿا، اسان فوري طور تي هڪ سادي ورڈپریس بلاگ کي ڪلائوڊ بيس سان شروع ڪرڻ جو خيال ڇڏي ڏنو - اهو ڏاڍو بورنگ هو. ڪجھ سوچڻ کان پوءِ، اسان فيصلو ڪيو ته ھڪڙي پيداوار جي خدمت جي فن تعمير سان ملندڙ جلندڙ واقعن کي حاصل ڪرڻ ۽ تجزيو ڪرڻ لاءِ ريئل ٽائيم موڊ ۾.

مون کي پڪ آهي ته وڏي اڪثريت آن لائن (۽ نه رڳو) ڪاروبار ڪنهن نه ڪنهن طرح انهن جي استعمال ڪندڙن ۽ انهن جي عملن بابت معلومات جو جبل گڏ ڪن ٿا. گهٽ ۾ گهٽ، اهو ڪجهه خاص فيصلا ڪرڻ لاءِ ضروري آهي - مثال طور، جيڪڏهن توهان هڪ آن لائن راند کي منظم ڪريو ٿا، توهان انگ اکر ڏسي سگهو ٿا ته ڪهڙي سطح تي استعمال ڪندڙ اڪثر ڪري ڦاسي ويندا آهن ۽ توهان جي رانديڪن کي حذف ڪندا آهن. يا ڇو ته صارف توهان جي سائيٽ کي بغير ڪنهن به شيء جي خريد ڪري ڇڏيندا آهن (هيلو، Yandex.Metrica).

تنهن ڪري، اسان جي ڪهاڻي: اسان گولانگ ۾ هڪ ايپليڪيشن ڪيئن لکي، ڪافڪا بمقابله rabbitmq vs yqs کي آزمايو، هڪ ڪلڪ هائوس ڪلستر ۾ ڊيٽا اسٽريمنگ لکيو ۽ yandex datalens استعمال ڪندي ڊيٽا کي تصور ڪيو. قدرتي طور تي، اهو سڀ ڪجهه انفراسٹرڪچر جي نعمتن سان گڏ ڊاکر، ٽيرافارم، گيتلب سي ۽، يقينا، پروميٿيوس جي صورت ۾ هو. اچو ته هلون!

مان فوري طور تي هڪ رزرويشن ڪرڻ چاهيان ٿو ته اسان هڪ سيٽ ۾ هر شي کي ترتيب ڏيڻ جي قابل نه هوندا - ان لاء اسان کي سيريز ۾ ڪيترن ئي مضمونن جي ضرورت پوندي. ساخت جي باري ۾ ٿورو:

حصو 1 (توهان ان کي پڙهي رهيا آهيو). اسان حل جي وضاحتن ۽ فن تعمير تي فيصلو ڪنداسين، ۽ گولانگ ۾ هڪ درخواست پڻ لکنداسين.
حصو 2. اسان اسان جي ايپليڪيشن کي پيداوار ۾ جاري ڪيو، ان کي اسپيبلبل ٺاهيو ۽ لوڊ کي جانچيو.
حصو 3. اچو ته اهو سمجهڻ جي ڪوشش ڪريون ته اسان کي پيغامن کي بفر ۾ ذخيرو ڪرڻ جي ضرورت آهي ۽ فائلن ۾ نه، ۽ پڻ ڪافڪا، rabbitmq ۽ yandex قطار سروس جو مقابلو ڪريو.
حصو 4 اسان هڪ ڪلڪ هائوس ڪلستر کي ترتيب ڏينداسين، اتي بفر مان ڊيٽا کي منتقل ڪرڻ لاء هڪ اسٽريمنگ سروس لکندا، ۽ ڊيٽالينز ۾ بصري ترتيب قائم ڪنداسين.
حصو 5 اچو ته پوري انفراسٽرڪچر کي صحيح شڪل ۾ آڻيون - سيٽ اپ ڪريو ci/cd استعمال ڪندي gitlab ci، ڪنيڪٽ مانيٽرنگ ۽ سروس دريافت کي استعمال ڪندي پروميٿيوس ۽ قونصل.

TK

پهرين، اچو ته حوالن جي شرطن کي ترتيب ڏيو - انهي جي نتيجي ۾ اسان ڇا حاصل ڪرڻ چاهيون ٿا.

  1. اسان چاهيون ٿا ته هڪ آخري پوائنٽ هجي جهڙوڪ events.kis.im (kis.im اهو امتحان وارو ڊومين آهي جيڪو اسان سڀني مضمونن ۾ استعمال ڪنداسين)، جيڪو HTTPS استعمال ڪندي واقعا حاصل ڪرڻ گهرجي.
  2. واقعا هڪ سادي json آهن جهڙوڪ: {"ايونٽ": "ڏسو"، "او ايس": "لينڪس"، "براؤزر": "ڪروم"}. آخري مرحلي ۾ اسان ڪجھ وڌيڪ فيلڊ شامل ڪنداسين، پر اھو ھڪڙو وڏو ڪردار ادا نه ڪندو. جيڪڏھن توھان چاھيو، توھان تبديل ڪري سگھوٿا پروٽوبف ڏانھن.
  3. خدمت کي پروسيس ڪرڻ جي قابل هوندو 10 واقعا في سيڪنڊ.
  4. اسان جي حل ۾ صرف نوان مثال شامل ڪندي افقي طور تي ماپڻ ممڪن آهي. ۽ اهو سٺو ٿيندو جيڪڏهن اسان ڪلائنٽ جي درخواستن جي ويڪرائي کي گهٽائڻ لاءِ سامهون واري حصي کي مختلف جغرافيائي هنڌن ڏانهن منتقل ڪري سگهون ٿا.
  5. عيب رواداري. حل ڪافي مستحڪم هجڻ گهرجي ۽ ڪنهن به حصن جي زوال کان بچڻ جي قابل هوندو (هڪ خاص نمبر تائين، يقينا).

تعمير

عام طور تي، هن قسم جي ڪم لاء، ڪلاسيڪل آرڪيٽيڪچر ڊگهي ايجاد ڪئي وئي آهي جيڪي موثر اسڪيلنگ جي اجازت ڏين ٿيون. شڪل اسان جي حل جو هڪ مثال ڏيکاري ٿو.

اسان Yandex.Cloud ۾ 10 واقعا قبول ڪريون ٿا. حصو 000

تنهنڪري اسان وٽ ڇا آهي:

1. کاٻي پاسي اسان جا ڊوائيس آھن جيڪي مختلف واقعا پيدا ڪن ٿا، اھي رانديگر ھجن سمارٽ فون تي رانديڪن ۾ ليول مڪمل ڪرڻ يا باقاعده برائوزر ذريعي آن لائن اسٽور ۾ آرڊر ٺاھيو. ھڪڙو واقعو، جيئن وضاحت ۾ بيان ڪيو ويو آھي، ھڪڙو سادو json آھي جيڪو اسان جي آخري پوائنٽ ڏانھن موڪليو ويو آھي - events.kis.im.

2. پهريان ٻه سرور سادو بيلنس آهن، انهن جا مکيه ڪم هي آهن:

  • مسلسل دستياب هجڻ. هن کي ڪرڻ لاء، توهان استعمال ڪري سگهو ٿا، مثال طور، Keepalived، جيڪو مسئلن جي صورت ۾ نوڊس جي وچ ۾ ورچوئل IP کي تبديل ڪندو.
  • TLS ختم ڪريو. ها، اسان انهن تي TLS ختم ڪنداسين. پهريون، ته جيئن اسان جو حل ٽيڪنيڪل وضاحتن جي تعميل ڪري، ۽ ٻيو، اسان جي پس منظر سرورز کان هڪ اينڪريٽ ٿيل ڪنيڪشن قائم ڪرڻ جي بار کي گهٽائڻ لاءِ.
  • بيلنس اچڻ واري درخواستن کي دستياب پس منظر سرورز ڏانهن. هتي اهم لفظ پهچ آهي. انهي جي بنياد تي، اسان سمجهون ٿا ته لوڊ بيلنسرز کي اسان جي سرورز کي ايپليڪيشنن سان مانيٽر ڪرڻ ۽ ناڪامي نوڊس ڏانهن ٽرئفڪ کي توازن ڪرڻ کي روڪڻ جي قابل هوندو.

3. بيلنسرز کان پوء، اسان وٽ ايپليڪيشن سرور آهن جيڪي ڪافي سادي ايپليڪيشن هلائي رهيا آهن. اهو HTTP ذريعي اچڻ واري درخواستن کي قبول ڪرڻ جي قابل هوندو، موڪليل json جي تصديق ڪريو ۽ ڊيٽا کي بفر ۾ وجهي.

4. ڊراگرام ڪافڪا کي بفر طور ڏيکاري ٿو، جيتوڻيڪ، يقينا، ٻيون ساڳيون خدمتون هن سطح تي استعمال ڪري سگهجن ٿيون. اسان ٽئين مضمون ۾ Kafka، rabbitmq ۽ yqs جو مقابلو ڪنداسين.

5. اسان جي فن تعمير جو آخري نقطو Clickhouse آهي - هڪ ڪالمن ڊيٽابيس جيڪو توهان کي ڊيٽا جي وڏي مقدار کي ذخيرو ۽ پروسيس ڪرڻ جي اجازت ڏئي ٿو. هن سطح تي، اسان کي ڊيٽا کي بفر کان اسٽوريج سسٽم ڏانهن منتقل ڪرڻ جي ضرورت آهي (وڌيڪ هن آرٽيڪل 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). ٻيو آهي ڪافڪا سرور ايڊريس لاءِ جتي اسان پنهنجا واقعا رڪارڊ ڪنداسين (-kafka):

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 اندر موڪلي وينديون. اسان جي ايپليڪيشن json جي صحيحيت جي جانچ ڪري ٿي ۽ جيڪڏهن سڀ ڪجهه ٺيڪ آهي، اهو ڊيٽا کي ڪافڪا ڪلستر ڏانهن لکي ٿو.

مان هڪ رزرويشن ڪندس ته ڪوڊ مڪمل نه آهي - اهو مڪمل ٿي سگهي ٿو (۽ گهرجي!) مثال طور، توھان استعمال ڪرڻ بند ڪري سگھوٿا بلٽ ان نيٽ/http ۽ سوئچ ڪري سگھوٿا تيز تيز HTTP تي. يا توهان حاصل ڪري سگهو ٿا پروسيسنگ وقت ۽ سي پي يو وسيلن کي منتقل ڪندي 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. تنصيب هڪ حڪم سان ڪيو ويندو آهي (لينڪس ۽ ميڪ او ايس لاء):

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 config پروفائل ذريعي الڳ سيٽنگن سان اضافي پروفائل ٺاهي سگهو ٿا ۽ انهن جي وچ ۾ سوئچ ڪريو.

مٿين طريقن جي علاوه، 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 فولڊر ۾ نجي.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 لسٽ مان وٺي سگھجن ٿا، ڇو ته اسان اڳ ۾ ئي ڪنسول يوٽيلٽي کي ترتيب ڏنو آھي. مان توهان کي صلاح ڏيان ٿو ته فوري طور تي private.auto.tfvars کي .gitignore ۾ شامل ڪريو، جيئن حادثاتي طور تي نجي ڊيٽا شايع نه ٿئي.

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

تنهن ڪري، توهان هڪ عام نيٽ ورڪ ٺاهيو جنهن جي اندر وسيلن هڪ ٻئي سان رابطو ڪري سگهن ٿا. هر دستيابي علائقي لاءِ، هڪ ذيلي نيٽ ٺاهيو ويو آهي ان جي پنهنجي ايڊريس سان ۽ عام نيٽ ورڪ سان ڳنڍيل آهي. نتيجي طور، ان ۾ موجود سڀ بادل وسيلا ڳالهائي سگھن ٿا، جيتوڻيڪ اهي مختلف دستيابي علائقن ۾ آهن. مختلف ڪلائوڊ نيٽ ورڪن سان ڳنڍيل وسيلا هڪ ٻئي کي ڏسي سگهن ٿا صرف ٻاهرين پتي ذريعي. اهڙي طرح، اهو جادو اندر ڪيئن ڪم ڪندو آهي، هبري تي چڱي طرح بيان ڪيو ويو آهي.

نيٽ ورڪ ٺاھڻ کي بيان ڪيو ويو آھي نيٽ ورڪ.tf فائل ۾ مخزن مان. اتي اسان ھڪڙو عام پرائيويٽ نيٽ ورڪ اندروني ٺاھيو آھي ۽ ان کي مختلف دستيابي زونن ۾ ٽي ذيلي نيٽ ورڪ ڳنڍيندا آھن - اندروني-a (172.16.1.0/24)، اندروني-b (172.16.2.0/24)، اندروني-c (172.16.3.0/24) ).

شروع ڪريو terraform ۽ نيٽ ورڪ ٺاھيو:

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

فولڊر ۾ 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 جوابي طرفان خودڪار طريقي سان نصب ڪيو ويو.
  2. مانيٽرنگ - هڪ مانيٽرنگ مشين - ان تي نصب ڪيل پروميٿيوس ۽ گرافانا. لاگ ان / پاسورڊ معياري: منتظم / منتظم
  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 ذريعي ڳنڍڻ ۽ ايپليڪيشن کي جانچڻ لاءِ. جيڪڏهن توهان وٽ ڪلائوڊ فليئر اڪائونٽ آهي ٽيرافارم سان ڳنڍيل آهي، تازو ٺهيل 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) $

ايپليڪيشن رڪارڊنگ جي ڪاميابي سان جواب ڏنو ۽ ورهاڱي جي سڃاڻپ ۽ آفسٽ کي اشارو ڪيو جنهن ۾ پيغام شامل ڪيو ويو. اهو سڀ ڪجهه ڪرڻو آهي 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:~$

تصوير کي رجسٽري ۾ اپلوڊ ڪرڻ لاءِ، اسان کي ڪنٽينر جي رجسٽري 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 جي وڊيو رڪارڊنگ ۾ آهي: اسان Yandex Cloud تي في سيڪنڊ 10 درخواستون قبول ڪندا آهيون - https://youtu.be/cZLezUm0ekE

جيڪڏھن توھان دلچسپي وٺندا آھيو آن لائين واقعن ۾ شرڪت ڪرڻ ۽ حقيقي وقت ۾ سوال پڇڻ، سان رابطو ڪريو چينل DevOps پاران REBRAIN.

اسان چاهيون ٿا ته Yandex.Cloud جي خاص مهرباني جو توهان کي اهڙي واقعي جي ميزباني ڪرڻ جو موقعو مليو. انهن سان ڳنڍيو - https://cloud.yandex.ru/prices

جيڪڏھن توھان کي بادل ڏانھن منتقل ڪرڻ جي ضرورت آھي يا توھان جي انفراسٽرڪچر بابت سوال آھن، هڪ درخواست ڇڏڻ لاء آزاد محسوس ڪريو.

پي ايس اسان وٽ هر مهيني 2 مفت آڊٽ آهن، شايد توهان جو پروجيڪٽ انهن مان هڪ هوندو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو