Open-Stack از Hackathon تا Summit – قسمت اول

سلام دوستهای من. خوبید سلامتید؟

طی این پست و بعدیش میخوام کلی براتون حرف بزنم. از یک آخر هفته هیجان انگیز تا یه مبارزه(یا مسابقه) تا یه رویداد علمی کامیپوتری و کلی چیزهای خوب دیگه که طی این دو هفته یاد گرفتم و تجربه کردم.

قبل از هر چیز دلم میخواست بگم یکی از دلایلی که تصمیم گرفتم در یک کشور دوم زندگی کنم دسترسی به این امکانات خوب بوده. نه اینکه داخل ایران از این قبیل امکانات اصلا نیست ولی شرایط یکم متفاوته! و جا داره بگم مقصرش هم خودمونیم که در بوجود آوردن اتفاقات خوب برای هم و به کمک هم خساست میکنم. اتفاقات خوبی که این چند مدت برای من افتاد مدیون منش هم‌بستگی و هم‌دلی یک تیم در فرهنگ غربیه(فرهنگ غربی خوبی داره بدیم داره که ما باید خوبیاش رو یاد بگیریم و با خوبیهای خودمون تلفیقشون کنیم) از این بحث بگذریم بریم سر اصل داستان:

یه روز معمولی که در حال وبگردی بودم به رویدادی(Open-Stack Summit) برخوردم که قرار بود در برلین برگزار بشه، خیلی هیجان زده شدم چرا که زمانی در حال فکر کردن بهش بخواب میرفتم و با رویاش از خوب میپریدم. اوپن استک! برخلاف اسمش که مثله یه نرم‌افزار معمولی میمونه خیلی پروژه گنده‌ای هست(بوده و خواهد بود) یه زمانی خیلی سعی میکردم یادش بگیرم و باهاش استارت‌آپ راه بندازم و کلی چیزه دیگه تا اینکه حتی یک مرتبه یه تیم کوچیک هم درست شد ولی بدلیل نداشتن منابع علمی و همچنین نداشتن یه رهبر دلسوز برای گروه کلا این مسئله منتفی شد! جا داره به اون گروه یه سلام ویژه بکنم. بنابر‌این تصمیم گرفتم برای یاد گرفتنش خودم رو بندازم وسط ماجرا، و این شد که به عنوان سیس‌ادمین کارآموز(Junior) به استخدام یک شرکت در اومدم. از اونجایی که نمیخوام تبلیغ شرکت خاصی بکنم از بردن نامش اجتناب میکنم ولی اگه کنجکاوتون کرده پیشنهاد میکنم به صفحه لینکد‌این من برید و سوابقم رو بررسی کنید حتما پیدا میکنید کجا رو میگم. تازه همزمان توصیه میکنم اگه دوست دارید لب مرز تکنولوژی کار کنید حتما برید اونجا کار کنید.

صفحه رو که باز کردم دیدم قیمت شرکت در رویداد از ۴۹۹ دلار شروع میشه. خوب خودم که برام سخت بود از جیبم پرداخت کنم، تو فکر بودم به شرکتی که براشون کار میکنم بگم ولی از اونجایی که دانشجو هستم و بصورت پاره‌وقت کار میکنم خیلی بعید میدونستم درخواستم مورد قبول واقع بشه. چاره چه بود؟ در لحظه هیچی به ذهنم نمیرسید و پیش خودم گفتم خیلی هم مهم نیست. همینطور که داشتم توی صفحات مختلف سایت مربوطه میگشتم چشمم خورد به یک رویداد جالب دیگه. اسمش بود Open-Stack Hackathon. هکتون در واقع یه رقابت و چالش برای برنامه‌نویسها و سیس‌ادمینها(بالاخره باید یکم برنامه نویسی بلد بود) است که چالشها و یا پیشنهادات مربوط به یک موضوع خاص توسط افراد مطرح میشه و یه هیات تصمیم میگیره کدام ایده ها باید یک تیم بشه و نهایتا نظریه پردازها یا صاحبان ایده به عنوان لیدر و بقیه به عضوت تیمها در میان تا طی یک مدت زمان مشخص ایده رو مثل یه پروژه واقعی بنویسن و پیاده سازی کنند. قبلتر هم یک هکتون رفته بودم و اونجا تیم ما سوم شد و برنده جایزه موزه بازیهای کامپیوتری شدیم که خیلیم بهمون خوش گذشت. بنابراین تصمیم گرفتم ثبت نام کنم. این اتفاقات شاید سه یا چهار ماه پیش افتاده(تجربه من: همیشه باید برای شرکت در همچنین رویدادهایی بسیار زود اقدام کنیم اگر نه بعلت محدودیت ممکنه بسته بشه). روز موعود فرا رسید و من هم با لبی خندون و دلی شاد (یکم هم سرخوش) وارد شدم. خوشبختانه از اصل موضوع که اپن‌استک بود اطلاعات کافی داشتم. زبان برنامه نویسی مرتبط به اپن‌استک هم پایتون هست که به آن هم اندکی مسلط بودم و همین بهم اعتماد به نفس داد تا در یکی از تیمها مشارکت کنم.

