حامد رستم‌خانی
حامد رستم‌خانی
خواندن ۱۱ دقیقه·۳ سال پیش

مفاهیم Containerization و Container Orchestration

مقدمه

آیا تا به حال از خود پرسیده اید که Container ها چه تفاوتی با ماشین‌ های مجازی دارند؟ من در این مقاله قصد دارم به معرفی Container ها و معماری آن‌ ها و همچنین همنواسازی (Orchestration) آن ها بپردازم و به این سوالی که در ابتدا مطرح کردیم، پاسخ دهم. تکنولوژی Container پس از مدت کوتاهی به یک تکنولوژی فراگیر تبدیل شد، و علت این است که ما همگی در عصر تکنولوژی ابری (cloud) به سر می‌بریم و بهره برداری از Container ها به عنوان یکی از ابزار‌های کلیدی در ابر، ضروری می باشد.

کانتینر ها به عنوان برنامه های نرم‌افزاری سبک‌ وزن، مزایای متعددی دارند. این مزایا عبارتند از کاهش زمان عرضه App ها، مقیاس‌ پذیری (scalability)، سهولت مدیریت App و پشتیبانی از آن (maintainability) و نهایتاً بهبود تجربه کاربری (improve user experience) است.

مقابله با بحران کانتینر حمل و نقل با کمک هوش مصنوعی
مقابله با بحران کانتینر حمل و نقل با کمک هوش مصنوعی


در بخش بعدی به صورت مفصل درباره Container صحبت خواهم کرد و سپس برخی از ابزار‌های پرکاربرد آن را معرفی می‌ کنم و سپس سراغ همنواسازی Container ها و تکنولوژی‌ های مربوط به آن رفته و درباره آن ها نیز به تفصیل صحبت خواهم کرد. نهایتاً برخی از شرکت‌ های ایرانی که از این تکنولوژی ها استفاده می کنند تا سازوکار مدیریتی و نرم‌افزاری خود را بهبود بخشند را معرفی می کنم.

تشریح Container

قبل از پرداختن به موضوع Container بهتر است کمی درباره سیستم عامل، Hypervisor و ماشین‌ های مجازی صحبت کنیم. سیستم عامل (Operating system یا به اختصار OS) مهم‌ترین نرم‌افزار هر سیستم کامپیوتری محسوب می‌ شود و این بخش نرم‌افزاری به مدیریت بخش سخت‌افزاری کامپیوتر می‌ پردازد. علاوه بر آن سیستم عامل مسئول مدیریت و نگهداری برنامه های نرم‌افزاری می باشد که کاربران و سایر برنامه ها با آن ها در ارتباط می باشند (به عبارتی سیستم عامل یک لایه انتزاعی برای نحوه تعامل برنامه های نرم‌افزاری با منابع سخت‌افزاری فراهم می‌کند). همانطور که می دانید مسئولیت های سیستم عامل شامل زمانبندی وظایف، اختصاص دادن حافظه و مدیریت و هماهنگی پردازش‌ها است و همه این مسئولیت ها به نحوی اجرا می‌ شوند که برنامه های نرم‌افزاری بتوانند به طور مجزا و جداگانه کنار هم کار کنند.

تصویر ۱: ارتباط OS با بخش نرم‌افزاری و سخت‌ افزاری یک کامپیوتر
تصویر ۱: ارتباط OS با بخش نرم‌افزاری و سخت‌ افزاری یک کامپیوتر


هر سیستم عامل از یک بخش اصلی به نام کرنل (kernel) تشکیل شده است (به عبارتی کرنل نقش قلب سیستم عامل را بازی می‌ کند). وظیفه کرنل همانند یک پلی می باشد که برنامه های نرم‌افزاری یک سیستم کامپیوتری را از طریق پردازش داده‌هایش روی سخت‌افزار، متصل می کند. همانطور که می دانید کرنل یک ناحیه از RAM را به صورت اختصاصی در اختیار خود قرار داده است و این قسمت از دسترسی دیگر برنامه ها جدا می باشد و کرنل به برنامه‌های نرم‌افزاری کاربر اجازه نمی‌ دهد که سیستم عامل را دستکاری کنند. پس نکته مهمی که در این بخش باید درباره کرنل مدنظر داشته باشید این است که کرنل مسئول مدیریت حافظه در برنامه‌های نرم‌افزاری است. این بخش برنامه ها را اجرا می کند و در حافظه قرار می دهد و سپس مسئولیت نگهداری و مدیریت پردازش داده‌ های آن‌ ها را بر عهده می گیرد.

