خب برای اینکه یه درک خیلی خوبی از کوبرنتیز پیدا کنیم بهتره قبل از اینکه بریم سراغ کوبرنتیز (Kubernetes) چیست یه مقدار در مورد معماری اپلیکیشن ها صحبت کنیم. توی گذشته، اکثر برنامهها به صورت یکپارچه (monolithic) طراحی و پیادهسازی میشدند، یعنی تمام اجزای یه برنامه (مثل بک اند، دیتابیس، و فرانت) به صورت یکپارچه در یک واحد قرار داشتند. هرچند این ساختار توی مقیاسهای کوچیک کارآمد بود، اما با افزایش پیچیدگی و تعداد کاربران، برای تغییر یا مقیاسدهی یه بخش برنامه نیاز بود تغییر توی کل سیستم اتفاق بیفته که این موضوع باعث افزایش هزینههای نگهداری و توسعه برنامهها میشد.
خب با گذشت زمان و افزایش نیاز به مقیاسپذیری و سرعت توسعه نرم افزار، مدل monolithic پاسخگوی نیازهای روز نبود و به تدریج معماری microservices جای اون را گرفت. تو این معماری، برنامه به چندین سرویس کوچک و مستقل تقسیم میشه که هر کدام میتونه به طور مستقل توسعه (develop)، استقرار (deploy) و مدیریت بشه. هر میکروسرویس به یک وظیفه خاص اختصاص دارد و ارتباطشون از طریق پروتکلهای شبکهای مثل HTTP انجام میشه. این معماری باعث شد که مقیاسدهی، بهبود عملکرد و انعطافپذیری در توسعه نرمافزار به شکل چشمگیری افزایش پیدا کنه.
با رشد معماری microservices و نیاز به مدیریت صدها یا هزاران سرویس کوچیک، چالشهای جدیدی برای توسعهدهندگان و تیمهای زیر ساخت به وجود اومد از جمله اینکه مدیریت تعداد زیاد microservice به صورت دستی، یا اینکه خطا یابی microservice ها کار سختی بود، خلاصه ای از چالش هایی که تیم های زیر ساخت داشتن موارد زیر بود:
اولین شرکتی که احساس نیاز پیدا کرد گوگل بود و دنبال روشی رفت که تمام این موارد رو به صورت اتومیشن بتونه انجام بده در واقع تمام این چالشها گوگل رو به فکر توسعه سیستمی انداخت که بتونه این مشکلات را برطرف کند. گوگل با تجربه ده ساله خود در مدیریت سرویسهای عظیم داخلی، در سال ۲۰۱۴ Kubernetes رو معرفی کرد. Kubernetes یک سیستم متنباز برای مدیریت خودکار کانتینرها است که به توسعهدهندگان و مدیران سیستم این امکان را میده تا به سادگی برنامههای خود را در قالب کانتینرها استقرار دهند و مدیریت کنند.
کوبرنتیز (Kubernetes) به دلیل قابلیتهایی مثل:
به سرعت به یکی از ابزارهای کلیدی در معماریهای مدرن microservices تبدیل شد و اکنون به عنوان استانداردی در مدیریت زیرساختهای ابری و غیر ابری شناخته میشود.
کوبرنتیز یک سیستم نرمافزاری متنبازه که به شما این امکان رو میده تا برنامههای کانتینریشده رو به راحتی استقرار (deploy) و مدیریت کنید. یکی از ویژگیهای کلیدی کوبرنتیز این است که برنامهها را در کانتینرها اجرا میکنه. این کانتینریسازی به این معناست که هر برنامه به طور جداگانه و مستقل از سایر برنامهها اجرا میشه، حتی اگر همه آنها روی یک سرور مشترک باشند.
از آنجا که برنامهها داخل کانتینرها اجرا میشوند، هیچ گونه تداخلی بین آنها و سایر برنامههای در حال اجرا در همان سرور وجود ندارد. این مسئله نه تنها امنیت و ثبات برنامهها را افزایش میدهد، بلکه باعث میشود منابع سرور به شکل بهینهتری مورد استفاده قرار گیرند.
به طور کلی، کوبرنتیز مدیریت خودکار کانتینرها، مقیاسپذیری و استقرار ساده برنامهها را فراهم میکند و به تیمهای توسعه و عملیات کمک میکند تا برنامههای خود را به صورت سریعتر و مؤثرتر در محیطهای مختلف پیادهسازی کن
همانطور که قبلاً اشاره شد، هر کلاستر کوبرنتیز از یک یا چند Master Node (که به آنها Control Plane Node هم میگویند) و چندین Worker Node تشکیل میشود. در این بخش به نقش و وظایف این نودها میپردازیم:
در شکل زیر نمای کلی از اجزای هر دو نوع Node (Master و Worker) نمایش داده شده که به شما دید بهتری از نحوه عملکرد و تعامل این اجزا با همدیگه ر وبهتون میده
اجزای Control Plane در کوبرنتیز وظیفهی مدیریت و کنترل کامل کلاستر را بر عهده دارند. این بخش شامل چندین مؤلفه حیاتی است که هر یک نقش مهمی در عملکرد کلاستر دارند. در ادامه به توضیح جزئیات هر یک از این اجزا میپردازیم:
پل ارتباطی بین تمام اجزای کلاستر و کاربران (کلاینتها) است. این سرویس به عنوان رابط اصلی برای برقراری ارتباط با سایر اجزای Control Plane عمل میکند و درخواستهای RESTful را از کلاینتها دریافت و به اجزای دیگر ارسال میکند. کلاینتها میتوانند از طریق kubectl
یا سایر ابزارها به API Server دسترسی داشته باشند و تنظیمات و وضعیت کلاستر را تغییر دهند.
وظیفه اصلیش اینه تعیین کنه هر اپلیکیشن (Pod) روی کدوم نود مستقر بشه. این سرویس بر اساس منابع موجود در هر نود (مانند CPU و RAM) و نیازهای تعریف شده برای هر پاد (مثل درخواستهای منابع) تصمیمگیری میکنه و پادها را به نودهای مناسب تخصیص میده. این فرایند تضمین میکند که منابع موجود به بهترین شکل ممکن استفاده میشه و بار کاری بین نودهای مختلف توزیع شود.
مجموعهای از کنترلرها را مدیریت میکند که هر کدام مسئول اجرای عملکردهای خاصی در کلاستر هستند. به عنوان مثال:
وضعیت نودهای worker را پیگیری میکند و خرابیهای احتمالی نودها را مدیریت میکند.
تضمین میکند که تعداد مورد نیاز از پادها در حال اجرا باشند. اگر پادها خراب شوند یا از بین بروند، این کنترلر پادهای جدید را برای جایگزینی آنها ایجاد میکند.
وظیفهاش نگه داشتن اطلاعات در مورد سرویسها و پادهایی است که این سرویسها را پشتیبانی میکنند.
این کنترلرها به صورت پیوسته وضعیت کلاستر را مانیتور میکنند و به تغییرات به طور خودکار پاسخ میدهند.
یک پایگاه داده توزیعشده و مقیاسپذیر است که تمام دادههای پیکربندی و وضعیت کلاستر کوبرنتیز را ذخیره میکند. این دیتابیس از یک معماری Key-Value استفاده میکند که اطلاعات مربوط به پادها، سرویسها، تنظیمات شبکه، وضعیت نودها و بسیاری از اجزای دیگر را ذخیره و بازیابی میکند. etcd نقش کلیدی در حفظ همگامسازی وضعیت کلاستر ایفا میکند و تضمین میکند که اطلاعات به صورت دقیق و پایدار باقی بمانند.
اجزای Control Plane مسئولیت مدیریت وضعیت کلی کلاستر، تصمیمگیری در مورد استقرار اپلیکیشنها و حفظ وضعیت مطلوب سیستم را بر عهده دارند. این اجزا به طور مستقیم اپلیکیشنها را اجرا نمیکنند، بلکه اپلیکیشنها و بارهای کاری توسط Worker Nodes اجرا میشوند. هر Worker Node پادهای مختلفی را اجرا میکند که در نهایت اپلیکیشنهای کاربران را تشکیل میدهند.
با استفاده از اجزای Control Plane، کوبرنتیز به عنوان یک سیستم توزیعشده و خودکار مدیریت منابع، به تیمهای توسعه و عملیات اجازه میدهد تا به راحتی و با اطمینان بالا اپلیکیشنهای خود را بر روی زیرساختهای مختلف پیادهسازی و مدیریت کنند.
در واقع Worker Nodeها سرورهایی هستند که برنامههای کاربردی کانتینری شما را اجرا میکنند. این نودها نقش مهمی در اجرای پادها (Pods) و مدیریت آنها بر عهده دارند. وظیفه اجرای برنامهها، نظارت بر عملکرد آنها، و ارائه خدمات به این برنامهها از طریق اجزای زیر انجام میشود:
مؤلفهای است که مسئول اجرای کانتینرهای شما میباشد. این سرویس با استفاده از ابزارهایی مانند Docker، containerd، یا CRI-O کانتینرهای برنامه را اجرا کرده و عملیات مورد نیاز برای مدیریت چرخه عمر کانتینرها را انجام میدهد. Container Runtime به کوبرنتیز اجازه میدهد تا پادهای حاوی کانتینرها را در نودها اجرا و مدیریت کند.
یکی از مؤلفههای کلیدی هر Worker Node است که با سرور API کوبرنتیز ارتباط برقرار میکند. این سرویس مسئول مدیریت کانتینرها در گره است. Kubelet توصیف پادهایی که باید روی نود اجرا شوند را از سرور API دریافت میکند و مطمئن میشود که کانتینرهای مرتبط با این پادها به درستی اجرا میشوند. همچنین، Kubelet وضعیت کانتینرها را به سرور API گزارش میدهد و در صورت بروز مشکل، اقدامات لازم را انجام میدهد.
یکی دیگر از اجزای مهم در هر Worker Node است که وظیفه مدیریت ترافیک شبکه بین اجزای مختلف برنامه را بر عهده دارد. این سرویس قوانین مسیریابی و فایروال را مدیریت میکند تا اطمینان حاصل کند که ارتباطات بین پادها و سرویسها به درستی برقرار میشود. همچنین، Kube-Proxy به توازن بار (load balancing) بین اجزای برنامه کمک میکند تا ترافیک به صورت یکنواخت توزیع شود.
این اجزا با هم همکاری میکنند تا برنامههای کانتینری شما به درستی روی Worker Nodeها اجرا شوند و ارتباطات شبکهای و منابع بهینهای برای آنها فراهم شود. Worker Nodes با کمک این اجزا، هستهی اجرایی کلاستر کوبرنتیز را تشکیل میدهند و وظایف محاسباتی را انجام میدهند.
برای اجرای یک برنامه در Kubernetes، مراحل زیر باید دنبال شود:
این مراحل به شما کمک میکند تا برنامههای خود را به طور مؤثر در کوبرنتیز اجرا کنید و از مدیریت هوشمندانه منابع و سرویسها در کلاستر خود بهرهمند شوید.
هنگامی که Kubernetes API Server توضیحات برنامه شما را پردازش میکند، Scheduler مسئولیت تعیین Node مناسب برای اجرای پادهای برنامه شما را بر اساس منابع محاسباتی مورد نیاز هر پاد و منابع در دسترس در Worker Node ها رو بر عهده دارد. این فرآیند به صورت خودکار انجام میشود تا بهترین گره برای اجرای پادها انتخاب شود.
مثال زیر رو از کتاب Kubernetes in action آوردم که به نظرم مثال خیلی خوبی برای درک این مثال هست.
فرض کنید میخواهید ۴ کانتینر را در قالب ۳ پاد اجرا کنید:
وقتی درخواست شما به API Server میرسد، Scheduler بر اساس تعداد کپیهای مورد نظر و نیازهای منابع هر پاد، آنها را روی نودهای کارگر مختلف زمانبندی میکند. سپس Kubelet در همان نود به Container Runtime دستور میدهد که تصویر کانتینر را از رجیستری دریافت کرده و آن را اجرا کند. این چرخه تا زمانی که تمام پادهای برنامه شما بر روی نودهای مناسب مستقر و اجرا شوند، ادامه مییابد.
توی این مقاله سعی کردم یه توضیح کلی در مورد تفاوت معماری monolithic و Microservice ها بدم و دلیل نیاز به ابزاری مثل کوبرنتیز رو توضیح دادم. در انتها هم مقداری در مورد ابزار کوبرنتیز صحبت کردم امیدوارم این مقاله براتون مفید بوده باشه.