انتخاب این تیم دلایل مختلفی داشت. از جمله اینکه ایده تیم خیلی جاه‌طلبانه بود و تقریبا من هیچی از علمیاتی شدنش نمیدونستم، پس میتونستم کلی چیز یاد بگیرم. افردای که در لحظه داشتن تبادل اطلاعات میکردن به نظر خیلی با تجربه میرسیدند و در عین حال اصلا نگاه سطح بالایی نداشتند(بعدا فهمیدم که یکی از همین افرد بورد ممبر پروژه بزرگی به اسم StarlingX هست) و از همه مهم تر اصل موضوع بحث که شامل چند سرویس اوپن استک بود خیلی برام غریبه نبود از اونجایی که چند باری بصورت لابرآتواری پیاده سازیشان کرده بودم و مطمئن بودم به اندازه کافی منابع کاربردی براشون هست. پس همه شرطهای لازم برای ملحق شدن به تیم Openstackoid بود. هم مطالب زیادی برای آموختن بود، هم با اعضای تیم راحت بودم و هم میتونستم برای تیم مفید باشم. بنابراین پس از معرفی خودم و خلاصه‌ای از رزومم؛ اسمم را در پنل مربوطه اضافه کردم و رسما عضوی از این تیم شدم.

ایده مورد بحث چی بود؟!

توی دینای اوپن‌استک و تقریبا اکثر پابلیک‌کلادها مثل AWS یه مشکلی اساسی هست که هیچ وقت حل نشده بود! کاری که تیم ما میخواست انجام بده این بود که به هر دلیلی ممکن هست که لازم باشه از یکی از سرویسهای اصلی یک ریجن(به تقسم بندی جغرافییایی در دنیای ابری گفته میشه) برای یکی دیگر از سرویسهای اصلی در ریجن دیگر استفاده بشه. ساده ترین مثالش اینه که فرض کنید شما یه تمپلیت ایمیج از ابونتو ۱۸۰۴ در ریجن برلین دارید که همین تمپلیت ایمیج رو در تهران ندارید و میخواهید بدون اینکه تمپلیت ایمیج رو به ریجن تهران منتقل کنید در هایپروایزر ریجن تهران از روش یه ماشین مجازی بسازید.

OpenStack, اوپن استک 

این کار عملی نیست. دلیلشم اینه که هسته اوپن استک در نهایت در سطح ریجن تسقیم بندی میشه. اگه بخوام ساده بگم ریجن مثل روت دایرکتوری میمونه و شما نمیتونید یه سطح بالا تر از روت دایرکتوی فایل یا دایرکتوری دیگری داشته باشید.
نمیشه که چاره چیه؟! ایده این بود که یه کاری کنیم این عملی بشه برای خیلی مثالهای پیچیده‌تر.

اولش کلی بحث بود که اصلا چه باید کرد. و هر کس نظراتش رو گفت و روی یک روش مشخص توافق کردیم. چکیده توافق این بود!

