فناوری مجازی سازی یا Virtualizationبا فراهم کردن امکان اجرا شدن سیستم عامل های مختلف و برنامه های کاربردی با نیازمندی و وابستگی های گوناگون بر روی سرورها، بازدهی دیتاسنتر ها را تا حد زیادی افزایش داده است. تمرکز مجازی سازی همواره بر یکپارچه سازی سرورها ست که خود نیازمند جدا سازی سیستم عامل از سخت افزار است. در این شرایط سیستم عامل ها بدون وابستگی به سخت افزار در یک لایه مجزا شده اجرا می شوند و عمل می کنند. بدین ترتیب برنامه های کاربردی که بر روی آن سیستم عامل ها اجرا شده اند هم مجزا از سخت افزار کار خواهند کرد. Kubernetes یک ابزار متن باز سامان دهی Container است که بسیاری از کارهای لازم برای پیاده سازی، مدیریت و مقیاس دهی برنامه های مبتنی بر Container را به شکل خودکار انجام می دهد. به بیان دیگر، کاربر با کلاستر کردن ماشین های اجراکننده Container و استفاده از Kubernetes میتواند این کلاسترها را به سادگی و با بهره وری بالا مدیریت کند.
نام Kubernetes از زبان یونانی آمده است و به معنی سکان دار یا پیشرو است. K8s به عنوان یک مخفف از شمردن هشت حرف بین K و S ساخته شده است. بیش از 15 سال از تجربه ی گوگل در تولید بارهای کاری در مقیاس مناسب را با بهترین ایده ها و راهکارها از سوی جامعه ترکیب می کند. Kubernetes یک ابزار هماهنگ سازی برای کانتینر و برنامه ها است که به کاربران امکان می دهد این هماهنگ سازی را نسبت به سایر ابزارهای قدیمی با کارایی بیشتری انجام دهند. گوگل در طی همکاری و مشارکت با بنیاد لینوکس، بنیاد رایانش ابری Cloud (CNCF) را تشکیل داد که Kubernetes را میزبانی می کند.
در ابتدا، سازمان ها برنامه های کاربردی را روی سرورهای فیزیکی اجرا می کردند. هیچ راهی برای تعریف محدودیت منابع برای برنامه های کاربردی روی یک سرور فیزیکی وجود نداشت و همین امر موجب مشکلاتی در تخصیص منابع شد. مثلاً اگر چندین برنامه کاربردی روی یک سرور فیزیکی اجرا شوند، ممکن است Instance هایی وجود داشته باشد که یک برنامه کاربردی اکثر منابع را اشغال کند و در نتیجه، عملکرد برنامه های کاربردی دیگر دچار مشکل شود. یکی از راهکارها برای حل این مشکل این است که هر برنامه کاربردی روی یک سرور فیزیکی متفاوت اجرا گردد. اما این راهکار مقیاس پذیر نیست، زیرا به حد کافی از منابع استفاده نمی شود و نگهداری چند سرور فیزیکی برای سازمان ها پرهزینه است.
مجازی سازی به عنوان یک راهکار مطرح شد. این راهکار به کاربران اجازه می دهد که چندین ماشین مجازی یا VM را روی CPU یک سرور فیزیکی واحد اجرا کنند. مجازی سازی به برنامه های کاربردی این امکان را می دهد که بین VM ها جداسازی شوند و سطحی از امنیت را فراهم می کند، زیرا اطلاعات یک برنامه کاربردی نمی تواند آزادانه مورد دسترسی برنامه کاربردی دیگری قرار بگیرد. مجازی سازی امکان استفاده ی بهتر از منابع را در یک سرور فیزیکی فراهم می کند و امکان مقیاس پذیری بالاتری را نیز ایجاد می کند، زیرا یک برنامه کاربردی به سادگی اضافه یا بروزرسانی می گردد، هزینه ی سخت افزار کاهش می یابد و مزایای بسیار بیشتری نیز وجود دارد. با مجازی سازی، می توان مجموعه ای از منابع فیزیکی را به عنوان کلاستری از ماشین های مجازی ارائه داد که امکان کنار گذاشتن آن ها وجود دارد. هر VM یک ماشین کامل است که تمام اجزا، از جمله سیستم عامل خودش را روی سیستم مجازی سازی شده اجرا می کند.
در پاسخ به این که چرا میبایست از آن استفاده نمود ،میبایست خاطر نشان شد که یکی از بزرگ ترین چالش ها برای مشاغلی که از روش های DevOps و قابلیت های ابری استفاده می کنند، حفظ محیط های مشترک و سازگار در طول چرخه حیات برنامه است. کانتینرها در زمینه پکیجینگ تمام وابستگی های ضروری در تصاویر گسسته، مشکل قابل حمل بودن برنامه را برطرف کردند. بنابراین سازگاری را در بین سیستم عامل های ابر و معماری های میکرو سرویس ها حفظ میکنند. کاربران IT و تجاری می توانند با بکارگیری کانتینرها و Kubernetes تلاش خود را به جای زیرساخت ها، بر توسعه برنامه ها متمرکز کنند.
Kubernetes به کاربران اجازه میدهد، برای اجرای برنامه بهترین مکان را براساس نیازهای تجاری خود انتخاب کنند. مقیاس و میزان دسترسی به ابر عمومی، برای برخی از برنامه ها عامل تعیین کننده ای خواهد بود. برای برنامه های دیگر عواملی مانند محل داده، امنیت یا سایر موارد مهم، نیازمند استقرار در محل هستند. راه حل های متداول میتوانند پیچیده باشند و تیم ها را مجبور کنند با صرف وقت و هزینه، تمام قطعات را بهم بچسبانند. این موضوع با هدایت کاربران در جهت انتخاب بین ارائه دهندگان ابر داخلی و عمومی، میتواند تصمیم گیری و انتخاب را برای آنها آسان تر کند. یک راه حل مدیریت کانتینر میتواند بر این چالش ها غلبه کند.
Kubernetes امکانات زیادی ارائه میدهد که در زیر به تعدادی از آن ها پرداخته ایم:
• اجرا و مدیریت کانتینرها
• خودکارسازی و مقیاس گذاری
• استقرار و گسترش برنامه های stateless و stateful
• ایجاد و پیکربندی ورودی ها
• مدیریت سلامت برنامه، کشف سرویس، مقیاس گذاری خودکار و متعادل سازی بار
بطور کلی شیوه کار آن به این صورت است که یک یا چند سرور به عنوان Master انتخاب میشوند و وظایف پردازشی و مدیریتی کلاستر را به عهده میگیرند، وظایفی مانند ارایه ی API برای کاربران، بررسی سلامت دیگر سرورها، تقسیم بار کاری و سامان دهی ارتباط بین اجزای مختلف. در مجموع Master به عنوان نقطه ی اصلی ارتباط با کلاستر شناخته میشود و منطق مرکزی Kubernetes را به عهده میگیرد. سایر ماشین ها در کلاستر به عنوان Node شناخته میشوند، سرورهایی که مسئول پذیرفتن بار کاری هستند و آنها را با منابع محلی و خارجی اجرا می کنند. برای رعایت ایزوله سازی، انعطاف و مدیریت،Kubernetes برنامه و سرویس ها را در Container اجرا می کند. معمولاً از داکر برای این کار استفاده میشود. هر Node، از Master دستورهای ایجاد و حذف Container را دریافت و دستورات لازم شبکه را برای جابجایی ترافیک مربوط به آن تنظیم میکند.
کاربران از طریق API تعریف شده توسط Master با کلاستر ارتباط می گیرند و برای شروع یک برنامه یا سرویس، یک نقشه ی توصیفی در قالب فایل YAML به کلاستر ارسال می کنند. این فایل نشان میدهد برنامه چگونه ایجاد و مدیریت میشود. سپس Master با توجه به نیازمندی کاربر و شرایط فعلی سیستم، تصمیم میگیرد که برنامه را چگونه روی زیرساخت موجود اجرا کند.
اگرچه کانتینر سازوکار پایه برای پیاده سازی برنامه ها در کوبرنتیز است، اما برای مقیاس پذیری و مدیریت بهتر از یک لایه ی دیگر نیز بر روی آن استفاده میشود. به این ترتیب کاربران به جای تعامل مستقیم با کانتینر، از عناصری که Kubernetes ارایه میدهد، استفاده میکنند. یکی از مهمترین انواع این عناصر،Pod است.
مستر نود یا نودها به عنوان مغز خوشه، همه فعالیت ها را تعیین میکند. فعالیت هایی مانند:
• تعیین میکند کدام pod روی کدام worker node اجرا خواهد شد.
• حالت مطلوب برنامه ها را حفظ میکند.
• برنامه ها را مقیاس بندی میکند.
• به روزرسانی های جدید را ارائه می دهد.
کانتینر به شکل مستقیم به ماشین متصل نمی شود، بلکه یک یا چند کانتینر که در کنار هم قرار دارند در داخل یک Pod کپسوله میشوند. در عمل،Pod یک یا چند کانتینر را شامل میشود که باید به عنوان یک برنامه کنترل شوند. پادها به عنوان یک واحد مستقل مدیریت میشوند و محیط و فضای IP شان را با یکدیگر به اشتراک میگذارند. معمولاً Pod شامل یک کانتینر اصلی و تعدادی کانتینر کمکی است. برای مثال یک Pod ممکن است شامل یک کانتینر باشد که برنامه اصلی را اجرا میکند و یک کانتینر کمکی که فایل ها را در یک فایل سیستم اشتراکی ذخیره میکند. برای افزایش مقیاس یک برنامه از Replication Controller استفاده میشود. با این ابزار میتوان قالب های Pod را شخصی سازی کرد تا نسخه های یکسانی از Pod داشته باشیم و بتوانیم تعداد نسخه های در حال اجرا را کم و زیاد کنیم. همچنین Replication Controller به شکل خودکار اطمینان حاصل می کند که تعداد Pod های پیاده شده با آنچه در فایل پیکربندی مشخص شده است، هم خوانی داشته باشد. یکی از مواردی که کاربر به شکل مستقیم میتواند با کوبرنتیز برای اجرای برنامه ایجاد و مدیریت کند Deployment نام دارد که از Pod و Replication Controller استفاده کرده ولی سختی کار با آنها را از کاربر پنهان می کند.
مزایای Kubernetes
1. کشف سرویس و تعدیل بار: Kubernetes میتواند با استفاده از نام DNS یا آدرس IP خودش یک Container را در معرض افشا قرار دهد. اگر ترافیک به یک Container بالا باشد،Kubernetes میتواند تعدیل بار کند و ترافیک شبکه را توزیع نماید تا پیاده سازی باثبات گردد.
2. تنظیم Storage:
Kubernetes امکان Mount کردن یک سیستم Storage ، ارائه دهنده های Cloud عمومی و غیره را به طور خودکار فراهم می نماید.
3. Rollout ها و Rollback های خودکارسازی شده: میتوان با استفاده از Kubernetes وضعیت مطلوب خود را برای Container های پیاده سازی شده توصیف کرد و این امر می تواند با سرعتی کنترل شده وضعیت را به وضعیت مطلوب تبدیل کند. بطور مثال میتوان Kubernetes را خودکارسازی کرد تا Container های جدیدی برای پیاده سازی ایجاد شوند ،Container های موجود حذف شوند و منابع آنها با Container جدید تطبیق پیدا کند.
4. خودکارسازی Bin Packing: برای Kubernetes کلاستری از Node ها فراهم می شود که میتواند با استفاده از آنها Taskهای Containerize شده را اجرا کند. به Kubernetes گفته می شود که هر Container چقدر به CPU و حافظه یا رم نیاز دارد. کابرنتس ها می تواند Container ها را در Node ها جا دهد تا بهترین استفاده از منابع انجام گردد.
5. خودترمیمی: Kubernetes می تواند Container هایی که دچار قطعی می شوند را Restart کند، Container ها را جایگزین کند، Container هایی که به برررسی های سلامت تعریف شده توسط کاربر پاسخ نمی دهند را از بین ببرد و تا زمانی که آماده ی خدمت رسانی شوند آن ها را برای Client ها تبلیغ نمی کند.
6. مدیریت پیکربندی و رمز: Kubernetes به کاربران این توانایی را می دهد که اطلاعات حساسی مثل رمزهای عبور Tokenهای OAuth و Key های SSH را ذخیره و مدیریت کنند. می توان بدون بازسازی Container Image ها و بدون افشای رازها در پیکربندی Stack، رمزها و پیکربندی برنامه کاربردی را پیاده سازی و بروزرسانی کرد.