ویرگول
ورودثبت نام
حسین جعفری
حسین جعفری
خواندن ۱۱ دقیقه·۱۰ روز پیش

کوبرنتیز (Kubernetes) چیست؟ معرفی کوبرنتیز

مقدمه

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

خب با گذشت زمان و افزایش نیاز به مقیاس‌پذیری و سرعت توسعه نرم افزار، مدل monolithic پاسخگوی نیازهای روز نبود و به تدریج معماری microservices جای اون را گرفت. تو این معماری، برنامه به چندین سرویس کوچک و مستقل تقسیم می‌شه که هر کدام می‌تونه به طور مستقل توسعه (develop)، استقرار (deploy) و مدیریت بشه. هر میکروسرویس به یک وظیفه خاص اختصاص دارد و ارتباطشون از طریق پروتکل‌های شبکه‌ای مثل HTTP انجام می‌شه. این معماری باعث شد که مقیاس‌دهی، بهبود عملکرد و انعطاف‌پذیری در توسعه نرم‌افزار به شکل چشم‌گیری افزایش پیدا کنه.

تفاوت معماری  monolitithic و Microservices
تفاوت معماری monolitithic و Microservices


با رشد معماری microservices و نیاز به مدیریت صدها یا هزاران سرویس کوچیک، چالش‌های جدیدی برای توسعه‌دهندگان و تیم‌های زیر ساخت به وجود اومد از جمله اینکه مدیریت تعداد زیاد microservice به صورت دستی، یا اینکه خطا یابی microservice ها کار سختی بود، خلاصه ای از چالش هایی که تیم های زیر ساخت داشتن موارد زیر بود:

  • استقرار و مدیریت تعداد زیادی سرویس به طور خودکار
  • مقیاس‌دهی خودکار (auto scaling) بر اساس نیاز منابع هر سرویس
  • مانیتورینگ و بازیابی خودکار در صورت بروز خطا

اولین شرکتی که احساس نیاز پیدا کرد گوگل بود و دنبال روشی رفت که تمام این موارد رو به صورت اتومیشن بتونه انجام بده در واقع تمام این چالش‌ها گوگل رو به فکر توسعه سیستمی انداخت که بتونه این مشکلات را برطرف کند. گوگل با تجربه ده ساله خود در مدیریت سرویس‌های عظیم داخلی، در سال ۲۰۱۴ Kubernetes رو معرفی کرد. Kubernetes یک سیستم متن‌باز برای مدیریت خودکار کانتینرها است که به توسعه‌دهندگان و مدیران سیستم این امکان را میده تا به سادگی برنامه‌های خود را در قالب کانتینرها استقرار دهند و مدیریت کنند.

کوبرنتیز (Kubernetes) به دلیل قابلیت‌هایی مثل:

  • استقرار خودکار و مدیریت مقیاس‌پذیری برنامه‌ها: کوبرنتیز به شما این امکان را می‌دهد که برنامه‌ها را به راحتی مستقر کرده و به‌طور خودکار مقیاس آن‌ها را بر اساس نیازهای واقعی افزایش یا کاهش دهید.
  • تعادل بار (Load Balancing) بین سرویس‌ها: کوبرنتیز به‌طور خودکار ترافیک شبکه را بین سرویس‌های مختلف پخش می‌کند و مطمئن می‌شود که هیچ سرویس یا نودی بیش از حد بار نگیرد.
  • بازیابی خودکار در صورت بروز خطا: اگر یکی از نودها یا کانتینرها خراب شود، کوبرنتیز به‌طور خودکار آن‌ها را شناسایی و مجدداً راه‌اندازی می‌کند تا خدمات قطع نشوند.
  • مقیاس‌دهی خودکار بر اساس نیازهای واقعی برنامه‌ها: با توجه به بار CPU، حافظه و دیگر منابع، کوبرنتیز به طور خودکار تعداد کانتینرهای در حال اجرا را افزایش یا کاهش می‌دهد.
  • افزایش یا کاهش تعداد برنامه‌های در حال اجرا: کاربران می‌توانند به راحتی تعداد کپی‌های در حال اجرای برنامه‌ها را افزایش یا کاهش دهند و کوبرنتیز به‌طور خودکار این تغییرات را اعمال می‌کند.
  • تضمین اجرای تعداد مشخصی از منابع توسط کوبرنتیز: کوبرنتیز به طور مداوم اطمینان حاصل می‌کند که تعداد مشخصی از منابع (مثل تعداد پادها) که در تعریف برنامه درخواست شده‌اند، همیشه در حال اجرا باشند. در صورت بروز مشکل، آن‌ها را به‌طور خودکار جایگزین می‌کند.

