Container & Container Orchestration in Software Development

کانتینر چیست؟با شنیدن اسم کانتینر احتمالا یاد کانتینر‌های حمل بار میفتیم!یعنی محفظه‌هایی که هر یک مجموعه کالاهای متفاوتی را حمل می‌کنند اما همگی از یک کشتی برای انتقال استفاده می‌کنند.اما کانتینر چه ربطی به توسعه‌ی نرم افزار دارد؟می‌توان گفت پیش از حضور و معرفی کانتینر‌ها در حوزه‌ی نرم‌افزار،دولوپر‌ها زندگی سختی داشتند!چرا؟دولوپر‌ها همیشه با این مشکل دست و پنجه نرم می‌کردند که نرم افزاری را بر روی سیستم خودشان کدنویسی،دیباگ،تست و اجرا می‌کردند و از صحت عملکر آن کاملا مطمئن می‌شدند ولی با انتقال نرم افزار به یک محیط یا پلتفرم دیگر مانند سرور جهت استقرار،با ارور‌ها و باگ‌های زیادی رو به رو می‌شدند و باید تمام کتابخانه‌ها و فریمورک‌ها و وابستگی‌های دیگر را دستی چک می‌کردند تا از یکسان بودن آن‌ها با محیط سیستم خودشان مطمئن شوند و باگ‌ها و ارور‌های مربوطه رفع شوند.اما پس از معرفی کانتینر، دولوپر‌ها دیگر نگرانی درباره‌ی Deploy کردن نرم افزار‌ها پس از اطمینان از صحت عملکردشان بر روی سیستم خودشان نداشتند.چرا؟کانتینر یک واحد استانداردسازی شده از نرم افزار است که بسته های کد و هر آن چه به آن نیاز دارد تا اپلیکیشن به سرعت و پایدار اجرا شود و از یک واحد پردازش به واحد دیگر منتقل گردد را در خود گنجانده است؛بنابراین هر یک از نرم افزار‌ها در کانتینر خود ایزوله می‌شوند.کانتینر این اطمینان را ایجاد می‌کند که نرم‌افزار روی هر پلتفرمی از جمله سیستم دولوپر، محیط تست و... که اجرا شود عملکرد کاملا درستی داشته باشد.چه دلیلی دارد که نرم‌افزار پس از حصول اطمینان از عملکردش هنگام دیپلوی در محیط‌های مختلف دچار مشکل شود؟فرض کنید دولوپر از ورژنی بالاتر از .NET نسبت به .NET موجود بر روی سرور بریا کد زدن استفاده کرده‌ است و از عملکرد نرم‌افزار بر روی سیستم خودش اطمینان دارد،زمانی که این برنامه بدون استفاده از کانتینر بر روی سرور دیپلوی می‌شود، مسلما به مشکل می‌خورد.کانتینر درواقع یک محیط اجرای کامل است که نرم‌افزار به همراه تمامی وابستگی‌هایش مانند لایبرری‌ها، فریمورک‌ها، فایل‌های پیکره‌بندی و غیره را شامل می‌شود که در قالب یک پکیج ارائه می‌شود؛ بنابراین این توانایی را به دولوپر می‌دهد تا نرم‌افزار درون کانتینر را فارغ از محیط یا زیرساختی که می‌خواهد در آن اجرا شود،به راحتی بین محیط‌ها مختلف حرکت دهد و نرم‌افزار عملکرد کاملا درستی داشته باشد.کانتینر مانند یک حباب یا محیط محاسباتی است که دور نرم‌افزار را گرفته و آن را از محیط اطرافش جدا می‌کند.اساسا یک محیط کاملا کاربردی و قابل حمل است.کانتینر‌ها یک جایگزین برای کد زدن بر روی یک پلتفرم یا سیستم عامل هستند که باعث سختی انتقال نرم‌افزار به محیط‌ها و پلتفرم‌های دیگر می‌شد چرا که با آن‌ها تطابق نداشتند؛در نتیجه باعث هدر رفت زمان زیادی می شد و بهره وری کاهش پیدا می‌کرد.با بسته‌بندی یک نرم‌افزار در یک کانتینر که می‌توان آن را در میان پلتفرم‌ها و زیرساخت‌ها جابه‌جا کرد، آن نرم‌افزار را می‌توانیم در هر کجا که آن را جابه‌جا کنیم مورد استفاده قرار دهیم زیرا همه چیزهایی را که برای اجرای موفقیت‌آمیز در آن محیط نیاز دارد، دارد.جالب است بدانیم ایده جداسازی فرآیند‌ها برای مدت طولانی وجود داشت، اما زمانی که Docker موتور Docker را در سال 2013 معرفی کرد، استانداردی را برای استفاده از کانتینر با ابزارهایی که استفاده از آن‌ها برای دولوپر‌ها آسان بود معرفی کرد همچنین یک رویکرد جهانی برای بسته‌بندی(Packaging) تعیین کرد که باعث تسریع پذیرش و استفاده از کانتینر‌ها شد.امروزه دولوپر‌ها می‌توانند با توجه به نیازمندی‌هایشان از میان پلتفرم‌های Cotainerization و ابزار‌هایی که از استانداردهای تعیین شده توسط داکر یعنی Open Container Initiative بهره می‌برند،استفاده کنند.کانتینرها اغلب به عنوان "سبک وزن" شناخته می شوند، به این معنی که هسته سیستم عامل(Kernel) دستگاه را به اشتراک می گذارند و نیازی به هزینه سربار نصب یک سیستم عامل به ازای هر برنامه ندارند؛ بنابراین کانتینرها از نظر ظرفیت به فضای کمتری نسبت به یک ماشین مجازی نیاز دارند(ماشین‌های مجازی فضایی از اوردر گیگابایت نیاز دارند واین در حالیست که نیاز کانتینر‌ها در حد مگابایت است) علاوه بر این به زمان راه اندازی کمتری نیاز دارند. در مقایسه با تعداد ماشین‌های مجازی که می‌توانند همزمان با هم بر روی منابع سخت افزاری موجود اجرا شوند،کانتینر‌ها به دلیل کم حجم بودن از همان میزان منابع با بهره وری بالاتری استفاده می‌کنند و تعداد بیشتری کانتینر به صورت همزمان می‌توانند بر روی سرور اجرا شوند. این کار باعث افزایش راندمان سرور می شود و به نوبه خود هزینه های سرور و مجوز را کاهش می دهد.ایزوله بودن کانتینر‌های مختلف از یکدیگر احتمال اینکه کد مخرب موجود در یک کانتینر روی کانتینرهای دیگر تأثیر بگذارد یا به سیستم میزبان حمله کند را کاهش می‌دهد.بنابراین می توان متوجه شد که چرا شرکت ها به سرعت از کانتینرسازی به عنوان یک رویکرد برتر برای توسعه و مدیریت برنامه استفاده می کنند. Containerization به دولوپر‌ها این امکان را می دهد که برنامه ها را سریعتر و ایمن تر ایجاد و استقرار دهند، خواه برنامه یکپارچه سنتی(traditional monolith) (یک برنامه نرم افزاری تک لایه) باشد یا یک میکروسرویس ماژولار (مجموعه ای از خدمات با اتصال آزاد(loosely coupled)). نرم افزار‌های جدید مبتنی بر ابر را می‌توان از ابتدا به‌عنوان میکروسرویس‌های کانتینری ساخت و یک برنامه پیچیده را به مجموعه‌ای از خدمات تخصصی و قابل مدیریت کوچک‌تر تقسیم کرد. برنامه های موجود را می توان در کانتینر‌ها(یا میکروسرویس های کانتینری) که از منابع به شکل کارآمدتری استفاده می کنند، دوباره بسته بندی کرد.مزایای کانتینر با جزئیات بیشترContainerization مزایای قابل توجهی را برای توسعه دهندگان و تیم های توسعه ارائه می دهد. از جمله‌ی آن‌ها می‌توان به موارد زیر اشاره کرد:قابلیت حمل(Portability):یک کانتینر یک بسته اجرایی از نرم‌افزار ایجاد می‌کند که جدا از سیستم عامل میزبان انتزاع شده (به آن وابسته نیست)، و از این رو، قابل حمل است و می‌تواند در هر پلتفرم یا ابری عملکرد کاملا درستی داشته‌باشد.چابکی(Agility): Docker Engine متن باز برای اجرای کانتینرها، یک استاندارد صنعتی را برای کانتینرها با استفاده از ابزارهای توسعه دهنده ساده و یک رویکرد بسته بندی جهانی که در لینوکس و ویندوز کار می کند،شروع کرد. اکوسیستم کانتینر‌ها به موتورهای مدیریت شده توسط Open Container Initiative (OCI) منتقل شده است. توسعه دهندگان نرم افزار می توانند به استفاده از ابزارها و فرآیندهای چابک یا DevOps برای توسعه و بهبود سریع برنامه ادامه دهند.سرعت(Speed):کانتینرها اغلب به عنوان "سبک وزن" شناخته می شوند، به این معنی که هسته سیستم عامل (OS) دستگاه را به اشتراک می گذارند و با این هزینه اضافی که برای هر نرم‌افزار یک سیستم عامل جداگانه بالا بیاورند، گرفتار نمی شوند. این نه تنها بازده سرور را افزایش می دهد، بلکه هزینه های سرور و مجوز را کاهش می دهد و در عین حال سرعت شروع کار را افزایش می دهد زیرا سیستم عاملی برای راه اندازی وجود ندارد.ایزوله سازی اشتباه(Fault Isolation):هر برنامه کانتینری ایزوله شده است و مستقل از دیگران عمل می کند. خرابی یک کانتینر بر ادامه کار سایر کانتینرها تأثیر نمی گذارد. تیم‌های توسعه می‌توانند هرگونه مشکل فنی را در یک کانتینر بدون هیچ‌گونه خرابی در کانتینرهای دیگر شناسایی و تصحیح کنند. همچنین، موتور کانتینر می‌تواند از هر تکنیک جداسازی امنیتی سیستم‌عامل (مانند کنترل دسترسی SELinux) برای جداسازی خطاهای درون کانتینرها استفاده کند.بهره‌وری(Efficiency):نرم‌افزاری که در محیط‌های کانتینری اجرا می‌شود، هسته سیستم‌عامل دستگاه را به اشتراک می‌گذارد، و لایه‌های برنامه درون یک کانتینر را می‌توان در کانتینرها به اشتراک گذاشت. بنابراین، کانتینرها نیاز به ظرفیت کمتری نسبت به یک ماشین مجازی دارند علاوه بر این به زمان راه اندازی کمتری نیاز دارند، بنابراین به کانتینرهای بسیار بیشتری اجازه می دهد با همان ظرفیت منابع یک ماشین مجازی کار کنند. این باعث افزایش کارایی سرور، کاهش هزینه های سرور و صدور مجوز می شود.سهولت مدیریت(Ease of management):پلتفرم Container Orchestration، نصب، مقیاس‌بندی و مدیریت بارهای کاری و خدمات کانتینری را خودکار می‌کند. پلتفرم‌های Container Orchestration می‌توانند وظایف مدیریتی مانند مقیاس‌بندی برنامه‌های کانتینری، عرضه نسخه‌های جدید برنامه‌ها، و ارائه نظارت، ثبت و اشکال‌زدایی، از جمله عملکردهای دیگر را آسان‌تر کنند. Kubernetes، شاید محبوب‌ترین سیستم هماهنگ‌سازی کانتینر موجود باشد، یک فناوری متن باز (در ابتدا توسط Google به صورت متن باز و بر اساس پروژه داخلی آنها به نام Borg) است که عملکردهای کانتینر لینوکس را در اصل خودکار می‌کند. Kubernetes با بسیاری از موتورهای کانتینر مانند Docker کار می کند، اما همچنین با هر سیستم کانتینری که با استانداردهای Open Container Initiative (OCI) برای فرمت های تصویر کانتینر و زمان اجرا مطابقت دارد، کار می کند.امنیت(Security):جداسازی برنامه‌ها با استفاده از کانتینر، از نفوذ کدهای مخرب و تاثیر گذاری آن بر سایر کانتینرها یا سیستم میزبان جلوگیری می‌کند. علاوه بر این، مجوزهای امنیتی را می توان برای مسدود کردن خودکار ورود کامپوننت‌های ناخواسته به کانتینرها و یا محدود کردن ارتباطات با منابع غیر ضروری تعریف کرد.هماهنگ کننده کانتینر(Container Orchestration) چیست؟استقرار و مدیریت دستی کانتینر‌ها در تعداد کم آسان است اما در اکثر سازمان‌ها تعداد برنامه‌هایی که از کانتینر استفاده می‌کنند به سرعت در حال رشد است؛بنابراین مدیریت آن‌ها در مقیاس به ویژه به عنوان بخشی از CI/CD و خط لوله‌ی DevOps بدون اتوماسیون امکان پذیر نیست.هماهنگ کننده کانتینر تهیه، استقرار، شبکه سازی، مقیاس بندی، در دسترس بودن و مدیریت چرخه حیات کانتینرها را خودکار می کند. امروزه، Kubernetes محبوب‌ترین پلت‌فرم هماهنگ‌سازی کانتینر است و اکثر ارائه‌دهندگان پیشرو ابر عمومی - از جمله خدمات وب آمازون (AWS)، پلتفرم Google Cloud، IBM Cloud و Microsoft Azure - خدمات مدیریت‌شده Kubernetes را ارائه می‌کنند. از دیگر ابزارهای هماهنگ کننده کانتینر می توان به Docker Swarm و Apache Mesos اشاره کرد.هماهنگ کننده کانتینر چگونه کار می‌کند؟در حالی که تفاوت‌هایی در روش‌ها و قابلیت‌ها بین ابزارها وجود دارد، ارکستراسیون کانتینر اساساً یک فرآیند (یا چرخه، زمانی که بخشی از خط لوله چابک تکراری یا DevOps باشد) سه مرحله‌ای است.اکثر ابزارهای هماهنگ کننده کانتینر از یک مدل پیکربندی اعلامی پشتیبانی می کنند: توسعه دهنده یک فایل پیکربندی می نویسد (بسته به ابزار، بهYAML یا JSON) که وضعیت پیکربندی دلخواه را تعریف می کند و ابزار هماهنگ کننده کانتینر فایل را اجرا می کند از هوش درونی خود برای رسیدن به آن حالت استفاده می کند. فایل پیکربندی معمولامشخص می کند که کدام تصاویر کانتینر(Container Images) برنامه را تشکیل می دهند و در کجا قرار دارند (در چه رجیستری).کانتینر‌ها را با فضای ذخیره‌سازی و سایر منابع تامین می کند.اتصالات شبکه بین کانتینرها را تعریف و ایمن می کند.نسخه بندی را مشخص می کند (برای انتشار مرحله ای(pahse) یا قناری(canary))ابزار هماهنگ کننده، استقرار کانتینرها (و کپی از کانتینرها، برای انعطاف پذیری) را بر روی یک میزبان برنامه ریزی می کند و بهترین میزبان را بر اساس ظرفیت CPU موجود، حافظه، یا سایر الزامات یا محدودیت های مشخص شده در فایل پیکربندی انتخاب می کند.هنگامی که کانتینرها مستقر شدند، ابزار هماهنگ کننده چرخه حیات برنامه کانتینری را بر اساس فایل تعریف کانتینر (اغلب یک Dockerfile) مدیریت می کند که شامل:مدیریت مقیاس پذیری (بالا و پایین)، متعادل کردن بار، و تخصیص منابع در بین کانتینرها.اطمینان از در دسترس بودن و عملکرد با جابجایی کانتینرها به میزبان دیگری در صورت قطع یا کمبود منابع سیستمجمع آوری و ذخیره داده های log و سایر معیار‌های مورد استفاده برای نظارت بر سلامت و عملکرد برنامه.مزایای هماهنگ کننده کانتینراحتمالاً واضح است که مزیت اصلی هماهنگ کننده کانتینر، اتوماسیون است - نه تنها به این دلیل که تلاش و پیچیدگی مدیریت یک برنامه کاربردی بزرگ را کاهش می‌دهد بلکه با خودکار کردن عملیات، هماهنگ کننده از یک رویکرد چابک یا DevOps پشتیبانی می‌کند که به تیم‌ها اجازه می‌دهد در چرخه‌های سریع و تکراری، توسعه یافته و مستقر شوند و ویژگی‌ها و قابلیت‌های جدید را سریع‌تر منتشر کنند.علاوه بر این، هوشمندی ابزار هماهنگ کننده می تواند بسیاری از مزایای ذاتی کانتینرسازی را افزایش داده یا گسترش دهد. به عنوان مثال، انتخاب میزبان خودکار و تخصیص منابع بر اساس پیکربندی اعلامی، استفاده کارآمد از منابع را به حداکثر می‌رساند. نظارت بر سلامت خودکار و جابجایی کانتینرها، در دسترس بودن را به حداکثر می رساند.معرفی چند ابزار‌ متن باز در این حوزهداکر(Docker):ابزاری برای containerization است که به صورت متن باز ارائه می‌شود و در واقع معرفی این ابزار و دستور العمل‌هایش بود که انقلاب در استفاده از کانتینر‌ها به وجود آورد.داکر یک پلت فرم باز برای توسعه، جا‌به‌جایی و اجرای برنامه ها است. داکر شما را قادر می سازد تا برنامه های کاربردی خود را از زیرساخت خود جدا کنید تا بتوانید نرم افزار را به سرعت تحویل دهید. با داکر، می توانید زیرساخت خود را به همان روشی که برنامه های خود را مدیریت می کنید، مدیریت کنید. با استفاده از روش‌های داکر برای ارسال، آزمایش و استقرار سریع کد، می‌توانید تأخیر بین نوشتن کد و اجرای آن را به میزان قابل توجهی کاهش دهید.داکر توانایی بسته بندی و اجرای یک برنامه کاربردی را در یک محیط کاملاً ایزوله به نام کانتینر فراهم می کند. ایزوله بودن و امنیت به شما این امکان را می دهد تا چندین کانتینر را به طور همزمان روی یک میزبان مشخص اجرا کنید. کانتینرها سبک وزن هستند و شامل همه‌ی چیز‌های مورد نیاز برای اجرای برنامه هستند، بنابراین نیازی نیست به آنچه در حال حاضر روی هاست نصب شده است وابسته باشید. در حین کار می‌توانید به راحتی کانتینرها را به اشتراک بگذارید، و مطمئن باشید که همه کسانی که با آنها اشتراک‌گذاری می‌کنید، همان کانتینری را دریافت می‌کنند که به درستی کار می‌کند.کوبرنیتیز(Kubernetes):همانطور که در بالا ذکر شد، Kubernetes محبوب ترین پلت فرم هماهم کننده کانتینر است. همراه با ابزارهای دیگر در اکوسیستم کانتینری، Kubernetes یک شرکت را قادر می‌سازد تا یک پلتفرم به‌عنوان یک سرویس (PaaS) بسیار پربازده ارائه کند که به بسیاری از وظایف و مسائل مربوط به زیرساخت‌ها و عملیات مربوط به توسعه برنامه‌های کاربردی ابری می‌پردازد.بنابراین تیم های توسعه می توانند منحصراً بر روی کدنویسی و نوآوری تمرکز کنند.مزایای Kubernetes نسبت به سایر راه حل های ارکستراسیون، به دلیل نتیجه عملکرد جامع تر و پیچیده تر آن در چندین زمینه است، از جمله:استقرار کانتینر: Kubernetes تعداد مشخصی از کانتینرها را در یک میزبان مشخص مستقر می کند و آنها را در یک حالت دلخواه در حال اجرا نگه می دارد.انتشار: انتشار یک تغییر در استقرار است.Kubernetes به شما امکان می‌دهد که انتشار ها را شروع کنید، متوقف کنید، از سر بگیرید یا بازگردانید.کشف خدمات(Service Discovery):Kubernetes می تواند به طور خودکار یک کانتینر را با استفاده از نام DNS یا آدرس IP در دسترس اینترنت یا سایر کانتینرها قرار دهد.تامین فضای ذخیره‌سازی(Storage provisioning):توسعه‌دهندگان می‌توانند Kubernetes را تنظیم کنند تا در صورت نیاز، فضای ذخیره‌سازی محلی یا ابری دائمی را برای کانتینرهای شما نصب کند.تعادل بار و مقیاس پذیری:هنگامی که ترافیک به یک کانتینر افزایش می یابد، Kubernetes می تواند از تعادل بار و مقیاس بندی برای توزیع آن در سراسر شبکه استفاده کند تا از ثبات و عملکرد اطمینان حاصل شود. (همچنین میزان کار توسعه دهندگان را در راه اندازی یک متعادل کننده کاهش می‌دهد.)خود درمانی برای دسترس‌پذیری بالا:هنگامی که یک کانتینر خراب می شود، Kubernetes می تواند آن را مجددا راه اندازی یا به طور خودکار جایگزین کند. همچنین می‌تواند کانتینر‌هایی را که الزامات بررسی سلامت شما را برآورده نمی‌کنند، از بین ببرد.پشتیبانی و قابلیت حمل در چندین ارائه دهنده ابر:همانطور که قبلاً ذکر شد، Kubernetes از پشتیبانی گسترده‌ی همه‌ی ارائه دهندگان ابر پیشرو برخوردار است. این امر به ویژه برای سازمان‌هایی که برنامه‌های کاربردی را در یک محیط ابری ترکیبی یا چند ابری ترکیبی به کار می‌برند، مهم است.شرکت‌های ارائه دهنده خدمات کانتینر و هماهنگ کننده کانتینر در ایرانهم روش: این شرکت، با استفاده از کوبرنتیز، بستر ابری استقرار نرم‌افزار را برای کسب‌و‌کار‌ها فراهم می‌کند. همچنین امکان ارائه‌ی خدماتی از جمله پشتیبانی شبانه‌روزی، سیستم پایش داخلی و خارجی، سیستم لاگ و پشتیبان‌گیری در این بستر، برای مشتریان وجود دارد.دارکوب سرویس PaaS هم‌روش است که به برنامه‌نویسان و شرکتهای نرم‌افزاری این قابلیت را می‌دهد که سرویس خود را بدون دشواری و نیاز به درگیرشدن با مسائل زیرساختی روی کلاستر‌های کوبرنتیزی هم‌روش در داخل و خارج کشور اجرا کنند. این سیستم در دو نسخه‌ی CE و EE قابل ارائه به شرکتها و اشخاص می‌باشد. هدف دارکوب بهبود تجربه‌ و افزایش بهره‌وری برنامه‌نویسان در فرآیند توسعه و نگه‌داری سرویسهایشان هست.زیرساخت قدرتمند، امکان بالاآوردن ساده داکر ایمیجها، تجربه کاربری مناسب، پشتیبانی از زبان‌های برنامه‌نویسی گوناگون، بیلد و دیپلوی خودکار کد (CI/CD)، محاسبه هزینه بر اساس زمان استفاده، مقیاس‌پذیری ساده، بکاپ‌گیری روزانه خودکار و جمع‌آوری نگهداری متریکها و لاگها از جمله امکاناتی است که در دارکوب فراهم شده‌است.ابر آروان:ابر آروان شرکتی های‌تک در حوزه‌ی فناوری ابری است که کار خود را از سال ۱۳۹۴ آغاز کرده است و با ده‌ها محصول و قابلیت ابری مختلف مانند شبکه توزیع محتوا (CDN)، سرور ابری، پلتفرم ویدیویی، کانتینر ابری و آبجکت استوریج، زیرساخت کسب‌وکارهای آنلاین، سازمان‌ها و استارت‌آپ‌ها را تامین می‌کند.ابر آروان با در اختیار داشتن ۴۰ پاپ‌سایت در سراسر ایران و جهان، پاسخ‌گوی نیازهای زیرساختی بیش از ۶۰ هزار مشتری داخلی و خارجی است و تلاش می‌کند با قیمت‌گذاری اقتصادی و ارایه‌ی بسته‌های رایگان در هر محصول، از کسب‌وکارهای نوپا و در حال رشد نیز حمایت کند.سرویس‌دهی به بسیاری از پربازدیدترین وب‌سایت‌های ایرانی، پخش زنده‌ی مهم‌ترین رویدادهای ملی، ارایه‌ی خدمات امنیتی به سامانه‌های حساس دولتی و هم‌چنین جلوگیری از حملات سایبری به بسیاری از بانک‌ها و سامانه‌های کشور از جمله خدماتی است که این شرکت در اختیار کاربران قرار می‌دهد.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»منابعhttps://www.ibm.com/cloud/learn/containerizationhttps://www.redhat.com/en/topics/cloud-native-apps/what-is-containerizationhttps://www.ibm.com/cloud/learn/container-orchestrationhttps://www.redhat.com/en/topics/containers/what-is-container-orchestrationhttps://www.docker.com/