کوبرنتیز (Kubernetes) یک پلتفرم قابل حمل (portable)، گسترده و منبع باز (open-source) برای مدیریت بار و سرویس های کانتینر است که configuration declarative و automation را آسان میکند. کوبرنتیز (Kubernetes) دارای یک اکوسیستم بزرگ و در حال رشدی است که سرویس های مختلف، پشتیبانی از سیستم های متنوع و ابزارهایی را به شکل وسیعی در دسترس ما قرار میدهد.
در این مقاله قصد داریم تا با قبلیت های متنوع و کاربردی کوبرنتیز ، آشنا شویم.
کوبرنتیز نامی یونانی است که به معنای کلاه ایمنی یا خلبان میباشد. گوگل پروژه Kubernetes را در سال 2014 باز کرد و به عبارتی حاصل 15 سال تجربه کاری گوگل در زمینه مدیریت workloads میباشد.
کوبرنتیز از گذشته تاکنون
در وهلهی اول، به گذشته میرویم تا به صورت مقطعی تحولات را مورد بررسی قرار دهیم.
عصر ابزارهای سنتی: سازمانها، اپلیکیشن ها را روی سرورهای فیزیکی اجرا میکردند و از این رو، هیچ راهی برای تعیین مرزهای منابع (Resource Boundaries) برای هر یک از برنامه ها در یک سرور فیزیکی وجود نداشت. این مسئله باعث ایجاد مشکلاتی در زمینه تخصیص منابع میشد. به عنوان مثال، اگر چندین برنامه بر روی سرور فیزیکی اجرا شوند، ممکن است یک اپلیکیشن منابع بیشتری را به خود اختصاص میهد در حالیکه دیگر برنامه ها از منابع بی بهره بودند و در نتیجه بازدهی لازم را نداشتند . تنها راه حلی که وجود داشت این بود که هر برنامه بر روی سرور فیزیکی متفاوتی اجرا شود اما به دلیل کمبود منابع، این راهکار مقرون به صرفه نبود و سازمان ها را متحمل پرداخت هزینه های هنگفتی مینمود.
عصر استقرار مجازی سازی: مجازی سازی (Virtualization) به عنوان راهکاری معرفی شد تا ما بتوانیم چندین ماشین مجازی (VM) را روی یک پردازنده سرور فیزیکی مستقل اجرا نماییم. همچنین مجازی سازی این امکان را به ما ارائه مینماید تا اپلیکیشن ها بین VM جدا شوند تا سطح امنیتی برای حفاظت از داده های برنامه ها فراهم شود.
مجازی سازی نه تنها امکان استفاده بهتر و بهینه تر از منابع در یک سرور فیزیکی را فراهم می کند بلکه، مقیاس پذیری مناسب تری را نیز ارائه میدهد. از طریق این روش میتوانیم اپلیکیشن ها را به راحتی اضافه و یا به روز نماییم و هزینه های سخت افزاری را به میزان قابل توجهی کاهش دهیم. همچنین با مجازی سازی می توان مجموعه ای از منابع فیزیکی را به عنوان cluster از ماشین های مجازی disposable ارائه داد.
هر VM یک دستگاه کاملی است که تمامی اجزای آن، از جمله سیستم عامل، در بالای سخت افزار مجازی (Virtualized Hardware) کار میکنند.
عصر استقرار Container: کانتینرها شباهت بسیاری به VMها دارند، اما آن ها دارای ویژگی هایی مانند relaxed isolation برای share کردن سیستم عامل (OS) در میان اپلیکیشن ها هستند. بنابراین، container سیستمی سبک شناخته میشود که همانند ماشین مجازی filesystem، CPU، مموری، فضای پردازش و موارد خاص خود را نیز به همراه دارد. کوبرنتیز در میان clouds و OS Distribution قابل حمل (portable) میباشد.
Container مزایای دیگری را نیز ارائه میدهد که در ادامه به توضیح آن ها خواهیم پرداخت.
مزایای Container
ایجاد و استقرار سریع نرم افزار: افزایش سهولت و کارآیی در ایجاد container image نسبت به استفاده از VM Image.
توسعه، ادغام و استقرار پایدار container، امکان ایجاد container image قابل اعتماد و مطمئنی را با استفاده از rollbacks (به دلیل تغییر ناپذیری image) فراهم میکند.
Dev and Ops separation of concerns: به جای صرف زمانی برای deployment، میتوان container image برنامه ها را در زمان ساخت یا منتشر نمودن ایجاد کنید و از این طریق میتوان اپلیکیشن ها را از زیرساخت ها (Infrastructure) جدا نمایید.
نه تنها اطلاعات و metrics سطح OS قابل مشاهده است، بلکه وضعیت اپلیکیشن و سیگنال ها را نیز میتوان مانتیور نمود.
سازگاری کامل محیط در روند توسعه، آزمایش و تولید: کانتینر در تمامی محیط ها به یک شکل پیاده سازی میشود. یعنی، همانگونه که میتوان آن را در فضای ابری اجرا و پیاده سازی نمود، در سیستم های مختلفی همانند لپ تاپ نیز به همان شکل اجرا خواهد شد.
امکان توزیع فضای cloud و سیستم عامل (OS): میتوان در Ubuntu، RHEL، CoreOS، Cloud های عمومی بزرگ و دیگر موارد به راحتی run شود.
مدیریت برنامه محور (Application-Centric): به جای آنکه لایه انتزاعی (Abstraction Level) روی یک سیستم عامل در سخت افزار فیزیکی باشد، روی سیستم عاملی وجود خواهد داشت که منابع مجازی داشته باشد.
میکرو سرویس های آزاد، elastic و توزیع پذیر که امکان برقرای اتصال آزاد را ارائه میدهند: از طریق کانتینر، اپلیکیشن ها به تکه های کوچک و مستقل از هم تبدیل میشوند و میتوان آنها را به شکلی پویا مدیریت و اجرا کرد.
ایزوله نمودن منابع: با Resources Isolation میتوان عملکرد هر اپلیکیشن را پیش بینی نمود تا تصمیمات اساسی و مهم به راحتی اتخاذ شوند.
بهره برداری از منابع به شکل بهینه: که با استفاده از آن، عملکردی اثربخش و مطلوبی را ارائه میدهد.
چرا به کوبرنتیز نیاز داریم و چه کاربردی برای ما به همراه دارد؟
Container ها روشی مناسب برای دسته بندی اپلیکیشن ها و اجرای آن ها هستند. در یک production environment، شما باید container هایی که برنامه ها را اجرا میکنند، مانیتور نمایید تا از عدم وجود خرابی یا downtime در آن ها اطمینان حاصل کنید. به عنوان مثال، اگر یک کانتینر از کار بیفتد، به کانتینر دیگری نیاز خواهیم داشت تا اجرا شود. این درحالی است که، اگر ما بخواهیم این روند را توسط یک سیستم انجام دهیم به شکل ساده تر و آسان تری میتوان را اجرا نماییم.
کوبرنتیز تکنولوژی است که در چنین موقعیت هایی ما به آن نیاز خواهیم داشت تا بتواند چنین عملیاتی را انجام دهد. کوبرنتیز یک چارچوبی را برای اجرای سیستم های توزیع شده (distributed) به شکل منعطف در اختیار ما میگذارد. این تکنولوژی از scaling و failover اپلیکیشن مراقبت می کند و الگوهای استقرار (deployment patterns) را ارائه میدهد تا در کنار آن بتواند canary deployment را برای سیستم شما مدیریت کند.
کوبرنتیز ارائه دهنده قابلیت های متنوعی است که عبارتند از:
Service Discovery و Load Balancing
با کوبرنتیز می توانیم یک container را با استفاده از Name DNS یا IP address ، نمایش دهیم. اگر ترافیک به یک کانتینر زیاد باشد، کوبرنتیز قادر است Load Balancing را انجام دهد و ترافیک شبکه را توزیع کند تا استقرار پایدار و stable باشد.
Storage Orchestration
کوبرنتیز به شما این امکان را می دهد تا به طور خودکار سیستم ذخیره سازی مورد نظر خود را مانند Local Storages، Public Cloud Providers و موارد دیگر را نصب نمایید.
Automated Rollbacks and Rollouts
می توان با استفاده از کوبرنتیز وضعیت مورد نظر برای container مستقر شده را توصیف نمود و وضعیت واقعی را به صورت دلخواه تغییر داد. همچنین می توانیم کوبرنتیز را طوری تنظیم نماییم تا container جدیدی را برای استقرار ایجاد کند، container های موجود را حذف نماید و منابع آن ها را به container جدید اختصاص دهد.
Automated Bin Packing
شما به کوبرنتیز یک کلاستری از نودها را میدهید تا بتواند از طریق آن، containerized tasks را انجام دهد. همچنین میتوان به کوبرنتیز دستورات مختلفی را بدهید تا هر container چه مقدار CPU و حافظه (RAM) نیاز داشته باشد. این تکنولوژی نوین میتواند containerها را بر روی node ها قرار دهد تا از منابع به بهترین شکل استفاده شود.
Self-Healing
کوبرنتیز containerهای fail شده را مجدداً راه اندازی می کند، container ها را جایگزین می کند و container هایی را که به درستی کار نمیکنند را خاموش مینماید.
Secret and Configuration Management
کوبرنتیز این امکان را می دهد تا اطلاعات مهمی مانند passwords، tokens OAuth و SSH keys ذخیره و مدیریت شوند. می توان کانفیگ های برنامه ها را که مهم و سری هستند، بدون بازسازی container images مستقر و update نمایید.
نتیجه گیری
1.کوبرنتیز یک سیستم PaaS (Platform as a Service) سنتی و all-inclusive نیست. از آنجا که کوبرنتیز در سطح container کار میکند و نه در سطح سخت افزار، برخی از ویژگی های کلی را که همانند offering PaaS هستند ارائه میدهد مانند deployment، مقیاس پذیری، Load Balancing و ... و همچنین به کاربران این اجازه را میدهد تا راهکارهایlogging ، مانیتورینگ و alerting خود را یکپارچه کنند. با این حال، کوبرنتیز یکپارچه نیست و این راهکارها پیش فرض، optional و pluggable هستند.
2.کوبرنتیز building blocks را برای ساخت پلتفرم های توسعه دهندگان فراهم میکند، اما user choice و user flexibility را در جایی که مهم و حیاتی است حفظ مینماید.
3.اپلیکیشن هایی که ساپورت میشوند را محدود نمیکند و از انواع workloads، مانند stateless، stateful و data-processing پشتیبانی میکند. میتوان این نتیجه گیری را داشته باشیم که اگر یک اپلیکیشن بتواند در یک container اجرا شود، پس بر روی کوبرنتیز به خوبی اجرا خواهد شد.
4.کوبرنتیز Source code را deploy نمی کند. ادغام، تحویل و استقرار مداوم (Continuous Integration, Continuous Delivery, Continuous Deployment) workflows به عنوان الزامات فنی و فرهنگ های سازمانی است که باید رعایت شوند.
5.کوبرنتیز سرویس های application-level، مانند middleware (message buses)، data processing frameworks (Spark)، پایگاه های داده (MySQL)، caches و سیستم های cluster storage (Ceph) را ارائه نمی دهد. این کامپوننت ها می توانند روی کوبرنتیز اجرا شوند و یا از طریق مکانیسم های portable (مانند Open Service Broker)، به برنامه هایی که روی کوبرنتیز در حال اجرا هستند، دسترسی کاملی داشته باشید.
6.کوبرنتیز راهکارهای logging، monitoring و alerting را dictate نمی کند و برخی از integrationها را به عنوان proof of concept و مکانیسم هایی جهت جمع آوری و export، metrics فراهم مینماید.
7.کوبرنتیز نمیتواند زبان / سیستم configuration (Jsonnet) را ارائه دهد. اما declarative API را ارائه می دهد که ممکن است به اشکال مختلفی از خصوصیات declarative، از آن استفاده شود.
8.هیچگونه machine configuration جامع، maintenance، مدیریت و یا سیستم های self-healing را ارائه نمی دهد و اتخاذ نمیکند. علاوه بر این، کوبرنتیز صرفا یک سیستم orchestration نیست. در حقیقت، این سیستم نیاز به orchestration را برطرف می کند. اگر بخواهیم تعریف فنی از orchestration داشته باشیم، اجرای یک گردش کار (workflow) خواهد بود: یعنی ابتدا تسک A، سپس B و در نهایت تسک C را انجام میدهد. در مقابل، کوبرنتیز شامل مجموعه ای از فرآیندهای کنترل مستقل و composable است که بطور مداوم وضعیت فعلی (current state) را به حالت مورد نظر (desired state) تغییر میدهد. فرقی ندارد که چگونه از A به C میخواهیم برویم یا حتی لزومی بر استفاده از کنترل متمرکز(centralized control) داشته باشیم، کوبرنتیز این کارها را برای ما انجام میدهد!
تمامی این موارد منجر به ایجاد سیستمی می شود که از آن به عنوان کوبرنتیز نام برده میشود و استفاده از آن ساده تر و قدرتمندتر بوده و در شرایط و موقعیت های گوناگون به میزان قابل توجهی مقاوم است.