تا اونجایی که میشه به اصل کد دست نبریم!

کامپوننت حدید ننویسیم!

با کولا ( Kolla )و نوا ( Nova ) و گلانس(Glance ) شروع کنیم

یک HA پراکسی جدید بنویسیم که یه لایه بالاتر از Haproxy فعلی که در سطح ریجن کار میکنه، کار کنه

برای اینکه HA پراکسی جدید درست کار کنه باید Delivery Service Layer جدید مینوشتیم یا قبلی رو بهبود میدادیم. یعنی اینکه مثلا برای اینکه یه ویرچوال ماشین ساخته بشه نوا اول باید به یکی از یه سرویسها به اسم کی‌استون رجوع کنه که آیا این یوزر دسترسی داره پس DSL برای نوا کی‌استن را صدا میکنه و ازش میپرسه و بعد اگه این شرط صحیح بود چک کنه ببینه تیمپلیت ایمیج جزو ذخیار گلانس هست و اگه هست یک کپی ازش بگیره و بده دست هاپیروایز و بقیه ماجرا! دیدید گفتم خیلی جاه‌طلبانه هست؟

خوب این اتفاق در سطح ریجن میوفته ولی ما میخواستم این درخواستها بین ریجنها هم میسر بشه!
پس باید DSL رو بهبود میدادیم. ممکنه براتون سوال پیش بیاد مگه همه اینکارهارو نوا نمیکنه پس DSL همون نوا هست! و جوابش اینه که nova خیلی کار میکنه و یکی از کارهاش کاریه که DSL براش میکنه و از اونجایی که متن بازه میشه تغییرش داد!

برای قدم اول یکی از هم تیمیهامون دسترسی پیدا کرد به Oath و تونست این کامپوننت رو جوری برای ما تغییر بده که علاوه بر ریکوئست به ریجن ۱ به ریجن ۲ هم ریکوئست بده و از سطح دسترسی یوز در هر دو ریجن مطمئن بشه که البته به نظرم کار عبثی بود چون به هر حال میشد این مکانیزم رو هین توسعه دور زد به هر حال باید به پروژه اصلی ملحق میشد.

من شخصا جزو تیم دیپلویمنت بودم و به کمک دوست جدید و بسیار خوبم الویس(فقط اسمش الویسه وگرنه خودش سیه چرده، چقر و بد‌بدنه :-دی‌) تونیستم طی چند ساعت دو ریجن با استفاده از کولا که کانتینر منیجر قدرتمند اوپن‌استک هست رو دیپلوی کنیم. چون برای مدیرتشون هم میخواستیم از انسیبل استفاده کنیم کولااسنیبل(Kolla-Ansible) رو استفاده کردیم.
یه چند بار هم با enos یه پروژه متن باز دیگه که خارج کامپوننتهای اصلی اپن‌استک هست آزمون و خطا کردیم و کلی چیزهای دیگه.

یه تیم دیگه که مشغول نوشتن HA پراکسی بود تصمیم گرفته بود که زیرپروژه خودش رو جدا کنه.

من هم بعد از تمون شدم کارم(تسک من تمام شد یه صبح تا بعد از ظهر) به این تیم پیوستم تا یکم چیز یاد بگیرم و دستم توی کدزدن روان تر بشه. کاری که داشتن میکردن با استفاده از لایبرری معروف request ریکوئستهای http میساختن و مثل یه کرل معمولی از نوع POST به سمت ha پراکسی یه دیکشنری میفرستادن. داخلی این دیکشنری چندتا کی‌ولیو(Key Value) بیشتر وجود نداشت که شامل مثلا یوزر ! اسم ایمیج و ریجن بود! میتونم مطمئن باشم که خود اوپن‌استک هم یه مکانیزم شبیه این استفاده میکنه. Haproxy باید این دیکشنری رو اول پارس میکرد و اگه مقدار از کلیِد ریجن برابر ۱ بود به haproxy ریجن ۱ یه ریکوئست معمولی میزد و اگه برابر ۲ بوده به ریجن ۲ ریکوئست معمولی میزد. برای اینکه گیچ نشید ما الان سه تا haproxy داریم. یکی که داریم مینوسیمش و دوتا که همراه اوپن‌استک هست و داره ازشون استفاده میکنه. خوب این پروژه هم تقریبا زود تمام شده و به یه جاهایی خوب و قابل قبولی رسید. اما موقع به هم وصل کردنشون دیگه وقتی به اندازه کافی نبود.