به سرعت به یکی از ابزارهای کلیدی در معماری‌های مدرن microservices تبدیل شد و اکنون به عنوان استانداردی در مدیریت زیرساخت‌های ابری و غیر ابری شناخته می‌شود.

نگاه کلی به کوبرنتیز ببینیم چیه اصلا؟

کوبرنتیز یک سیستم نرم‌افزاری متن‌بازه که به شما این امکان رو میده تا برنامه‌های کانتینری‌شده رو به راحتی استقرار (deploy) و مدیریت کنید. یکی از ویژگی‌های کلیدی کوبرنتیز این است که برنامه‌ها را در کانتینرها اجرا می‌کنه. این کانتینری‌سازی به این معناست که هر برنامه به طور جداگانه و مستقل از سایر برنامه‌ها اجرا می‌شه، حتی اگر همه آن‌ها روی یک سرور مشترک باشند.

از آنجا که برنامه‌ها داخل کانتینرها اجرا می‌شوند، هیچ گونه تداخلی بین آن‌ها و سایر برنامه‌های در حال اجرا در همان سرور وجود ندارد. این مسئله نه تنها امنیت و ثبات برنامه‌ها را افزایش می‌دهد، بلکه باعث می‌شود منابع سرور به شکل بهینه‌تری مورد استفاده قرار گیرند.

به طور کلی، کوبرنتیز مدیریت خودکار کانتینرها، مقیاس‌پذیری و استقرار ساده برنامه‌ها را فراهم می‌کند و به تیم‌های توسعه و عملیات کمک می‌کند تا برنامه‌های خود را به صورت سریع‌تر و مؤثرتر در محیط‌های مختلف پیاده‌سازی کن

اجزای اصلی کوبرنتیز

همانطور که قبلاً اشاره شد، هر کلاستر کوبرنتیز از یک یا چند Master Node (که به آن‌ها Control Plane Node هم می‌گویند) و چندین Worker Node تشکیل می‌شود. در این بخش به نقش و وظایف این نودها می‌پردازیم:

در شکل زیر نمای کلی از اجزای هر دو نوع Node (Master و Worker) نمایش داده شده که به شما دید بهتری از نحوه عملکرد و تعامل این اجزا با همدیگه ر وبهتون میده

اجزای اصلی کوبرنتیز
اجزای اصلی کوبرنتیز

اجزای Control Plane

اجزای Control Plane در کوبرنتیز وظیفه‌ی مدیریت و کنترل کامل کلاستر را بر عهده دارند. این بخش شامل چندین مؤلفه حیاتی است که هر یک نقش مهمی در عملکرد کلاستر دارند. در ادامه به توضیح جزئیات هر یک از این اجزا می‌پردازیم:

Kubernetes API Server

پل ارتباطی بین تمام اجزای کلاستر و کاربران (کلاینت‌ها) است. این سرویس به عنوان رابط اصلی برای برقراری ارتباط با سایر اجزای Control Plane عمل می‌کند و درخواست‌های RESTful را از کلاینت‌ها دریافت و به اجزای دیگر ارسال می‌کند. کلاینت‌ها می‌توانند از طریق kubectl یا سایر ابزارها به API Server دسترسی داشته باشند و تنظیمات و وضعیت کلاستر را تغییر دهند.

Scheduler

وظیفه‌ اصلیش اینه تعیین کنه هر اپلیکیشن (Pod) روی کدوم نود مستقر بشه. این سرویس بر اساس منابع موجود در هر نود (مانند CPU و RAM) و نیازهای تعریف شده برای هر پاد (مثل درخواست‌های منابع) تصمیم‌گیری می‌کنه و پادها را به نودهای مناسب تخصیص میده. این فرایند تضمین می‌کند که منابع موجود به بهترین شکل ممکن استفاده میشه و بار کاری بین نودهای مختلف توزیع شود.

Controller Manager

مجموعه‌ای از کنترلرها را مدیریت می‌کند که هر کدام مسئول اجرای عملکردهای خاصی در کلاستر هستند. به عنوان مثال:

  • Node Controller

وضعیت نودهای worker را پیگیری می‌کند و خرابی‌های احتمالی نودها را مدیریت می‌کند.

  • Replication Controller

تضمین می‌کند که تعداد مورد نیاز از پادها در حال اجرا باشند. اگر پادها خراب شوند یا از بین بروند، این کنترلر پادهای جدید را برای جایگزینی آن‌ها ایجاد می‌کند.

  • Endpoint Controller

وظیفه‌اش نگه داشتن اطلاعات در مورد سرویس‌ها و پادهایی است که این سرویس‌ها را پشتیبانی می‌کنند.

این کنترلرها به صورت پیوسته وضعیت کلاستر را مانیتور می‌کنند و به تغییرات به طور خودکار پاسخ می‌دهند.

etcd

یک پایگاه داده توزیع‌شده و مقیاس‌پذیر است که تمام داده‌های پیکربندی و وضعیت کلاستر کوبرنتیز را ذخیره می‌کند. این دیتابیس از یک معماری Key-Value استفاده می‌کند که اطلاعات مربوط به پادها، سرویس‌ها، تنظیمات شبکه، وضعیت نودها و بسیاری از اجزای دیگر را ذخیره و بازیابی می‌کند. etcd نقش کلیدی در حفظ همگام‌سازی وضعیت کلاستر ایفا می‌کند و تضمین می‌کند که اطلاعات به صورت دقیق و پایدار باقی بمانند.

جمع‌بندی اجزای Control Plane

اجزای Control Plane مسئولیت مدیریت وضعیت کلی کلاستر، تصمیم‌گیری در مورد استقرار اپلیکیشن‌ها و حفظ وضعیت مطلوب سیستم را بر عهده دارند. این اجزا به طور مستقیم اپلیکیشن‌ها را اجرا نمی‌کنند، بلکه اپلیکیشن‌ها و بارهای کاری توسط Worker Nodes اجرا می‌شوند. هر Worker Node پادهای مختلفی را اجرا می‌کند که در نهایت اپلیکیشن‌های کاربران را تشکیل می‌دهند.

با استفاده از اجزای Control Plane، کوبرنتیز به عنوان یک سیستم توزیع‌شده و خودکار مدیریت منابع، به تیم‌های توسعه و عملیات اجازه می‌دهد تا به راحتی و با اطمینان بالا اپلیکیشن‌های خود را بر روی زیرساخت‌های مختلف پیاده‌سازی و مدیریت کنند.

اجزای Worker Nodes

در واقع Worker Node‌ها سرورهایی هستند که برنامه‌های کاربردی کانتینری شما را اجرا می‌کنند. این نودها نقش مهمی در اجرای پادها (Pods) و مدیریت آن‌ها بر عهده دارند. وظیفه اجرای برنامه‌ها، نظارت بر عملکرد آن‌ها، و ارائه خدمات به این برنامه‌ها از طریق اجزای زیر انجام می‌شود:

Container Runtime

مؤلفه‌ای است که مسئول اجرای کانتینرهای شما می‌باشد. این سرویس با استفاده از ابزارهایی مانند Docker، containerd، یا CRI-O کانتینرهای برنامه را اجرا کرده و عملیات مورد نیاز برای مدیریت چرخه عمر کانتینرها را انجام می‌دهد. Container Runtime به کوبرنتیز اجازه می‌دهد تا پادهای حاوی کانتینرها را در نودها اجرا و مدیریت کند.

Kubelet

یکی از مؤلفه‌های کلیدی هر Worker Node است که با سرور API کوبرنتیز ارتباط برقرار می‌کند. این سرویس مسئول مدیریت کانتینرها در گره است. Kubelet توصیف پادهایی که باید روی نود اجرا شوند را از سرور API دریافت می‌کند و مطمئن می‌شود که کانتینرهای مرتبط با این پادها به درستی اجرا می‌شوند. همچنین، Kubelet وضعیت کانتینرها را به سرور API گزارش می‌دهد و در صورت بروز مشکل، اقدامات لازم را انجام می‌دهد.

Kube-Proxy

یکی دیگر از اجزای مهم در هر Worker Node است که وظیفه مدیریت ترافیک شبکه بین اجزای مختلف برنامه را بر عهده دارد. این سرویس قوانین مسیریابی و فایروال را مدیریت می‌کند تا اطمینان حاصل کند که ارتباطات بین پادها و سرویس‌ها به درستی برقرار می‌شود. همچنین، Kube-Proxy به توازن بار (load balancing) بین اجزای برنامه کمک می‌کند تا ترافیک به صورت یکنواخت توزیع شود.

این اجزا با هم همکاری می‌کنند تا برنامه‌های کانتینری شما به درستی روی Worker Nodeها اجرا شوند و ارتباطات شبکه‌ای و منابع بهینه‌ای برای آن‌ها فراهم شود. Worker Nodes با کمک این اجزا، هسته‌ی اجرایی کلاستر کوبرنتیز را تشکیل می‌دهند و وظایف محاسباتی را انجام می‌دهند.

اجرای برنامه در Kubernetes

برای اجرای یک برنامه در Kubernetes، مراحل زیر باید دنبال شود:

  1. کانتیرایز کردن برنامه: اولین قدم این است که برنامه خود را در قالب یک کانتینر در بیاورید. این فرآیند شامل بسته‌بندی تمام وابستگی‌های برنامه در یک container image است. سپس این ایمیج باید به یک image registry (مانند Docker Hub یا یک رجیستری خصوصی) ارسال شود تا قابل دسترسی برای کلاستر کوبرنتیز باشد.
  2. ارسال توضیحات برنامه به Kubernetes API: پس از آنکه برنامه خود را به شکل کانتینری درآوردید و به رجیستری ارسال کردید، باید توضیحاتی درباره آن را به سرور API کوبرنتیز ارائه دهید. این توضیحات شامل موارد زیر می‌باشد:Container image: تصویر کانتینری که حاوی برنامه است.
    ارتباطات بین مؤلفه‌ها: اینکه مؤلفه‌های مختلف برنامه چگونه با یکدیگر ارتباط دارند و کدام مؤلفه‌ها باید در یک گره (node) به طور همزمان اجرا شوند (co-located) و کدام‌ها نیازی به این کار ندارند.
    تعیین تعداد نسخه‌ها (replicas): برای هر مؤلفه می‌توانید تعداد نسخه‌های مورد نیاز را مشخص کنید تا کوبرنتیز آن‌ها را در کلاستر اجرا کند.
  3. ارائه خدمات و آدرس‌دهی IP: علاوه بر اطلاعات مربوط به مؤلفه‌ها، باید تعیین کنید که کدام یک از مؤلفه‌ها به ارائه خدمات به کاربران داخلی یا خارجی می‌پردازند. این مؤلفه‌ها باید از طریق یک آدرس IP واحد در دسترس باشند و به سایر مؤلفه‌ها نیز معرفی شوند تا قابل کشف باشند.