تصویر ۲: نمای کلی از ارتباط کرنل با برنامه‌های نرم‌افزاری و منابع سخت افزاری
تصویر ۲: نمای کلی از ارتباط کرنل با برنامه‌های نرم‌افزاری و منابع سخت افزاری


دسترسی کرنل‌ها به منابع سخت‌افزاری نامحدود می باشد این در حالی است که برنامه‌های نرم‌افزاری (App‌‌های) کاربر باید از طریق process های واسط به سخت‌افزار دسترسی داشته باشند. یکی از این process های اصلی Hypervisor می باشد. Hypervisor بین App ها و سخت‌افزار قرار می‌ گیرد. بنابراین اگر برنامه‌ی نرم‌افزاری بخواهد با RAM یا CPU یا Disk ارتباط داشته باشد، باید ابتدا از سیستم عامل و سپس از Hypervisor اجازه بگیرد.

معماری مطرح شده می تواند باعث بروز مشکلاتی می شود. به عبارت ساده این معماری چند مرحله‌ای روی سرعت، عملکرد و تجربه کاربری تأثیر بدی می گذارد. به همین علت اجرا کردن همزمان دو نوع سیستم عامل میزبان بر روی یک سخت‌افزار هزینه زیادی را به همراه خواهد داشت (هم هزینه زمانی و هم هزینه مالی). بنابراین برای حل این مشکلات (کاهش زمان دسترسی، افزایش قابلیت های نگهداری، مقیاس‌پذیری، بهبود تجربه کاربری) مهندسان سراغ راه‌حل‌ های دیگر مانند ماشین‌های مجازی و Container ها رفتند.

ماشین‌ مجازی (Virtual Machine یا به اختصار VM) برنامه‌ی نرم‌افزاری است که به عنوان یک رایانه مجازی عمل می‌ کند. این برنامه روی سیستم‌عامل میزبان یا Hypervisor اجرا می‌ شود و منابع سخت‌افزاری مجازی را برای یک سیستم‌عامل میهمان مهیا می‌ کند. به عبارتی ماشین مجازی یک لایه انتزاعی حول زیرساخت تشکیل‌ دهنده یک سیستم کامپیوتری و اجزای سخت‌افزاری آن می‌ سازد و پیچیدگی‌ های مربوط به چندین سیستم‌عامل مختلف را مخفی می کند و اصولا از ماشین‌های مجازی برای بهره‌ برداری مناسب از منابع سخت‌افزاری استفاده می شود. بنابراین مشکلی که پردازش Hypervisor برای اجرای دو سیستم عامل کنار یکدیگر داشت، به واسطه VM ها برطرف می‌ شوند.

یکی از مشکلاتی که ماشین‌ های مجازی دارند این است که آن ها برنامه‌های نرم‌افزاری حجیمی هستند و نیازمند بخش زیادی از حافظه کامپیوتر می باشند. همچینین VM ها مشکلاتی اعم از زمان بالای بوت شدن، پروسه نصب و پیکربندی زمانگیر یا حتی پیچیده، عملکرد پایین، نگهداری و ایجاد نسخه‌ های تکراری را دارند. همین مشکلات باعث شد مهندسان به فکر راه‌حلی مناسب‌تر بیافتند (در ادامه درباره این راه‌حل که ها می باشند صحبت می کنیم).

تصویر ۳: تفاوت سلسله مراتبی و ساختاری VM با Container
تصویر ۳: تفاوت سلسله مراتبی و ساختاری VM با Container