تیکه سخت ماجرا که طی هکتون براش راه حلی پیدا نشده بود اونجایی بود که باید رویکوئستهایی که از نوا ریجن ۱ به haproxy که ما میخواستم فرستاده بشه بجای haproxy اصلی و برعکس بعد پارس شدن یه ریکوئست شبیه اونی که nova میفرسته به haproxy اصلی از ریجن ۲ فرستاده بشه. برای این کار باید با dump ریکوستهای اوپن‌استک رو چک میکردیم و این کلی زمان برد و به اینجا رسیدیم که همه ۷ نفر اعضای گروه مشغول حل کردن این مسئله بودن و هر کسی به نحوی سعی میکرد به جواب برسه. راستش ما تقریبا هیچ کاری نکرده بودیم و این یکم بد بود بخاطر اینکه نتیجه گرفتن حین پروژه خیلی به اخذ آرا کمک میکنه!

و اینجا بود که یه نفر ۱۰ دقیقه مونده بود به پایان هکتون به نتیجه رسید البته دیگه وقتی برای نوشتن بقیه کد نمونده بود.پس تصمیم گرفتیم برای POC یه نمونه اولیه درست کنیم و هنگام مراسم معارفه توضیح بدیم که وقت کم آوردیم ولی مطمئنیم که نتیجه گرفتیم و این هم برای اثباتش. راستش من اینقدر خوشحال بودم که اصلن برد و باختش دیگه برام اهمیتی نداشت.

موقع معارفه شد هر کدوم از ما بخشی از پروژه رو معرفی کرد و بقیه تیمها هم به همین شکل. موقع رای‌گیری تقریبا مطمئن بودم که تمام شده و ما اول نمیشم. به این خاطر که دو رقیت خیلی خوب داشتیم. رقیب اول که با استفاده میکروسرویسها ۵۰۰ تا تننت فعال روی رزبری‌پای درآورده بود و دومی یه تیم دیگه که روی IoT و منزل هوشمند کار کرده بود و پروژش رو هم تمام کرده بود و همین تیم و تیم ما مشترکا اول شد. اسپانسرهای رفتند و اومدند و جایزه ها رو آماده کردند. معمولا جایزه ها چند هزار دولاره ولی این بار با کمال ناباوری به اون تیم یکسال خدمان رایگان نسل پنجم و رزبری‌پای هدیه دادند و به تیم ما هم جایزه ورود رایگان به رویداد اوپن استک. رویدادی که اسپانسرهاش RedHat, Ubuntu, Intel, IBM, Cisco و کل شرکت ریز و درشت دیگه بودند. و به ما دسترسی پلاتینیوم داده بودند یعنی اینکه میتونستیم با اسپانسرها دیدار خصوصی داشته باشیم. در صورت نیاز از اتاق کنفرانس استفاده کنیم و کلی چیز دیگه. فکر کنم اگه میخواستم خودم این هزینه را پرداخت کنم باید ۱۵۰۰ تا ۲۰۰۰ دلار پول میدادم.بسیار خوشحالم از اینکه این فرصت بهم رسید و باور نمیکنید چه قدر این رویداد بزرگه. تقریبا رویایی که به حقیقت پیسوت و من واقعا خواب همچین روزهایی رو دیده بودم.

توی پست بعدیم براتون از اتفاقات، اخبار و کلی چیز هیجان انگیز دیگه از رویداد اوپن‌استک میگم.

Hackathon, اوپن استک


دیدگاه‌ها

پاسخی بگذارید

%d وب‌نوشت‌نویس این را دوست دارند: