با گسترش زیرساختهای ابری، برخی سازمانها بارهای کاری خود را در چند کلاستر کوبرنتیز اجرا میکنند. این کلاسترها ممکن است در چند ابر عمومی، دیتاسنتر خصوصی یا محیط Edge قرار داشته باشند. با افزایش تعداد کلاسترها، هماهنگسازی استقرارها، انتخاب مقصد مناسب برای هر بار کاری (workload) و واکنش به کاهش ظرفیت یا خرابی یک کلاستر دشوارتر میشود. در چنین شرایطی، کارمادا یک لایه هماهنگسازی مرکزی برای مدیریت بارهای کاری میان چند کلاستر کوبرنتیز فراهم میکند. این سیستم با استفاده از APIهای آشنای کوبرنتیز و سیاستهای تعریفشده، درباره محل اجرای بارهای کاری و نحوه توزیع آنها میان کلاسترهای عضو تصمیم میگیرد. در ادامه بررسی میکنیم که کارمادا چیست، معماری آن چگونه کار میکند و استفاده از آن در چه شرایطی توجیه دارد.
چرا مدیریت چند کلاستر کوبرنتیز دشوار است؟
با افزایش مقیاس زیرساخت، ممکن است سازمانها بارهای کاری خود را در چند دیتاسنتر، ابر عمومی یا محیط Edge اجرا کنند. در این وضعیت، هر کلاستر همچنان یک مقصد اجرایی مستقل است و تیم عملیات باید استقرارها، تنظیمات و وضعیت آن را در کنار کلاسترهای دیگر مدیریت کند. افزایش تعداد کلاسترها در عمل چالشهای زیر را ایجاد میکند:
- پراکندگی تنظیمات و پیکربندی: در مدیریت ایستای چند کلاستر، تیمها ممکن است ناچار شوند قواعد Placement، یعنی قواعد انتخاب کلاستر مقصد و نحوه توزیع بار کاری، را بهصورت ثابت تعریف کنند. همچنین باید مانیفستهای مشابهی برای تعریف منابع و تنظیمات بار کاری بسازند و چند Context را مدیریت کنند. هر Context مجموعهای از تنظیمات Kubeconfig است که کلاستر، کاربر و Namespace هدف را مشخص میکند. با افزایش تعداد کلاسترها، هماهنگ نگهداشتن این تعاریف و مقصدهای استقرار دشوارتر میشود.
- دشواری انتخاب محل اجرای بار کاری: انتخاب کلاستر مقصد فقط به نام یا موقعیت آن محدود نیست و ممکن است به ظرفیت در دسترس، Affinity (قواعد ترجیح یا الزام برای انتخاب محل اجرای بار کاری) و قواعد توزیع بار کاری وابسته باشد. با تغییر وضعیت کلاسترها، قواعد ثابت یا انتخاب دستی نمیتوانند همیشه مقصد مناسبی را برای اجرای بار کاری تعیین کنند.
- نبود Failover خودکار: داشتن چند کلاستر بهتنهایی باعث نمیشود بارهای کاری یک کلاستر ناموفق در کلاستر سالم دیگری اجرا شوند. بدون یک سازوکار ارکستریشن یا فرایند عملیاتی مشخص، تیم باید مقصد استقرار را تغییر دهد و اجرای مجدد بار کاری را مدیریت کند.
در نتیجه، چند کلاستر مستقل بهتنهایی دسترسپذیری بالا سراسری ایجاد نمیکنند. در زیرساختهایی که محل اجرا، توزیع ظرفیت و انتقال خودکار در زمان خرابی باید میان چند کلاستر هماهنگ شود، به یک لایه هماهنگسازی مرکزی نیاز است. کارمادا برای پاسخ به این نیازها طراحی شده است.
Karmada چیست؟
کارمادا (Karmada)، کوتاهشده عبارت Kubernetes Armada، یک سیستم مدیریت و ارکستریشن چندکلاستری برای کوبرنتیز است. این سیستم امکان اجرای برنامههای Cloud-Native را در چند کلاستر و چند محیط ابری فراهم میکند، بدون آنکه برای این منظور لازم باشد تعریف اصلی برنامهها تغییر کند.
کلاسترهای عضو کارمادا میتوانند در ابر عمومی، دیتاسنتر خصوصی یا محیط Edge قرار داشته باشند. کارمادا با APIهای بومی کوبرنتیز کار میکند و یک کنترلپلین (Control Plane) بالاتر از کلاسترهای عضو در اختیار تیم قرار میدهد تا تعریف بارهای کاری و قواعد توزیع آنها بهصورت متمرکز مدیریت شود.
کارمادا جایگزین کوبرنتیز نیست؛ بلکه روی کلاسترهای آن یک لایه مدیریتی و هماهنگسازی ایجاد میکند. همچنین کارمادا ابزار ایجاد یا تأمین کلاسترهای کوبرنتیز و جایگزین Service Mesh نیست و بهتنهایی ارتباط شبکهای میان کلاسترها را برقرار نمیکند. مدیریت بار کاری هم با مدیریت داده یکسان نیست؛ بنابراین کارمادا دادههای برنامه را بهطور خودکار میان کلاسترها همانندسازی نمیکند و دسترسی کلاستر مقصد به دادههای موردنیاز را نیز تضمین نمیکند. علاوه بر این، معماری ذخیرهسازی، همانندسازی و حفظ سازگاری دادهها باید جداگانه طراحی شود.
کارمادا یک پروژه Incubating در بنیاد CNCF است. این عنوان وضعیت بلوغ و پذیرش پروژه را در چرخه CNCF نشان میدهد و به معنای بتا بودن نرمافزار نیست. برای آشنایی بیشتر با این پروژه، میتوانید به وبسایت رسمی Karmada مراجعه کنید.
معماری کارمادا چگونه کار میکند؟
معماری کارمادا بر یک کنترلپلین مرکزی استوار است که منابع، سیاستها و تصمیمهای مربوط به توزیع بارهای کاری را مدیریت میکند. API Server نقطه ورود درخواستها و APIهای کارمادا است و etcd اشیای API را نگهداری میکند. Controller Manager مجموعهای از کنترلگرها را اجرا میکند که منابع کارمادا را مشاهده و عملیات لازم برای انتشار آنها در کلاسترهای عضو را هماهنگ میکنند. Scheduler هم بر اساس سیاستهای تعریفشده، دربارهٔ محل اجرای بارهای کاری در کلاسترهای عضو تصمیم میگیرد و به عبارتی فرایند زمانبندی را انجام میدهد.
کلاسترهای عضو، کلاسترهای مستقلی هستند که بارهای کاری توزیعشده از سوی کارمادا را اجرا میکنند. چرخه ساده انتشار یک بار کاری به این صورت است:
- مرحله ۱: کاربر یک منبع کوبرنتیز، مانند Deployment را در کنترلپلین کارمادا تعریف میکند.
- مرحله ۲: سیاست انتشار (PropagationPolicy) مشخص میکند چه منابعی انتخاب شوند و در کدام کلاسترها انتشار یابند.
- مرحله ۳: Scheduler بر اساس سیاست و اطلاعات کلاسترها درباره محل اجرای منبع تصمیم میگیرد.
- مرحله ۴: نتیجه Scheduler در یک ResourceBinding ثبت میشود.
- مرحله ۵: کنترلگرهای کارمادا بر اساس این Binding، منابع Work موردنیاز کلاسترهای مقصد را ایجاد میکنند.
- مرحله ۶: منابع تعریفشده از طریق Work در کلاسترهای عضو مقصد اعمال میشوند و بار کاری در آن کلاسترها اجرا میشود.
در این مدل، تعریف اصلی بار کاری از قواعد محل اجرا جدا میشود. کاربر منبع و سیاست مربوط به آن را در کنترلپلین ثبت میکند و کارمادا بر اساس همان سیاست، تصمیم زمانبندی را ثبت و منابع موردنیاز را در کلاسترهای مقصد منتشر میکند.
کارمادا از دو مدل برای اتصال کلاسترهای عضو پشتیبانی میکند. در حالت Push، کنترلپلین مستقیماً به API Server کلاستر عضو (Member Cluster) متصل میشود و منابع را در آن منتشر میکند. در حالت Pull، مؤلفه karmada-agent داخل کلاستر عضو اجرا میشود، از همانجا با کنترلپلین ارتباط برقرار میکند و منابع تخصیصیافته را دریافت و در کلاستر عضو اجرا میکند. این عامل جزء ثابت کنترلپلین نیست و فقط در مدل Pull کاربرد دارد. انتخاب میان این دو مدل به توپولوژی شبکه، محدودیتهای فایروال و الزامات امنیتی بستگی دارد.
قابلیتها و کاربردهای اصلی Karmada
قابلیت اصلی کارمادا، جداسازی تعریف بار کاری از قواعد انتخاب کلاستر، توزیع Replicaها و اعمال تنظیمات وابسته به محیط است. در ادامه مهمترین قابلیتها و سناریوهای کاربرد آن را بررسی میکنیم.
استقرار بارهای کاری بر اساس سیاست انتشار (Policy)
سیاست انتشار (PropagationPolicy) مشخص میکند چه منابعی انتخاب شوند، در کدام کلاسترها انتشار یابند و Replicaهای آنها چگونه میان کلاسترهای مقصد توزیع شوند. به این ترتیب، مانیفست اصلی بار کاری، از قواعد محل اجرا جدا باقی میماند.
اگر مقصد اجرای بار کاری تغییر کند یا کلاسترهای دیگری به مجموعه مقصد اضافه شوند، میتوان سیاست را تغییر داد؛ بدون آنکه لزوما مانیفست اصلی بار کاری ویرایش شود.
توزیع Replicaها میان کلاسترها
در حالت Duplicated، تعداد Replica تعریفشده در هر کلاستر مقصد ایجاد میشود. برای مثال، اگر یک Deployment با ۵ عدد Replica در ۳ کلاستر توزیع شود، هر کلاستر، ۵ عدد Replica و در مجموع ۱۵ عدد Replica دریافت میکند.
در حالت Divided، تعداد کل Replicaها میان کلاسترهای مقصد تقسیم میشود. برای مثال، اگر تعداد کل ۱۵ عدد Replica باشد و ۳ کلاستر با شرایط یکسان انتخاب شوند، ممکن است در هر کلاستر ۵ عدد Replica اجرا شود. این توزیع میتواند با توجه به سیاست و وضعیت منابع کلاسترها متفاوت باشد.
اعمال تنظیمات متفاوت برای هر کلاستر
یک مانیفست یکسان همیشه برای تمام کلاسترها مناسب نیست. ممکن است StorageClass ،Container Registry ،IngressClass ،Annotationهای وابسته به Cloud Provider یا تنظیمات مرتبط با Region در کلاسترهای مختلف تفاوت داشته باشند.
سیاست بازنویسی (OverridePolicy) امکان میدهد پیش از انتشار منبع در کلاستر مقصد، بخشهای مشخصی از آن برای همان محیط تغییر کنند. در نتیجه، مانیفست پایه در کنترلپلین ثابت میماند و نسخه منتشرشده در کلاستر مقصد تنظیمات متناسب با آن محیط را دریافت میکند.
Failover
کارمادا میتواند وضعیت کلاسترهای عضو را در تصمیمهای Placement و Failover لحاظ کند و بر اساس سیاستهای پیکربندیشده، بارهای کاری را در کلاسترهای سالم اجرا کند. اگر یک کلاستر ناموفق تشخیص داده شود، کارمادا میتواند بر اساس سیاستهای پیکربندیشده، بارهای کاری آن را برای اجرا در کلاستر سالم دیگری در نظر بگیرد.
انتقال بار کاری به کلاستر دیگر، بهتنهایی بازیابی کامل برنامههای Stateful را تضمین نمیکند. اگر هنگام اختلال شبکه، برنامه همزمان در کلاستر مبدأ و مقصد فعال بماند، ممکن است هر دو نسخه بهطور مستقل، دادهها را تغییر دهند و باعث ناسازگاری یا خرابی داده شوند؛ وضعیتی که به آن Split-Brain میگویند. علاوه بر جلوگیری از این وضعیت، کلاستر مقصد نیز باید ظرفیت کافی برای اجرای بار کاری منتقلشده داشته باشد.
سناریوهای کاربردی
سناریوهای کاربرد کارمادا شامل Multi-Cloud ،Hybrid Cloud ،Cloud Bursting، بازیابی بار کاری پس از خرابی یک کلاستر، استقرار جغرافیایی و کاهش دامنه خرابی از طریق توزیع بارهای کاری میان چند کلاستر است.
این سناریوها هزینه و پیچیدگی عملیاتی خاص خود را دارند و البته ارتباط شبکه میان کلاسترها، مانیتورینگ چندلایه، کنترل دسترسی و مدیریت Failover باید جداگانه طراحی و نگهداری شوند. در نتیجه، استفاده از کارمادا زمانی توجیه دارد که مسئله واقعی Placement یا Failover در چند کلاستر مطرح باشد.
تفاوت GitOps با کارمادا چیست؟
ابزارهای GitOps مانند Argo CD و Flux بر تحویل تعریفی و همگامسازی وضعیت مقصد با منابع ثبتشده در Git تمرکز دارند. این ابزارها میتوانند چند کلاستر را نیز مدیریت کنند، اما مقصدها و وضعیت مطلوب معمولاً در پیکربندی GitOps تعریف میشوند.
کارمادا بر محل اجرا، زمانبندی و انتشار بار کاری میان کلاسترهای عضو تمرکز دارد. این سیستم با استفاده از سیاستها و اطلاعات کلاسترها تعیین میکند بار کاری در کدام مقصدها اجرا شود و Replicaهای آن چگونه میان کلاسترها توزیع شوند.

بنابراین، تفاوت اصلی این نیست که GitOps از چند کلاستر پشتیبانی نمیکند، بلکه تفاوت اصلی در این است که کارمادا یک موتور زمانبندی و محلیابی چندکلاستری در اختیار میگذارد، در حالیکه GitOps اساسا وضعیت تعریفشده در Git را با مقصدهای تعیینشده همگام میکند.
کارمادا و GitOps میتوانند در کنار یکدیگر استفاده شوند. برای مثال، ابزار GitOps میتواند بارهای کاری، سیاستهای انتشار (PropagationPolicy) و سیاستهای بازنویسی (OverridePolicy) را با کنترلپلین کارمادا همگام کند و کارمادا هم محل اجرا و انتشار آنها در کلاسترهای عضو را بر عهده بگیرد.
مزایا و محدودیتهای کارمادا
کارمادا قابلیتهای مشخصی را برای هماهنگسازی چندکلاستری ارائه میکند، اما در عین حال یک کنترلپلین و لایه عملیاتی جدید به زیرساخت اضافه میکند. بهاینترتیب، ارزیابی آن باید همزمان بر اساس مزایای زمانبندی و هزینه نگهداری این لایه انجام شود.
مزایای کارمادا
اگر بدانید مهمترین مزایای کارمادا چیست، میتوانید تشخیص دهید که آیا این ابزار برای مدیریت چند کلاستر کوبرنتیز در سازمان شما مناسب است یا خیر. مهمترین مزایای آن عبارتاند از:
- سازگاری با APIهای Kubernetes: کارمادا با APIها و منابع آشنای کوبرنتیز کار میکند و میتواند با ابزارهای موجود این اکوسیستم یکپارچه شود.
- مدیریت متمرکز چند کلاستر: بارهای کاری، سیاستها و تصمیمهای محل اجرا از طریق کنترلپلین کارمادا مدیریت میشوند.
- جداسازی تعریف بار کاری از قواعد استقرار: میتوان یک بار کاری را مستقل از محل اجرای آن تعریف کرد و بعدا با سیاستهای جداگانه مشخص کرد که در چه کلاسترهایی اجرا شود.
- توزیع و زمانبندی Replicaها: کارمادا از توزیع Duplicated و Divided پشتیبانی میکند و میتواند Replicaهای یک بار کاری را بر اساس سیاست میان کلاسترهای مقصد توزیع کند.
- پشتیبانی از معماریهای Multi-Cloud و Hybrid Cloud: کارمادا برای اجرای بارهای کاری در چند ابر یا ترکیب ابر عمومی و دیتاسنتر خصوصی طراحی شده است.
- سازگاری با ابزارهای موجود کوبرنتیز: کارمادا را میتوان در کنار ابزارهای دیگر اکوسیستم کوبرنتیز به کار گرفت.
- کاهش وابستگی در لایه هماهنگسازی: کارمادا میتواند توزیع بارهای کاری میان چند محیط ابری را از سازوکار اختصاصی یک ارائهدهنده ابر مستقلتر کند. بااینحال، وابستگی اپلیکیشن به سرویسهای اختصاصی هر ارائهدهنده را بهطور خودکار از بین نمیبرد.
محدودیتهای کارمادا
شناخت مزایا بهتنهایی کافی نیست و در کنار آن باید بدانید محدودیتهای کارمادا چیست. از جمله این محدودیتها، میتوان موارد زیر را نام برد:
- اضافهشدن یک کنترلپلین جدید: API Server، ذخیرهساز داده، کنترلگرها و اجزای زمانبندی این لایه باید ایمنسازی، پایش، پشتیبانگیری و نگهداری شوند.
- افزایش پیچیدگی مانیتورینگ و عیبیابی: ممکن است که بررسی علت یک مشکل نیازمند بررسی همزمان کلاستر عضو و کنترلپلین کارمادا باشد.
- نیاز به طراحی دقیق ارتباط شبکه: اتصال کنترلپلین به کلاسترهای عضو، مخصوصا وقتی کلاسترها در شبکهها یا محیطهای مختلف باشند، نیازمند طراحی جداگانه است.
- پیچیدهترشدن RBAC و مدیریت دسترسی: با اضافهشدن یک لایه مدیریتی جدید، مدیریت مجوزهای دسترسی هم پیچیدهتر میشود.
- افزایش فشار عملیاتی در خرابی گسترده: خرابی یک کلاستر بزرگ میتواند باعث زمانبندی مجدد همزمان تعداد زیادی بار کاری و افزایش فشار بر کنترلپلین کارمادا و سرور API کلاسترهای سالم شود.
- عدم حل خودکار مسائل ذخیرهسازی و Replication داده: کارمادا مشکلات مربوط به فضای ذخیرهسازی یا همگامسازی دادهها را بهصورت خودکار حل نمیکند.
- نیاز به تیم مسلط به کوبرنتیز و سیستمهای توزیعشده: استفاده مؤثر از کارمادا نیازمند دانش کافی در هر دو حوزه است.
راهاندازی و شروع کار با کارمادا
راهاندازی کارمادا شامل استقرار کنترلپلین، آمادهسازی Kubeconfig، ثبت کلاسترهای عضو و بررسی انتشار بار کاری است. دستورها و جزئیات این فرایند ممکن است در نسخههای مختلف تغییر کنند؛ بنابراین برای اجرای عملی باید از مستند رسمی همان نسخه استفاده شود. در ادامه هر یک از این بخشها را مرور میکنیم.
مراحل کلی راهاندازی کارمادا
برای راهاندازی کارمادا، ابتدا باید با مراحل کلی این فرایند آشنا شوید:
- آمادهسازی یک کلاستر Kubernetes برای میزبانی کنترلپلین کارمادا
- نصب اجزای کنترلپلین، از جمله API Server ،Controller Manager ،Scheduler و etcd
- آمادهسازی Kubeconfig مربوط به کارمادا
- اتصال کلاسترهای عضو به روش Push یا Pull
- بررسی سلامت و دسترسپذیری کلاسترهای عضو
- تعریف بار کاری در کنترلپلین کارمادا
- تعریف سیاست انتشار (PropagationPolicy) برای مشخصکردن کلاسترهای مقصد
- بررسی انتشار بار کاری در کلاسترهای عضو
روشهای نصب کارمادا
کارمادا از چند مسیر نصب از جمله ابزار خط فرمان کارمادا، Helm ،Karmada Operator، نصب از باینری، نصب از سورس و محیط توسعه پشتیبانی میکند. هیچیک از این مسیرها را نمیتوان بدون در نظر گرفتن معماری سازمان، بهطور مطلق بهترین گزینه برای محیط تولید دانست. انتخاب روش عملیاتی به طراحی دسترسپذیری بالا، امنیت، پشتیبانگیری، بهروزرسانی و مدل نگهداری زیرساخت بستگی دارد.
توصیه برای ارزیابی اولیه
اگر هدفتان فقط آشنایی با کارمادا یا اجرای یک نمونه آزمایشی (Proof of Concept) است، میتوانید از محیط توسعه رسمی استفاده کنید. کد منبع و اسکریپت راهاندازی محیط توسعه کارمادا در مخزن رسمی Karmada در GitHub در دسترس است. این محیط، Control Plane و کلاسترهای عضو آزمایشی را بهصورت خودکار آماده میکند و فرایند یادگیری را سادهتر میسازد. البته این محیط برای توسعه و آزمایش طراحی شده است و الگوی مناسبی برای استقرار در محیط عملیاتی نیست.
چه زمانی کارمادا انتخاب مناسبی است؟
کارمادا برای هر زیرساخت کوبرنتیز ضروری نیست. مزیت اصلی آن زمانی آشکار میشود که محل اجرا، توزیع Replicaها یا انتقال خودکار در زمان خرابی باید میان چند کلاستر هماهنگ شود. اگر مقصد بارهای کاری ثابت باشد و ابزارهای موجود نیاز عملیاتی را پوشش دهند، افزودن کارمادا ممکن است فقط پیچیدگی بیشتری ایجاد کند.
چه زمانی استفاده از کارمادا منطقی است؟
اگر شرایط زیر را دارید، کارمادا میتواند انتخاب مناسبی برای مدیریت زیرساخت شما باشد:
- چند کلاستر کوبرنتیز عملیاتی دارید و باید آنها را بهصورت متمرکز مدیریت کنید.
- مقصد اجرای بارهای کاری همیشه ثابت نیست و باید با توجه به شرایط، میان کلاسترهای مختلف انتخاب شود.
- در چند ابر، منطقه جغرافیایی یا دیتاسنتر فعالیت میکنید.
- به توزیع Replicaهای یک بار کاری میان چند کلاستر نیاز دارید.
- Failover در سطح کلاستر و اجرای مجدد بارهای کاری در کلاستر سالم، یکی از نیازهای واقعی شماست.
- تیم Platform Engineering یا SRE توانایی نگهداری و پایش یک Control Plane جدید را دارد.
💡 کوبرنتیز مدیریتشده همروش، راهی مطمئن برای رشد بیوقفه
راهکار کوبرنتیز مدیریت شده، بر بستر ابر اختصاصی یا به صورت On-Premises
✅ کاهش هزینههای عملیاتی
✅ احراز هویت یکپارچه با اتصال به SSO سازمانی
✅ قابل استقرار روی سرورهای on-premises
چه زمانی کارمادا انتخاب مناسبی نیست؟
در برخی سناریوها، استفاده از کارمادا نهتنها مزیت قابلتوجهی ایجاد نمیکند، بلکه میتواند هزینه و پیچیدگی بیشتری به زیرساخت اضافه کند. برای مثال، اگر شرایط زیر را دارید، احتمالا به کارمادا نیازی ندارید:
- فقط یک کلاستر یا چند کلاستر ساده دارید.
- مقصد استقرار بارهای کاری همیشه مشخص و ثابت است.
- ابزار GitOps فعلی تمام نیازهای شما را پوشش میدهد.
- چالش اصلی شما مدیریت فضای ذخیرهسازی یا انتقال و همگامسازی دادههاست.
- تیم شما ظرفیت نگهداری، مانیتورینگ و عیبیابی یک Control Plane دیگر را ندارد.
- هنوز مسئله واقعی Multi-Cluster ندارید و صرفا بهدلیل جذابیت فناوری به استفاده از آن فکر میکنید.
جمعبندی
کارمادا یک لایه مدیریت و هماهنگسازی برای انتشار بارهای کاری میان چند کلاستر کوبرنتیز است. قابلیت محوری آن، جداسازی تعریف بار کاری از قواعد محل اجرا و زمانبندی است؛ بهطوریکه سیاستها مشخص میکنند منابع در کدام کلاسترها اجرا شوند و Replicaها چگونه میان آنها توزیع شوند.
این قابلیتها میتوانند در سناریوهای Multi-Cloud ،Hybrid Cloud، استقرار جغرافیایی متنوع و انتقال خودکار در زمان خرابی در سطح بار کاری مفید باشند. بااینحال، کارمادا یک کنترلپلین جدید به زیرساخت اضافه میکند و مسائل شبکه، ذخیرهسازی و Replication داده را بهتنهایی حل نمیکند.
کارمادا برای سازمانهایی ارزشمند است که با مسائل محل اجرا، ظرفیت و انتقال خودکار در زمان خرابی در چند کلاستر کوبرنتیز روبهرو هستند و همچنین توان نگهداری لایهٔ مدیریتی جدید را دارند. در زیرساختهای سادهتر، اضافهکردن آن احتمالاً مزیتی متناسب با پیچیدگی ایجادشده نخواهد داشت.