این مراحل به شما کمک می‌کند تا برنامه‌های خود را به طور مؤثر در کوبرنتیز اجرا کنید و از مدیریت هوشمندانه منابع و سرویس‌ها در کلاستر خود بهره‌مند شوید.

درک چگونگی نتایج توصیف در یک کانتینر در حال اجرا

هنگامی که Kubernetes API Server توضیحات برنامه شما را پردازش می‌کند، Scheduler مسئولیت تعیین Node مناسب برای اجرای پادهای برنامه شما را بر اساس منابع محاسباتی مورد نیاز هر پاد و منابع در دسترس در Worker Node ها رو بر عهده دارد. این فرآیند به صورت خودکار انجام می‌شود تا بهترین گره برای اجرای پادها انتخاب شود.

مراحل اجرای برنامه:

  1. ارسال درخواست به API Server: اولین قدم این است که توضیحات برنامه شما (از جمله نیازهای منابع و تعداد نسخه‌های پاد) به سرور API ارسال شود. این توضیحات شامل جزئیاتی مانند تعداد کانتینرها و پادها، نیازهای منابع و تعداد کپی‌های مورد نیاز برای هر پاد است.
  2. تعیین Node توسط Scheduler: پس از پردازش درخواست توسط API، Scheduler با توجه به منابع موجود در هر گره و نیازهای منابع برنامه، نودهای کارگر مناسبی را برای استقرار پادها انتخاب می‌کند. این برنامه‌ریزی به گونه‌ای انجام می‌شود که بار کاری به طور یکنواخت در سراسر کلاستر توزیع شود.
  3. دستور اجرای کانتینر توسط Kubelet: پس از اینکه Scheduler گره مناسب را تعیین کرد، Kubelet روی همان گره (Worker Node) به Container Runtime (مثل Docker) دستور می‌دهد تا تصویر کانتینر را از Image Registry (مثلاً Docker Hub) دانلود کرده و کانتینرها را اجرا کند.

مثال زیر رو از کتاب Kubernetes in action آوردم که به نظرم مثال خیلی خوبی برای درک این مثال هست.

فرض کنید می‌خواهید ۴ کانتینر را در قالب ۳ پاد اجرا کنید:

  • پاد اول و پاد دوم هر کدام شامل یک کانتینر هستند.
  • پاد سوم شامل دو کانتینر است که به طور همزمان در همان پاد اجرا می‌شوند.
  • همچنین برای هر پاد می‌توانید تعداد نسخه‌ها (replicas) را تعیین کنید. به عنوان مثال، ممکن است بخواهید سه کپی از Pod اول داشته باشید و دو کپی از Pod دوم.

وقتی درخواست شما به API Server می‌رسد، Scheduler بر اساس تعداد کپی‌های مورد نظر و نیازهای منابع هر پاد، آن‌ها را روی نودهای کارگر مختلف زمان‌بندی می‌کند. سپس Kubelet در همان نود به Container Runtime دستور می‌دهد که تصویر کانتینر را از رجیستری دریافت کرده و آن را اجرا کند. این چرخه تا زمانی که تمام پادهای برنامه شما بر روی نودهای مناسب مستقر و اجرا شوند، ادامه می‌یابد.

توی این مقاله سعی کردم یه توضیح کلی در مورد تفاوت معماری monolithic و ‌Microservice ها بدم و دلیل نیاز به ابزاری مثل کوبرنتیز رو توضیح دادم. در انتها هم مقداری در مورد ابزار کوبرنتیز صحبت کردم امیدوارم این مقاله براتون مفید بوده باشه.



kubernetesکوبرنتیزworker nodeمدیریتبهبود عملکرد
شاید از این پست‌ها خوشتان بیاید