امروزه تقریبا استفاده از روشهای کانتینریسازی (containerization) در تمام صنایع و شرکتهای سراسر جهان رو به افزایش است. در واقع، گزارشهای سالانه اخیر نشان میدهد که روشهای مبتنی بر کانتینر تقریبا در بیشتر از 87 درصد از سازمانهای مورد بررسی در حال استفاده میباشد. از جمله اهداف شرکتها در رفتن به سمت استفاده از روشهای مبتنی بر کانتینر، سرعت بخشیدن به چرخههای استقرار، افزایش اتوماسیون، کاهش هزینههای فناوری اطلاعات و ... میباشد.
فناوریهای کانتینری در این میان چه فوایدی را برای شرکتها فراهم میکنند؟ در این بخش، در ابتدا به صورت خلاصه با کانتینرها آشنا میشویم، سپس مفهوم ارکستراسیون کانتینر (container orchestration) را مورد بررسی قرار خواهیم داد و به چند نمونه از ابزارهای یا سرویسهای موجود در این زمینه اشاره میکنیم.
کانتینر یک واحد اجرایی از نرمافزار است که به بستهبندی و اجرای کد نرم افزار، کتابخانهها، وابستگیها و سایر بخشهای یک برنامه کمک میکند تا بتواند به طور مستقل از محیطی که در آن استقرار پیدا میکند، قابل اجرا باشد. البته الزامی وجود ندارد که یک کانتینر حتما بخشی از یک برنامهی اجرایی باشد بلکه میتواند قابلیتهایی مثل داشتن یک ابونتوی تمیز، یک سرور HTTP ساده و ... را فراهم کند بدون این که شما لازم باشد درگیر فرآیندهای لازم برای آمادهسازی، کامپایل یا پکیجبندی موارد مختلف شوید.
برنامههای کانتینری میتوانند به راحتی روی دسکتاپ محلی، سرورهای مجازی با سیستمعاملهای مختلف و ... اجرا شوند. مفهوم کانتینرسازی (Containerization) به فرآیندی گفته میشود که در آن توسعه، بستهبندی و استقرار یک برنامه بر اساس آمادهسازی آن بر اساس روش کانتینر باشد به گونهای که خروجی کار را بتوانیم به راحتی و مستقل از محیط نصب، اجرا کنیم. البته این که قسمتهای مختلف و جداگانه یک برنامه را در یک کانتینر توسعه داده و قرار دهیم یا این که یک برنامه را به صورت کامل در آن قرار دهیم، کاملا به تصمیمات توسعهدهندگان مربوط میشود اما مستقل از این که تصمیم چه باشد، به این فرآیند کانتینرسازی میگویند.
کانتینرها از نوعی فناوری مجازیسازی (در واقعیت این فناوری در سیستمعاملها فراهم شده است) برای رسیدن به این سطح از قابلیت حمل، عملکرد و سازگاری با محیطهای مختلف استفاده میکنند. مجازیسازی به معنای استفاده از سختافزار یک سیستمعامل برای ایجاد چندین سیستمعامل مجازی است. بعد از انجام این کار میتوانیم از سیستمعاملهای جداگانه برای انجام وظایف محاسباتی مختلف در بالای یک سرور فیزیکی واقعی استفاده کنیم. معمولا از این روش به روش مجازیسازی (virtual machine) گفته میشود. روش کانتینرها مشابه این روش میباشد با این تفاوت که اگر چه در بالای سختافزار یک سرور میزبان قرار میگیرند اما تمامی کانتینرها از منابع مشترک سیستمعامل سرور مانند کتابخانه ها، باینریها و ... بهره میبرند.
طبق توضیحات، کانتینرها دارای چندین مزیت هستند که به صورت خلاصه در زیر به آنها اشاره میکنیم:
کانتینرها در بالای سختافزار یک سرور فیزیکی نصب میشوند و یک سیستمعامل واحد را به اشتراک میگذارند. در عین حال، ماشینهای مجازی (VM) از نرمافزار، سفتافزار یا سختافزار برای ایجاد چندین ماشین مجازی که سیستمعاملهای مختلف را روی یک هاست اجرا میکنند، استفاده میکنند.
بسیاری از مردم ماشینهای مجازی را با کانتینر اشتباه میگیرند زیرا هر دو شکل مجازیسازی هستند. برای این که بتوانیم تفاوت این دو را درک کنیم، بهتر است تاریخچه این دو را نگاه کنیم.
سالها پیش ماشینهای مجازی (VM) برای پاسخگویی به نیازمندی فناوری اطلاعات و توسعهدهندگان متولد شدند. مهندسان میتوانستند یک Hypervisor (سختافزار، سفتافزار یا نرمافزاری که ماشینهای مجازی را ایجاد، اجرا و نظارت میکند) را در بالای سختافزار یک سرور فیزیکی قرار دهند تا چندین ماشین مجازی تولید کنند. این فرآیند در حال حاضر به عنوان مجازیسازی شناخته میشود.
مجازیسازی این امکان را فراهم میکند که چندین سیستم عامل را روی یک سختافزار اجرا کنیم. هر ماشین مجازی میتواند سیستم عامل خود (سیستم عامل مهمان) را اجرا کند. به این ترتیب، هر ماشین مجازی میتواند اپلیکیشنها، کتابخانهها و باینریهای متفاوتی را از برنامههای کنار خود سرویس دهد. ماشینهای مجازی به توسعه دهندگان این امکان را میدهد تا برنامههای متعددی را با سیستمعاملهای موردنظر خود بر روی یک سرور فیزیکی اجرا کنند تا قدرت پردازش را افزایش دهند، هزینههای سختافزاری را (خرید چندین سرور جدا) کاهش دهند و فرآیندهای مربوط به DevOps را کاهش دهند. توسعهدهندگان دیگر نیازی به اجرای یک برنامه در کل سرور ندارند و برنامهها به خوبی از یکدیگر تفکیک میشوند.
با این حال، ماشینهای مجازی بهترین راهحل نبودند. از آن جایی که هر ماشین مجازی یک سیستمعامل مستقل شامل باینریها و کتابخانهها را در داخل خود اجرا میکند، باعث میشود که اجرای ماشینهای مجازی حجم استفاده را افزایش دهد و به سرعت به چندین گیگابایت تبدیل شود. همچنین ماشینهای مجازی به دلیل داشتن یک سیستمعامل کامل در خود، به جای چند ثانیه، نیاز به چندین دقیقه برای شروع به کار کردن دارند. این یک مشکل جدید است زیرا هنگام اجرای برنامههای پیچیده و تلاشکردن برای بازیابی فاجعه رخداده، چند دقیقه میتواند مشکلات جدی ایجاد کند.
همچنین ماشینهای مجازی همچنین هنگام انتقال نرمافزار از یک محیط محاسباتی به محیط دیگر، در اجرای نرمافزار مشکل دارند. (وابستگی به محیط نصب شده روی ماشین مجازی هستند) این میتواند به دلیل نیازهای کنونی و روشهای توسعه جدید،، مشکلبرانگیز باشد.
در این زمان بود که کانتینرها وارد عمل شدند. همانطور که قبلا بحث شد، کانتینرها سبک وزن هستند، منابع سرور میزبان را به اشتراک میگذارند و به طور منحصر به فردتر، برای کار در هر محیطی طراحی شدهاند. در تصویر زیر تفاوت طراحی بین کانتینرها و ماشینهای مجازی را یکبار دیگر مشاهده میکنید.
ارکستراسیون کانتینر فرآیند خودکار برای هماهنگی و سازماندهی تمام جنبههای کانتینرهای مختلف، عملکرد آنها و محیطهای آنها است. استقرار و مقیاسبندی کانتینر، تنظیمات مربوط به شبکه و نگهداری همه جنبههای ارکستراسیون کانتینرها هستند.
یک برنامه در ابعاد بزرگ مخصوصا در روشهای میکروسرویس، میتواند شامل صدها یا هزاران کانتینر باشد. مدیریت همه این کانیترها شامل استقرار آنها، ارتباطات شبکهای آنها و ... به صورت دستی چالش برانگیز است! بنابراین مهندسان توسعه عملیات از ابزارهای اتوماسیون برای سهولت و بهینهسازی این فرآیندها استفاده میکنند.
با استفاده از ارکستراسیون کانتینر، مهندسان میتوانند زمان و نحوه شروع و توقف کانتینرها را مدیریت کنند، فعالیتهای بخشهای مختلف را برنامهریزی و هماهنگ کنند، سلامتی و اجرای درست و به موقع را نظارت کنند، بهروزرسانیها را به راحتی توزیع کنند و فرآیندهای شکست و بازیابی از خطا را مدیریت و برنامهریزی کنند. مهندسانی که در فرهنگهای توسعهی عملیات (DevOps) کار میکنند از پلتفرمها و ابزارهای هماهنگسازی کانتینر برای خودکار کردن این فرآیند در طول چرخه حیات کانتینرها استفاده میکنند.
ابزارهای ارکستراسیون فراوانی امروزه توسعه داده شدهاند. معمولا نسخههای مدرنتر این نوع ابزارها به برنامهنویسان اجازه میدهند که از زبان توصیفی (declarative programming) برای توصیف بخشهای مختلف استفاده کنند. این با روش استفاده از زبان امری متفاوت است و به توسعهدهندگان این امکان را میدهد که بدون مشخصکردن جزئیات انجام فرآیند، نتیجه موردنظر را تعریف کنند.
ارکستراسیون کانتینرها کارکردهای مختلفی دارد که در بالا نیز به بخشی از آنها اشاره شد. اما مهمترین مواردی که از آنها انتظار داریم شامل موارد زیر میباشد
ارکستراسیون مدیریت کانتینرها را ساده میکند. علاوه بر این، ابزارهای ارکستراسیون به تعیین اینکه کدام میزبانها برای اجرای کاینترنهای خاص منطبقتر هستند کمک میکند. (الگوریتمهایی برای تخصیص بهینه منابع کلاستر بین کانتینرهای مختلف ارائه میدهند) این کار توسعهدهندگان را بسیار آسانتر می کند و در عین حال خطای انسانی و زمان استفاده را کاهش میدهد.
ارکستراسیون همچنین اگر در جایی، خرابی رخ دهد و یک یا چندین مورد از کانتینرها دچار مشکل شوند، معمولا کانتینرها را مجددا بر روی همان سرور یا در صورت نیاز روی سرور دیگری راهاندازی میکنند تا انعطافپذیری سیستم در برابر خطا افزایش یابد.
کوبرنتیز یک پلتفرم ارکستراسیون کانتینر منبع باز است که هم از اتوماسیون توصیفی و هم از پیکربندی پشتیبانی میکند. امروزه جزو رایجترین ابزارها در این زمینه میباشد. گوگل ابتدا آن را قبل از اینکه به بنیاد محاسبات Cloud Native تحویل دهد، توسعه داد. کوبرنتیز کانتینرها را با استفاده از فایلهای YAML یا JSON توصیف و مدیریت میکند.
در کوبرنتیز سه مفهوم pod و node و cluster را داریم. برخی از ارکستراسیون کانتینرها از جمله کوبرنتیز، کانتینرها را مستقیما اجرا نمیکنند. در عوض، آنها یک یا چند کانتینتر را که معمولا به صورت واحد شناخته و استفاده میشوند، در ساختاری به نام pod (نامگذاری کوبرنتیز) قرار میدهند. کانتینرهای داخل یک مجموعه میتوانند شبکه محلی و منابع را به اشتراک بگذارند در حالی که همچنان از کانتینرهای موجود در سایر بخشها جدا و مستقل هستند. از آنجایی که این بستهها یک واحد کاملا مستقل در پلتفرم ارکستراسیون هستند، آنها به عنوان یک واحد بالا و پایین میشوند، به این معنی که همه کانتینرهای درون آنها بدون توجه به نیازهای فردی آنها، بر اساس آن مقیاس میشوند.
یک گره (node) نشان دهنده یک ماشین واحد (سرور فیزیکی، ماشین مجازی، ...) است که که نمونههای بستههای مختلف از کانتینرها روی آنها اجرا میشوند.
وقتی مجموعهای از چندین گره (node) را در کنار همدیگر قرار میدهیم و از آن برای مدیتری برنامههای مختلف استفاده میکنیم، در عمل یک خوشه یا کلاستر تشکیل دادهایم.
امروزه چندین ارائه دهنده Kubernetes-as-a-Service بر روی پلتفرم کوبرنتیز ساخته شدهاند که نام برخی از آنها در زیر مشاهده میکنید:
اگرچه داکر به طور کامل Kubernetes را به عنوان موتور منتخب ارکستراسیون کانتینر پذیرفته است، این شرکت همچنان Swarm را ارائه میکند. این ابزار مشابه کوبرنتیز بوده و نسبت به آن کمتر توسعهپذیر و پیچیده است، اما برای علاقهمندان به داکر که میخواهند مسیر آسانتر و سریعتری برای استقرار کانتینر داشته باشند، انتخاب مناسبی است. اجزای اصلی معماری داکر در Swarm به صورت خلاصه به صورت زیر است:
ازدحام (Swarm): معادل یک خوشه در کوبرنتیز میباشد و مجموعهای از گرهها با حداقل یک گره اصلی و چندین گره کارگر است که می توانند ماشینهای مجازی یا فیزیکی باشند.
سرویس (service): یک سرویس مجموعهای از وظایف است که یک مدیر یا گرههای عامل باید روی کلاستر انجام دهند. یک سرویس تعریف میکند که کلاستر باید از کدام کانتینرها به منظور رسیدن به اهدافی مشخص، چه دستوراتی را اجرا کند. یک سرویس در این زمینه مشابه یک میکروسرویس است. همچنین امکان مشخصکردن پارامترهایی مثل تعداد نمونههای یک سرویس وجود دارد.
گره مدیر (manager node): هنگامی که یک برنامه کاربردی را در یک ازدحام مستقر میکنید، گره مدیر چندین عملکرد را ارائه می دهد: کار (به شکل وظایف) به گرههای کارگر تحویل میدهد و وضعیت گروهی را که به آن تعلق دارد مدیریت میکند. گره مدیر میتواند خود در کنار مدیریت کارها، به صورت گره کارگر (worker) هم عمل کند. (در صورتی که تنظیم آن را فعال نمایید)
گره کارگر (worker node): این گرهها وظایف توزیع شده توسط گره مدیر در ازدحام را اجرا میکنند.
وظیفه (tasks): کانتینرهای داکر هستند که دستوراتی را که در سرویس تعریف شدهاند را اجرا میکنند. گرههای مدیر وظایفی را به گرههای کارگر اختصاص میدهند و پس از این تخصیص، کار را نمیتوان به کارگر دیگری منتقل کرد. اگر کار به هر دلیل ناموفق باشد، مدیر نسخه جدیدی از آن وظیفه را به گره در دسترس دیگری در ازدحام اختصاص میدهد.
در ایران معمولا به دلیل این که خود داکر و دیگر ابزارهای موجود منبع باز و قدرتمند برای ارائه قابلیتهای کانتینر (Containerization) وجود دارند، ابزارهای جایگزینی برای آنها تولید نمیشوند. اما در عوض سرویسهایی که معمولا ابزارهای موجود مثل کوبرنتیز را به عنوان سرویس ارائه میدهند (Platform as a service) (Pass) در ایران در دسترس نیستند. (مثل سرویسهای گوگل و ...) به همین دلیل در ایران شرکتهای مشابهی به وجود آمدهاند که این سرویسها را ارائه میدهند. در ادامه دو مورد از آنها را معرفی میکنیم.
ابر آروان شرکتی است که در حوزهی فناوری ابری محصولات و ابزارهای مختلفی را برای راحتی توسعهدهندگان در سرار جهان ارائه میدهد. از جمله سرویسهایی که با مراجعه به سایت این شرکت میتواند مشاهده نمود مواردی همچون شبکه توزیع محتوا (CDN)، سرور ابری، پلتفرم ویدیویی، کانتینر ابری، آبجکت استوریج و زیرساخت کسبوکارهای آنلاین میباشد.
سرویسدهی به بسیاری از پربازدیدترین وبسایتهای ایرانی، پخشزندهی مهمترین رویدادهای ملی، ارایهی خدمات امنیتی به سامانههای حساس دولتی و همچنین جلوگیری از حملات سایبری به بسیاری از بانکها و سامانههای کشور از جمله خدماتی است که این شرکت در اختیار کاربران قرار میدهد.
با استفاده از سکوی ابری آروان تنها با چند کلیک، محصولتان را به بازار عرضه کنید و از دغدغههای آمادهسازی زیرساخت، نیروی فنی متخصص و صرف زمان برای تامین، آمادهسازی و پیکربندی سرور، نصب اپلیکیشنهای پایه مانند Run Time و نصب سرویسهایی مانند Load Balancing و Monitoring بینیاز شوید. با ویژگی Scalability سکوی ابری آروان میتوانید با توجه به نیازهای زیرساختی کسبوکارتان، تنها با یک کلیک منابع خود را افزایش دهید. این سرویس مبتنی بر APIهای ارائهشده توسط کوبرنتیز پیادهسازی شده است و محصول کوبرنتیز را به عنوان یک سرویس (PaaS) ارائه میدهد.
کانتینر ابری آروان تمامی نیازمندیهای زیرساختی شما از جمله Monitoring و Load Balancing را تامین میکند و با کنترل مداوم وضعیت زیرساخت، نرمافزارتان را مطابق با پیکربندی مورد نظرتان، همیشه در دسترس قرار میدهد.
برای شناخت بیشتر سرویس ارائهشده توسط ابرآوان میتوانید از صفحهی زیر استفاده نمایید:
مجموعه ستون با در اختیار داشتن سه دیتاسنتر قدرتمند در ایران و با گستردگی جغرافیایی و شبکهای و حضور در نقاط متعددی در اروپا، آمریکای شمالی و شرق آسیا و با بهرهگیری از بهروزترین تکنولوژیهای دنیا، همان زیرساختی را ارائه میکند که تاکنون به بزرگترین شرکتهای ایران مانند بازار، دیوار و بلد نیز ارائه کرده است.
راهاندازی و نگهداری کوبرنتیز کار بسیار سخت، تخصصی و هزینهبری است. ستون با بهرهگیری از بهترین متخصصان، امکان استفاده از کوبرنتیز بهعنوان سرویس را برای شما فراهم میکند. با استفاده از سرویس کوبرنتیز ستون دیگر نیازی به صرف هزینههای زیاد برای استفاده از آن نخواهید داشت و کلیهی کارهای مرتبط با نگهداری، پایداری، توسعهپذیری و تامین منابع مورد نیاز را ستون برای شما انجام خواهد داد.
از آنجایی که توضیحات خود سایت ستون در مورد خدمات آن در زمینهی ارائهی سرویس زیرساخت ابری بر مبنای کانتینر کامل بوده و ارتباط با پشتیبانی نیز فراهم است، پیشنهاد میشود برای اطلاعات بیشتر در این زمینه، به سایت ستون مراجعه نمایید:
مانند بسیاری از فناوریهای که تازه به وجود میآیند، ابزارهای ارکستراسیون کانتینر دارای مزایا و معایب خود هستند. پلتفرمهایی که کوبرنتیز را برای شما مدیریت میکنند یا روشهای مدیریت خود را برای داکرها به شما ارائه میدهند و از سوی دیگر ابزارهای منبع باز کنونی مثل کوبرنتیز، Swarm و Mesos/Marathon و ... باید بسته به معیارهایی مانند معماری، نیازهای دسترسی (High available)، انعطافپذیری و از همه مهمتر منحنی یادگیری و پذیرش آنها، ارزیابی شوند.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.