طبق نظرسنجی CNCF، حدود 96٪ از شرکتها از Kubernetes در محیط IT خود استفاده میکنند یا در نظر دارند از آنها استفاده کنند. نامهای بزرگی مانند Google، Shopify، Udemy، Slack Robinhood، Nubank و The New York Times با موفقیت از Kubernetes برای بهبود عملیات نرمافزاری خود و سادهسازی خطوط لوله توسعه استفاده میکنند. Statista، Kubernetes را با 16.4 درصد از سهم بازار جهانی در رتبه سوم در فهرست پلتفرمهای فناوری پیشرو قرار داده است.
به نظر میرسد که هیچ توسعه واحدی نمیتواند بدون Kubernetes انجام دهد و همه شرکتها تلاش میکنند تا آن را در بین فناوریهای خود داشته باشند. اما آیا Kubernetes برای شما مناسب است و آیا استفاده از Kubernetes همیشه از نظر اقتصادی برای شرکت مفید است؟
مورد استفاده خود را درک کنید
یک فروشگاه آنلاین بزرگ با محصولات زیاد و پایگاه مشتریان گسترده را تصور کنید، روزانه صدها مشتری از فروشگاه بازدید میکنند و صدها خرید انجام میدهند. وظیفه شما ارسال سریع و بدون وقفه کالا از انبارها است. میتوانید این کار را به صورت خودکار یا دستی انجام دهید. در حالت اول، چندین مدیر را برای پردازش دستی سفارشات و تنظیم اقلام موجود در انبار استخدام خواهید کرد. در حالت دوم، سیستمی را نصب میکنید که بهطور خودکار سفارشها را تکمیل نموده و هنگام خرید، موجودی را تنظیم میکند.
حالا یک فروشگاه کوچک با مجموعه محدودی از کالاهای بسیار تخصصی را تصور کنید. خریدها در فروشگاه به طور منظم انجام میشود، اما نه در تعداد زیاد و میتوانید ترافیک مشتریان را در زمان مشخصی پیش بینی کنید.
وظیفه شما یکسان است ؛ ارسال روان کالا از انبار. شما همچنین میتوانید فروش را خودکار کنید یا آنها را به صورت دستی پردازش کنید. در این مورد، گزینه دوم بیشتر در مورد مقرون به صرفه بودن است. استخدام یک مدیر ارزان تر و بدون دردسرتر از توسعه یا خرید WMS (نرم افزار مدیریت انبار) است.
حال بیایید مثال فروشگاه آنلاین را به سیستم توسعه نرم افزار منتقل کنیم. در چنین سیستمی، شرکتها اغلب بر کانتینریسازی تکیه میکنند، رویکردی که برنامهها و وابستگیهای آنها را در محیطهای ایزوله بستهبندی میکند. در سیستم های سازمانی بزرگ، چنین کانتینرهای زیادی وجود دارد و مدیریت دستی آنها مشکل ساز است.
اینجاست که Kubernetes وارد بازی می شود.
Kubernetes برای ارکستراسیون کانتینر خودکار استفاده میشود. این ابزارها را برای استقرار و مدیریت خودکار محیط های ایزوله در سیستم نرم افزار فراهم میکند و به سازمانها اجازه میدهد تا پروژههای بزرگ مقیاس را آسانتر و کارآمدتر مدیریت کنند.
با این حال، اگر نرم افزار شما دارای منابع گسترده نیست و دارای جریان های قابل پیش بینی است، ممکن است به هماهنگ سازی خودکار نیاز نباشد. در این صورت، میتوانید مدیریت کانتینر را به یک مهندس DevOps خبره بسپارید و در راهاندازی محیط فناوری اطلاعات صرفهجویی کنید.
برای کدام پروژهها استفاده از Kubernetes بهتر است؟
Kubernetes برای پروژههای high-load، مقیاس پذیر و با دادههای بزرگ مناسبتر است. چنین پروژههایی معمولا شامل کار با چندین کلاستر کانتینری و راهکارهای ابری PaaS یا IaaS میشود.
به لطف کانتینرها، می توانید منابع ارجاع شده به بخشهای خاص پروژه را جدا کنید. به عنوان مثال، می توانید CPU، حافظه و فضای ذخیره سازی مورد نیاز برای پردازش تراکنش پرداخت را ایزوله کنید تا این عملیات پردازش سفارش یا ردیابی حمل و نقل را کند نکند.
کانتینرها همچنین پردازش موازی عملیاتهای مختلف را امکان پذیر میکنند که اجازه میدهد تا چندین کار را به طور همزمان بدون کاهش سرعت عملکرد کلی برنامه انجام دهید.
اما مهمتر از همه، کانتینرها مدیریت بار کاری بالا را ساده میکنند، زیرا میتوانید در صورت نیاز آنها را اضافه یا حذف کنید.
اما بیایید به Kubernetes و استفاده از آن در پروژههای high-load برگردیم.
برای راه اندازی CI/CD در چنین پروژههایی، باید مطمئن شوید که هر کانتینر وظیفه خود را به وضوح و به موقع انجام میدهد و فرآیندهای وابسته به یکدیگر سرعت یکدیگر را کاهش نمیدهند.
امروزه استفاده از Kubernetes یکی از بهترین روشهای DevOps است. این به شما امکان میدهد از بسیاری از کانتینرها یک خط لوله بسیار کارآمد بسازید. با ویژگی هایی مانند Kubelet و Autoscaling، می توانید به سرعت به نیازهای در حال تغییر پاسخ دهید. به عنوان مثال، میتوانید به طور خودکار کانتینرهای برنامه را در صورت شناسایی مشکلات راه اندازی و متوقف کنید. همچنین میتوانید بهطور خودکار تعداد پادهای در حال اجرا (مثنی) را در Deployment، ReplicaSet یا کنترلکنندههای دیگر بر اساس حجم کار مشاهدهشده یا استفاده از منابع تنظیم کنید.
بنابراین، Kubernetes به عنوان یک رهبر در ارکستر کانتینرها عمل میکند که تضمین میکند که هر کانتینر نقش خود را به طور موثر ایفا میکند، به موقع وارد میشود و در یک فرکانس خاص کار میکند.
پروژههایی که نیازی به استفاده از کوبرنتیز ندارند
برای شرکتهای کوچک و متوسط، ممکن است به کانتینریسازی به طور کلی و Kubernetes به طور خاص نیازی نباشد. چنین شرکت هایی ممکن است راه اندازی Kubernetes را بسیار پیچیده و منابع فشرده بدانند.
همچنین، اگر معماری یکپارچه دارید، استقرار و مدیریت آن به صورت دستی سادهتر از استفاده از ابزارهای استقرار خودکار است.
هنگامی که حفظ کد بسیار دشوار می شود، ممکن است پروژه را به میکروسرویسهایی با رابط های خاص خود cut کنید. بنابراین، هنوز امکان مدیریت میکروسرویسها بدون orchestrator یا با ارکستراتور کمتر پیچیده وجود دارد.
علاوه بر این، اگر بودجه محدودی دارید و نمیخواهید تیم توسعه خود را گسترش دهید، از ماشینهای مجازی استفاده کنید. شما می توانید آنها را با کمک یک سیستم مدیریت پیکربندی، به عنوان مثال، Ansible مدیریت کنید. چنین ماشین هایی نیازی به صلاحیت بالای کارکنانی ندارند که آنها را نگهداری می کنند.
در کل، انواع پروژه هایی که در آنها به Kubernetes نیاز ندارید به شرح زیر است:
- کاربردهای یکپارچه
- برنامه های کاربردی با ترافیک کاربر قابل پیش بینی
- برنامه های Low-loaded یا mid-loaded
- وبسایتهای استاتیک
- اپلیکیشنهای Single-instance
- محیط های محدود به منابع (Resource-constrained)
مزایا و معایب Kubernetes
کوبرنتیز یک فناوری بسیار کارآمد است اما نه یک فناوری یک اندازه برای همه، Kubernetes میتواند زیرساختهای کانتینری را تا حد زیادی بهبود بخشد، اما ممکن است برای پروژههای غیر گسترده و قابل پیش بینی ترافیک بیش از حد باشد.
اگر از خود بپرسید، «آیا به کوبرنتیز نیاز دارم؟» قبل از تصمیم گیری نهایی، مزایا و معایب این فناوری را در نظر بگیرید.
مزایای کوبرنتیز
- ارکستراسیون. کوبرنتیز به پیکربندی مدیریت کانتینر خودکار کمک میکند که برای برنامههای کاربردی ابری ضروری است، زیرا چنین برنامههایی حاوی هزاران میکروسرویس در کانتینرهای مربوطه هستند.
- مقیاسپذیری الاستیک. کوبرنتیز دارای ویژگیهای زیادی برای مقیاس پذیری آسان و سریع است. نکته مهم این است که میتوانید معیارهای سفارشی را برای مقیاسبندی خودکار مشخص و برنامه خود را قادر به استفاده کم و بیش از منابع محاسباتی بر اساس نیازهای خاص خود کنید.
- خود درمانی (Self-healing). کوبرنتیز وضعیت واقعی برنامه را با وضعیت مطلوب آن که در فایل پیکربندی مشخص شده است مقایسه میکند. اگر هر گونه انحراف تشخیص داده شود، تنظیماتی را برای بازگشت برنامه به حالت مورد نیاز انجام میدهد. به عنوان مثال، میتواند پادهای(pod) خراب را مجدد زمانبندی و پادهای پاسخگو را جایگزین و تعداد replica را تنظیم کند.
- ابرآگنوستیک (Cloud-agnosticism). کوبرنتیز را می توان در هر محیط ابری یا on-premises اجرا کرد. شما میتوانید آن را به همان اندازه در AWS، Microsoft Azure، Google Cloud یا با سرورهای bare metal استفاده کنید.
- به روز رسانی های در حال چرخش (Rolling updates) این ویژگی به شما این امکان را میدهد که از خرابی در حین ارتقاء نرم افزار جلوگیری کنید. با تعویض تدریجی پادهای ریسورس، اجرای برنامه را ثابت نگه داشته و برای کاربران مشکلی ایجاد نمیکنید.
- توسعه پذیری کوبرنتیز پلاگینهای مختلفی برای گسترش عملکرد خود دارد. به عنوان مثال، میتوانید از پلاگینهای شبکه، افزونههای ذخیرهسازی، کنترلکنندههای ورودی، پلاگینهای مانیتور و ثبتنام، مش سرویس، مقیاسکننده خودکار کلاستر و غیره استفاده کنید. همچنین میتوانید Kubernetes را به عنوان گردش کار کد (IaC) در زیرساخت ادغام کنید.
- کامیونیتی فعال کوبرنتیز دارای یک جامعه گسترده است که به شما امکان می دهد به اسناد، انجمنها و سایر منابع مبتنی بر دانش دسترسی داشته باشید. این تجربه شما را از استفاده از Kubernetes در پروژه های مختلف تسهیل میکند.
معایب Kubernetes
- پیچیدگی. کوبرنتیز یک فناوری پیچیده است که نمیتوان آن را در یک روز کشف کرد. شما باید DevOps با تجربه را برای استفاده از Kubernetes در پروژه خود استخدام کنید یا روی آموزش و آموزش کارشناسان کمتر با تجربه سرمایه گذاری کنید.
- راه اندازی شبکه کوبرنتیز دارای سطح بالاتری از انتزاع شبکه نسبت به فناوری های شبکه سنتی است. با کانتینرها و پادها به عنوان شهروندان درجه یک رفتار میکند. هر شهروند چنین آدرس IP مخصوص به خود را دارد. چنین انتزاعی انعطاف پذیری بیشتری را فراهم می کند، اما، در عین حال، ممکن است برای کسانی که به یک تنظیم سنتیتر استفاده می کنند، گیج کننده باشد.
- سازگاری. اگر تصمیم دارید کوبرنتیز را به یک نسخه خاص ارتقا یا کاهش دهید، ممکن است با مشکلات سازگاری با اجزای برنامه موجود مواجه شوید. بسیار مهم است که اسناد انتشار Kubernetes را قبل از ارتقا بررسی کنید و مطمئن شوید که مهاجرت نسخه تنظیمات زیرساخت فعلی را خراب نمیکند.
- چالشهای دیباگ کوبرنتیز برای راه اندازی زیرساخت در سیستم های پیچیده توزیع شده استفاده می شود. چنین سیستم هایی دارای اجزای متعدد به هم پیوسته هستند. هنگامی که مشکلی ظاهر می شود، شناسایی منبع مشکل و عیب یابی فوری آن چالش برانگیز است.
- نگرانیهای امنیتی پیکربندی نادرست در کوبرنتیز می تواند منجر به آسیب پذیری برنامه ها و نقض احتمالی داده ها شود. برخی از اشتباهات رایج در پیکربندی Kubernetes عبارتند از: کنترل دسترسی مبتنی بر نقش ناکافی، مجوزهای بیش از حد پاد، خط مشی های شبکه ناامن، سرورهای API ناامن، فقدان جداسازی شبکه، و کنترل کننده های پذیرش بررسی نشده است.
- قفل فروشنده (Vendor lock-in)اگر تصمیم بگیرید از Kubernetes به سیستم ارکستراسیون دیگری تغییر دهید، ممکن است با چالش های زیادی روبرو شوید. اینها ممکن است شامل ایجاد تغییرات در فایلهای پیکربندی و مانیفستهای استقرار، پیادهسازی مجدد برنامهها و بازنگری در اکوسیستم یکپارچهسازی باشد.
هزینههای Kubernetes
متنباز بودن فناوری کوبرنتیز، بدان معنا نیست که میتوانید کاملا رایگان از آن استفاده کنید. قیمت نهایی به مشخصات پروژه، زیرساخت فناوری اطلاعات و پیکربندی بستگی دارد. در اینجا مولفههای اصلی که هزینه Kubernetes را تشکیل میدهند وجود دارد:
- زیر ساخت – شامل هزینه سرورهای فیزیکی، ذخیره سازی، ماشینهای مجازی (VM) و منابع شبکه است که برای اجرای کلاسترهای Kubernetes خود به آن نیاز دارید. هزینههای زیرساخت نیز تحت تاثیر تعداد گرهها و پیکربندیهای آنها و ارائهدهنده ابری است که انتخاب میکنید.
- ذخیره سازی – کلاس ذخیره سازی، ظرفیت و ارائه دهنده تاثیر مستقیمی بر هزینههای Kubernetes خواهد داشت. مسئله این است که در کوبرنتیز، شما از Volumeهای پایدار برای ذخیره دادهها از کانتینرهایی استفاده میکنید که چرخه عمر خود را به پایان رساندهاند. هرچه دادههای بیشتری داشته باشید، ظرفیت ذخیره سازی بیشتری را مصرف خواهید کرد. علاوه بر این، اگر برنامه شما ترافیک خروجی زیادی ایجاد کند، ممکن است هزینههای ذخیره سازی را افزایش دهد زیرا برخی از ارائه دهندگان هزینههای اضافی برای انتقال داده دریافت میکنند.
- شبکه – هزینه شبکه به میزان ترافیک برنامه شما و ارائه دهنده ابری که با آن کار میکنید بستگی دارد. این هزینهها به طور خاص هزینههای انتقال داده، هزینههای لود بالانسر و هزینههای خروج از شبکه را پوشش میدهد.
- اندازه کلاستر – یک کلاستر متشکل از ماشینها (گرهها) مورد نیاز برای اجرای یک برنامه کاربردی کانتینری است که توسط Kubernetes تنظیم شده است. هرچه تعداد گرههای بیشتری داشته باشید، هزینههای کلاستر بالاتر است. بنابراین، ارزیابی کامل نیازمندیهای پروژه و راهاندازی کلاستری که مقدار مورد نیاز گرههای Worker را فراهم میکند، بسیار مهم است.
- منابع انسانی – همانطور که ممکن است متوجه شده باشید، Kubernetes یک فناوری پیچیده است که برای راه اندازی و مدیریت به DevOps بسیار حرفهای نیاز دارد. بنابراین، اگر تصمیم دارید.
جایگزینهای کوبرنتیز
اگر از کانتینرسازی در برنامه خود استفاده میکنید و نمیخواهید از Kubernetes بهره ببرید، دو گزینه جایگزین وجود دارد:
- از یک ارکستراتور متفاوت و سادهتر استفاده کنید
- کانتینرها را به صورت دستی هماهنگ کنید
از یک ارکستراتور متفاوت استفاده کنید
Kubernetes محبوبترین پلتفرم ارکستراسیون است، اما تعداد زیادی ارکستراتور دیگر وجود دارد که میتوانید برای پروژه خود در نظر بگیرید. محبوب ترینها عبارتند از:
- Docker Swarm، یک راه حل بومی کلاستر بندی و ارکستراسیون برای کانتینرهای Docker
- Apache Mesos، یک مدیر کلاستر همه منظوره که میتواند کانتینرها را نیز هماهنگ کند
- Nomad، برنامهریز و ارکستراتور متنباز از HashiCorp
- Amazon ECS (سرویس کانتینر الاستیک)، یک سرویس ارکستراسیون کانتینر مدیریت شده که توسط AWS ارائه میشود
- Google Cloud Run، یک پلتفرم کانتینری کاملا مدیریت شده که بر محاسبات بدون سرور و اجرای کانتینر تمرکز دارد.
کانتینرها را به صورت دستی هماهنگ کنید
ارکستراسیون دستی کانتینرها به این معنی است که شما یک اسکریپت با پارامترهای مشخص شده برای مدیریت کانتینرها مینویسید که با استفاده از ارکستراتورها مخالف است، جایی که شما به سادگی پارامترهای لازم را برای ارکستراسیون تنظیم میکنید.
در سناریوی ارکستراسیون دستی، توصیه میکنیم از Jenkins استفاده کنید که به شما امکان میدهد تا به سرعت وظایف مبتنی بر کانتینر را در خط لوله CI/CD ادغام نموده و مدیریت کانتینر را با اسکریپت نویسی خودکار انجام دهید.
در ادامه نحوه استفاده از آن آورده شده است:
- Jenkins را با Git ادغام و تغییراتی را که روی کد اعمال میشود را فعال کنید
- اسکریپتهای bash را تعریف و اجرا کنید
- اسکریپتهای خود را به روشی که نیاز دارید سفارشی کنید
- از مکانیسمهای جنکینز برای رسیدگی به خطاها و اعلانها استفاده کنید
- از افزونه Jenkins’ Docker برای ساده کردن تعامل با Docker استفاده کنید
خدمات مدیریت شده Kubernetes
اگر میخواهید از Kubernetes استفاده کنید، اما نمیخواهید خودتان آن را پیکربندی کنید، باید خدمات مدیریتشده Kubernetes را به عنوان جایگزین دیگری در نظر بگیرید، زیرا میتوانید از تنظیمات از پیش تعریفشده ارائهشده توسط ارائهدهندگان ابری شخص ثالث استفاده کنید. در این مورد، باید روی مدیریت کانتینر تمرکز کنید و ارائه دهنده ابر خود کلاستر Kubernetes را مستقر میکند.
چیزی که میتوانید با انتخاب خدمات مدیریت شده دریافت کنید:
- تامین کلاستر(Cluster provisioning)
- مقیاس بندی کلاستر
- ارتقای کلاستر
- ابزارهای امنیتی
- مانیتورینگ و لاگ
- بکاپ گیری و بازیابی فاجعه
- لود بالانسینگ
- مقیاسپذیری الاستیک منابع (Resource elastic scaling)
- ادغام با سایر خدمات ابری
- ابزارهای مدیریت هزینه
محبوبترین سرویسهای مدیریت شده Kubernetes عبارتند از:
- Amazon Elastic Kubernetes Service (EKS)Google Kubernetes Engine (GKE)
- Azure Kubernetes Service (AKS)
- DigitalOcean Kubernetes
- Rancher
- Red Hat OpenShift Dedicated