با توجه به اشتیاقی که در زمینه کانتینرها در جهان وجود دارد لازم است ابتدا شناخت مناسبی نسبت به container ها داشته باشیم، سوالی که مطرح می شود این است که container چیست. معمولا زمانی که سازمان ها درباره Digital Transformation سخن می گویند یکی از اصلی ترین سرفصلها یی که مورد اشاره قرار می گیرد، موضوع انتقال زیرساخت از bare metal به cloud یا hybrid cloud، مهاجرت از ساختار Monolith به Microservice و تغییر ساختار تولید محصولات از آبشاری به Agile و Continuous Deployment می باشد.
جهت مشاهده مطالب و دوره های آموزشی Kubernetes به بخش آموزش Kubernetes مراجعه بفرمایید.
توجه اصلی سازمان باید نتیجه یا outcome باشد، آیا پیاده سازی این تکنولوژی ها باعث افزایش سرعت و چابکی و کنترل شده است؟ وقتی درباره سرعت صحبت می کنیم یعنی ایده های جدید بتوانند به سرعت توسعه داده شوند، وقتی درباره چابکی صحبت می کنیم یعنی به روز رسانی ها و تغییرات می توانند ساده تر پیاده سازی شوند و امکان تست تجربیات جدید را فراهم می نمایند و وقتی درباره کنترل صحبت می نماییم یعنی تغییر تنظیمات، ریسک و باگ ها بتوانند با سرعت بیشتری برطرف گردند.
نیاز به روش های سریعتری جهت توسعه محصولات فناوری اطلاعات، باعث ایجاد نیاز به روش های جدیدی جهت integration گردیده است. نیاز به Agile بودن و مقیاس پذیر بودن بر بستر یک یا چندین ابر و بلاخره امکان iterateنمودن سریع و بهینه. همانطور که در تصویر زیر مشخص است ساختار قدیمی در سمت چپ قابلیت ارائه نیازمندی های مطرح شده را نداشته و معماری های جدید توسعه نیازمند ساختار جدید هستند که البته نیازمند تغییرات فرهنگی زیادی در سازمان هستند.
Container ها چیستند؟
جواب این سوال به تخصص فردی که این سوال از آن پرسیده می شود باز می گردد، اگر از متخصصات زیرساخت سوال شود پاسخ اجرای اپلیکیشن ها بر روی یک هسته سیستم عامل به اشتراک گذاشته شده، راهکاری ساده تر و سبک تر و متمرکز تر از VM ها و قابل انتقال بودن به محیطهای مختلف جز پاسخ های آنها خواهد بود. جواب این سوال از نظر متخصصان توسعه نرم افزار امکان پکیج نمودن اپلیکیشن ها با تمامی وابستگی های آنها، دپلوی به هر محیطی در مدت زمان چند ثانیه و دسترسی و به اشتراک گذاری آسان جز مشخصات این راهکار خواهد بود.
فارغ از وجود این دو دیدگاه، سازمان ها در گذشته معمولا چندین محصول را بر روی یک vm به صورت co-located نصب می نمودند که علت این موضوع افزایش هزینه و سربار نگهداری در صورت اضافه نمودن vm های جدید است، در حالی که vm ها به صورت کامل از یکدیگر جدا هستند، اپلیکیشن ها هیچگونه جداسازی از یکدیگر ندارند و عملکرد یکی از آنها می تواند تاثیر مستقیمی بر عملکرد سایرین داشته باشد. در سمت دیگر کانتینرها با کمک تکنولوژی های جداسازی مثل Namespace ها و Cgroup می توانند اپلیکیشن را هم از سیستم عامل اصلی و هم از یکدیگر جدا نموده و محیطی کاملا ایزوله را برای اپلیکیشن فراهم نمایند.
vm ها جهت مجازی سازی سخت افزارها مورد استفاده قرار گرفتند و container ها جهت مجازی سازی process های اپلیکیشن ها
بررسی مزایا و معایب این دو روش بیانگر این موضوع است که گرچه اجرای هر اپلیکیشن در یک vm مجزا امکان پذیر است ولی از نظر منابع مورد نیاز قابل پیاده سازی نمی باشد و میزان استفاده سیستم عامل از منابع سیستم از برنامه پیشی خواهد گرفت. در آن سو با استفاده از تکنولوژی هایی که قبلا بیان شد و با توجه به اینکه این تکنولوژی ها سالها در شرکت هایی مثل گوگل مورد استفاده قرار گرفته اند قابل اعتماد هستند، در نتیجه چابکی که توسط کانتینرها ارائه می شود حتی قابل مقایسه با vm ها نبوده و سطح جدیدی از امکانات را در اختیار سازمان ها قرار می دهد.
در سال های گذشته قبول DevOps در سازمان ها بسیار افزایش داشته و این امر اتفاقی نبوده است، container ها نقش مهمی در پیاده سازی واقعی DevOps در سازمان ها بدون وجود مشکلات مرتبط با vm برعهده داشته اند، عدم وجود سطح مشخصی از مالکیت در vm ها باعث ایجاد فرآیندهای پیچیده و وجودی اهدافی متناقض برای تیم های مختلف شده بود، تیم توسعه اجازه اتصال به سرورها های عملیاتی را نداشت زیرا مسئولیت نگهداری vm ها با تیم operation بود در حالی که تغییرات متعلق به تیم توسعه بود. در طرف دیگر Container ها امکان جداسازی نیازمندی های تیم توسعه و زیرسخت را فراهم می نمایند، تیم توسعه فقط نیاز است نگران توسعه اپلیکیشن باشد و تیم Operation نیاز است نگران هاست کانتینر و زیرساخت باشد.
Kubernetes چیست؟
مدیریت تعداد بالای کانتینرها مشکلات جدیدی را پیش روی سازمانها قرارداده است، طول عمر کانتینرها بسیار کمتر از vm ها است و استفاده بهینه تری از منابع را فراهم می نماید، تکنولوژی های مرتبط با کانتینرها باید تعداد بیشتری از اشیا را مدیریت نمایند که باعث معرفی مفاهیمی مثل Automated policy جهت مدیریت بهینه تر اشیا گردید.
تیم ها برای orchestrate محیطهای مختلف مثل تست و preproduction به kubernetes روی آوردند. در حال حاضر kubernetes به عنوان استاندارد Container Orchestration management مطرح بوده و به پلتفرمی حیاتی تبدیل شده است و نیاز است سازمان ها درک صحیحی از آن داشته باشند. Kubernetes چیست؟
جهت شناخت علت وجود kubernetes نیاز است در ابتدا این سوال مطرح شود که شما چگونه کانتینرهای خود را مدیریت خواهید نمود؟
- چگونه تنظیمات، service discovery و resource scaling مدیریت خواهید نمود؟
- از کجا cluster خود را مدیریت خواهید نمود؟
- چگونه اپلیکیشن را به روز خواهید نمود؟
- چگونه زیرساخت کلاستر خود را به روز خواهید نمود؟
- چگونه اپلیکیشن پیچیده خود را به شکل ساده تری مدیریت خواهید نمود؟
هر اپلیکیشن به شکل جداگانه ایی در یک کانتینر اجرا خواهد شد و این موضوع باعث کاهش چرخه طول زندگی اپلیکیشن خواهد شد، همچنین شما نیازمند مدیریت نحوه ارتباط هر کانتینر با سایر کانتینرها هستید و بسیاری مورد دیگر. مدیریت کانتینرها موضوعی است پیچیده و معمولا کلاسترها شامل بیش از ۲۰۰ کانتینر هستند و به روز رسانی آنها بدون استفاده از automation غیر ممکن است. kubernetes ارائه دهنده زیرساخت container orchestration با خودکارسازی یکپارچه سازی container ها است، به شکل خلاصه کوبرنیتیز باعث ساده سازی scale شدن کانتینرها و اختصاص منابع می گردد. به توضیح خلاصه کوبرنیتز به شرح زیر است.
- قابلیت جابجا شدن اپلیکیشن بر روی زیرساخت های مختلف ابری و یا دیتاسنتر
- توسعه دهندگان تمرکز خود را بر روی اپلیکیشن در حال توسعه قرار خواهند داد، نه زیرساخت در حال استفاده
- امکان Deploy برای بازه های زمانی کوتاه تر از vm ها
- حذف پیچیدگی ها از طریق کوچک سازی یا minimalism
- باعث بروز نیازمندیها و مشکلات جدیدی برای تیم operation می گردد
Container orchestration چیست؟
کانتینر ارکستریشن یعنی کوبرنیتیز تصمیم می گیرد که کجا و چگونه کانتینر شما را اجرا نماید، به شکل دقیق تر کوبرنیتیز ۳ عملکرد را ارائه می نماید:
Schedulers و Scheduling: این بخش با بررسی نیاز کانتینر و وضعیت موجود در کلاستر تصمیم می گیرد که بهترین جا برای ایجاد کانتینرهای جدید چه node ایی است، در واقع scheduler مثل مسئول دفتر مدیر عامل است که وظیفه کنترل و برنامه ریزی جلسات را بر عهده دارد. مثال دیگر سیستم سرمایش منازل است، شما درجه حرارت مد نظر خود را انتخاب می نمایید مثلا ۲۱ درجه و این وظیفه سیستم سرمایش است که خانه را به این درجه دما رسانده و در همین وضعیت نگه دارد، به همین شکل کوبرنیتیز وظیفه نگهداری کانتینرهای شما در وضعیت درخواست شده توسط شما را بر عهده دارد.
Service discovery و load balancing: در هر سیستمی مدیریت سرویسها کاری است سخت و این موضوع در کوبرنیتیز هم وجود دارد، هر چه تعداد سرویسها بیشتر گردد مدیریت آنها سخت تر خواهد شد، کاری که کوبرنیتیز در این زمینه انجام می دهد، مدیریت خودکار Service discovery است. ما می توانیم از کوبرنیتیز بخواهیم که سرویسی مثل دیتابیس را اجرا نماید، کوبرنیتیز سرویس های جدید را یادداشت می نماید، همچنین کوبرنیتیز وضعیت سلامت تک تک سرویس ها را بررسی می نماید و اگر سرویس با مشکلی مواجه باشد به شکل خودکار آن را ریست می نماید، علاوه بر چکهای معمول شما می توانید چک های دیگری را به کوبرنیتیز اضافه نمایید. همچنین کوبرنیتیز ارائه دهنده زیرساخت load balancing است، سرویس های مدرن با گسترش افقی و کپی نمودن سرویسها مقیاس پذیری را ارائه می نمایند و لود بالانسر قطعه اصلی در توزیع ترافیک بین کپی های سرویس می باشد.
Resource management: هر کامپیوتر دارای مقدار محدودی از منابع می باشد، بعضی پردازش ها ممکن است نیاز به پردازنده بیشتر و بعضی دیگر نیاز به حافظه بیشتر داشته باشند، کوبرنیتیز به شکلی اپلیکیشن ها را مدیریت خواهد نمود که استفاده بهینه ایی از منابع صورت گیرد و همچنین اجازه استفاده بیش از حد از منابع که باعث بی ثباتی می گردد را نخواهد داد.
به صورت کلی مزایای کوبرنیتیز را می توان Scalability و Portability و Consistent deployment و جداسازی و خودکار سازی Operation و Development در نظر گرفت.
معماری Kubernetes
کوبرنیتیز نرم افزاری جهت مدیریت اپلیکیشن های containerized شده بر روی مجموعه ایی از سرورها می باشد، این سرورها Master یا Worker نود هستند و با کمک هم اپلیکیشن ها و سرویس ها را اجرا می نمایند. Control plane ارائه دهنده مفهوم Master node است و در واقع مغز کلاستر کوبرنیتیز می باشد و بخش های آن به شرح زیر می باشد.
API Server: نقطه تماس تمامی درخواست هایی که از طرف سرویسها و اپلیکیشن ها ارسال می گردد می باشد و درخواست داخلی و یا خارجی از API Server عبور خواهد نمود و بررسی خواهد نمود که آیا درخواست ارائه شده صحیح می باشد و درخواست کننده دارای سطح دسترسی های لازم می باشد یا خیر.
etcd: اگر control plane مغز کلاستر است، etcd حافظه آن می باشد، کوبرنیتیز بدون etcdمثل مغزی است که نمی تواند چیزی را به یاد آورد.
Kubelet: نرم افزاری کوچکی است که بر روی worker نود ها اجرا شده و وظیفه برقراری ارتباط با Control Plane را بر عهده دارد، اگر control plane مغز است، kubelet نقش دست را ایفا می نماید، control plane فرمان را ارسال می نماید و kubelet فرمان را اجرا می نماید.