در یک جمله ساده Container، نرم‌افزار مجازی‌ سازی در سطح سیستم عامل می باشد. بنابراین همه برنامه های داخل یک کانتینر، درون فضای عملکردی یک سیستم عامل، اجرا می‌شوند و معماری آن با معماری سیستم عامل میزبان یکسان یا همراستا می باشد. پس توجه کنید که در این حالت تنها کرنل، دارای فضای اختصاصی برای خود می باشد. همین موضوع و این وضعیت باعث می‌ شود که برنامه‌های نرم‌افزاری بتوانند بدون عبور از سد سیستم عامل میهمان و بعد هایپروایزر به منابع سخت‌افزاری دسترسی داشته باشند و در نتیجه کارایی و performance بهتری نسبت به روش‌های دیگر ارائه دهند.

کانتینر ها به کاربران سیستم این امکان و قابلیت را می‌ دهند تا برنامه‌ های نرم‌افزاری و پیش نیازهای (dependency های) آن‌ ها را به صورت یک فرآیند ایزوله شده در سیستم اجرا کنند. تمام اجزای ضروری مورد نیاز یک برنامه نرم افزاری در قالب یک image بسته‌ بندی می‌ شوند و این image در یک محیط ایزوله اجرا می شود و منابع سخت افزاری مورد نیاز مانند CPU، فضای حافظه و فضای ذخیره سازی را با سیستم عامل به اشتراک نمی گذارد. اینکار باعث می‌ شود که فرآیند‌های اجرایی موجود در Container، نتوانندسایر فرآیندهای خارج از محدوده خود را مشاهده کنند.

یکی از تفاوت‌های کلیدی و اصلی Container با VM این است که Container به جای مجازی‌سازی سخت‌افزار، سیستم عامل را مجازی‌سازی می‌ کند. هر Container توسط یک موتور Container (در تکنولوژی داکر آن را به نام daemon می شناسند) اجرا می شود و هر Container یک سیستم پیکربندی مبتنی بر فایل دارند. به همین دلیل می‌توان آن ها را نسخه‌بندی و پشتیبانی کرد و مورد نظارت قرار داد. پس در نتیجه می توان گفت که امکان انتقال و کلون کردن در Container ها نسبت به VM ها آسان‌تر می باشد، Container ها نیازمند حافظه کمتری می باشند و چند Container را می‌توان روی یک سیستم کامپیوتری فیزیکی اجرا کرد (البته چندین VM را نیز می‌ توان روی یک سیستم فیزیکی اجرا کرد ولی منظور این بود که Container های بیشتری را نسبت به VM ها می توان روی یک سیستم فیزیکی اجرا کرد).

اگر بخواهیم مزایا و معایب Container ها را مطرح کنیم، می توانیم به شکل زیر آن ها را لیست کنیم.

مزایای Container

  • انتشار سریع تر و ساده تر برنامه‌های نرم‌افزاری (کاهش زمان عرضه برنامه‌ها)
  • امکان انتقال (مهاجرت)، پشتیبان‌گیری آسان‌تر به دلیل اندازه کوچک‌تر
  • ایزوله سازی در سطح برنامه‌های نرم‌افزاری
  • مصرف حافظه کمتر نسبت به ماشین مجازی
  • اندازه گیری و پایش دقیق استفاده از منابع پردازشی
  • ارتباط سریع با سخت‌افزار که درنتیجه منجر به کارایی بالا می شود
  • خودشمول بودن (همه پیش نیاز‌های یک Container درون خود قرار دارد)
  • مطابقت بالا با معماری‌های مدرن نرم‌افزاری مانند مایکروسرویس‌ها و ساختار ابر


معایب Container

  • معماری Container محدود به معماری محیطی است که در آن (میزبان) اجرا می شود (یعنی لینوکسی یا ویندوزی بودن میزبان در اجرای Container ها تاثیر می‌گذارد).
  • بلوغ Container ها نسبت به VM ها کمتر بوده است و به همین دلیل تضمینی برای عملکرد آن‌ها در مقیاس‌های بزرگ وجود ندارد (البته هنوز تضمینی وجود ندارد).
  • وقتی با کانتینر کار می کنید، شبکه سازی می تواند مشکل باشد. شما باید اتصال شبکه خوبی را حفظ کنید در حالی که فعالانه سعی می کنید کانتینرها را ایزوله نگه دارید.
  • کانتینر ها به دلیل اینکه یک لایه اضافی روی زیرساخت ایجاد می کنند نیاز به نگهداری و مدیریت دارند که همین موضوع، نیاز به کار بیشتر را می طلبد.
  • آموزش و یادگیری اضافی مفهوم جدید یکی دیگر از معایب پیش روی توسعه‌دهندگان و تیم‌های IT در استفاده و بهره برداری از Container می باشد.
  • از آنجا که در Container ها برنامه های نرم‌افزاری به طور کامل مجزا نشده اند، به اندازه ماشین‌های مجازی امن نمی باشند.


تشریح Container Orchestration

هنگامی که می خواهیم برنامه های نرم افزاری خود را روی چند سیستم میزبانی مختلف مقیاس دهیم، توانایی مدیریت هر سیستم میزبان و پیچیدگی های زیرساختی هرکدام از میزبان‌ها، کاری نسبتاً چالش برانگیز به نظر می رسد. همنواسازی (Orchestration) اصطلاحی است که به زمان‌بندی Container ها، مدیریت Cluster ها و به احتمال زیاد تدارک میزبان‌های بیشتر اشاره می کند. منظور از زمان‌بندی Container ها همان توانایی بارگذاری یک فایل سرویس روی یک سیستم میزبان و تعیین شیوه اجرای آن Container می باشد. عمل زمان‌بندی صرفاً به عمل خاص بارگذاری اشاره نمی کند بلکه در واقع ابزارهای زمانبندی مسئول مدیریت سرویس‌ها در تمامی سیستم های میزبان می باشند.

همچنین منظور از مدیریت کلاستر اشاره به فرایند کنترل کردن گروهی از میزبان‌ها دارد که این مدیریت می‌تواند شامل اضافه کردن و یا حذف میزبان‌ها از یک کلاستر، دریافت اطلاعات در مورد وضعیت فعلی میزبان‌ها و Container ها، و شروع یا اتمام کار پردازش‌ها باشند. نکته قابل توجه این است که مدیریت کلاستر ارتباط نزدیکی با مدیریت زمانبندی باید داشته باشد، به دلیل اینکه ابزارهای زمان‌بندی باید به تمامی میزبان‌ها در یک یا چند کلاستر دسترسی داشته باشند تا بتوانند Container ها یا سرویس ها را زمان‌بندی کنند.

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

تصویر ۴: نمونه‌ای از عملکرد بخشscheduler در همنواساز کانتینر
تصویر ۴: نمونه‌ای از عملکرد بخشscheduler در همنواساز کانتینر


اصولا ابزارهای زمان‌بندی از مکانیزم‌های override استفاده می‌ کنند که کنترل کنندگان سیستم می‌توانند از آن برای تنظیم و پیکربندی دقیق فرآیندهای انتخاب جهت رفع نیازمندی های خود بهره بگیرند. به عنوان مثال، اگر دو Container به دلیل این که به شکل واحد و یکسانی عمل می کنند، همواره روی میزبان یکسانی اجرا می‌شوند، این اتحاد بین Container ها را می‌توان در اغلب دستوراتی در طی زمان‌بندی به این ابزار ها اعلام کرد. به طور مشابه اگر دو Container نباید روی میزبان واحدی قرار بگیرند، این مورد را نیز می‌توان در طی پروسه زمان‌بندی تعیین و اعمال کرد.


ابزار‌ ها و تکنولوژی های متن باز

برای پیشنهاد درباره ارائه‌دهندگان تکنولوژی Container می‌توان به ۳ تکنولوژی زیر اشاره کرد که هر ۳ به صورت متن باز و رایگان در اختیار استفاده‌کنندگان‌شان قرار می‌گیرد:

تکنولوژی Docker

داکر یک نرم‌افزار کانتینری سازی (containerization) می باشد که مجازی سازی را در سطح سیستم عامل انجام می دهد. عرضه اولیه این نرم افزار در سال ۲۰۱۳ اتفاق افتاد و به زبان برنامه نویسی Go (زبان Golang) نوشته شده است. نحوه عملکرد داکر به این صورت است که Container ها را از یکدیگر جدا می کند و نرم‌افزار، کتابخانه ها و فایل های پیکربندی را در قالب image بسته بندی می کند و نهایتاً به واسطه docker daemon آن ها را اجرا می کند و آن ها می توانند از طریق کانال های کاملاً مشخص با یکدیگر ارتباط برقرار کنند.

تصویر ۵: معماری سطح بالای Docker
تصویر ۵: معماری سطح بالای Docker


تکنولوژی CoreOS

تکنولوژی CoreOS یک سیستم عامل متن باز و سبک وزن است که بر اساس هسته لینوکس پایه گذاری شده است و برای کانتینر کردن برنامه های شما طراحی شده است (شبیه به ابزار LXC). این زیرساخت استقرار آسان کلاستری را ارائه می دهد و در عین حال بر خودکارسازی، امنیت، قابلیت اطمینان و مقیاس پذیری تمرکز می کند.

تصویر ۶: معماری سطح بالای CoreOS
تصویر ۶: معماری سطح بالای CoreOS


تکنولوژی Containerd

تکنولوژی Containerd به عنوان یک موتور اجرا کننده Container برای لینوکس و ویندوز عمل می کند و چرخه حیات کامل Container های سیستم میزبان خود را مدیریت می کند. بنابراین این تکنولوژی از انتقال و ذخیره سازی image ها و اجرای Container ها و نظارت بر آن ها گرفته تا ذخیره سازی سطح پایین و مدیریت شبکه و... را تحت کنترل خود دارد و این مراحل را مدیریت می کند.

تصویر ۷: معماری سطح بالای Containerd
تصویر ۷: معماری سطح بالای Containerd


همچنین درباره تکنولوژی‌ های همنواسازی Container می توان به مورد زیر اشاره کرد (البته تکنولوژی های متنوعی نیز در این حوزه وجود دارند که می توانید آن‌ها را از طریق منابع در اختیار گذاشته شده، مطالعه کنید):

ابزار Kubernetes

ابزار Kubernetes یک ابزار همنواساز کانتینرها می باشد که به صورت متن باز و رایگان در اختیار کاربران خود قرار گرفته است. این ابزار با بخش زمان‌بندی عالی و مدیر منابع برای استقرار کانتینرها به روشی کارآمد و با دسترسی پذیری بالایی ساخته شده است.

تصویر ۸: معماری سطح بالای K8s
تصویر ۸: معماری سطح بالای K8s


شرکت‌ های ایرانی

همچنین بین شرکت‌های ایرانی می توان به شرکت معتبر زیر اشاره کرد که از Container ها و همنواسازی Container در فرایند‌های توسعه خود استفاده می‌کنند.

شرکت ابرآروان

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

این مقاله، بخشی از تمرین‌های درس معماری نرم‌افزار در دانشگاه شهید بهشتی می‌باشد

منابع

  • https://medium.com/computethecloud/operating-system-concepts-4dff340775ab
  • https://afteracademy.com/blog/what-is-kernel-in-operating-system-and-what-are-the-various-types-of-kernel
  • https://spin.atomicobject.com/2019/05/24/containerization-pros-cons
  • https://www.softwaretestinghelp.com/container-software
  • https://containerd.io/
  • https://www.docker.com/
  • https://www.redhat.com/en/topics/containers/what-is-container-orchestration
  • https://devopscube.com/docker-container-clustering-tools
معماری_نرم_افزار_بهشتیcontainercontainer orchestration
شاید از این پست‌ها خوشتان بیاید