Namespace در کوبرنتیز یکی از اجزای پایهای در معماری کلاستر است که برای مدیریت بهتر منابع در محیطهای چندتیمی و چندپروژهای استفاده میشود. این قابلیت امکان ایجاد محدودههای منطقی برای منابع را فراهم میکند تا بتوان سرویسها، محیطها و اپلیکیشنهای مختلف را در یک کلاستر مشترک اما بهصورت جداگانه مدیریت کرد. در این مقاله، مفهوم Namespace، ساختار آن، فضاهای نام پیشفرض، نحوه استفاده و اشتباهات رایج در پیادهسازی آن را بررسی میکنیم.
Namespace در کوبرنتیز چیست؟
Namespace در کوبرنتیز یک مکانیزم برای تقسیمبندی منطقی منابع داخل یک کلاستر است که برای کاهش پیچیدگی مدیریت منابع در محیطهای چندکاربره و چندپروژهای طراحی شده است. این قابلیت اجازه میدهد منابعی مانند Pod ،Service و Deployment در محدودههای جداگانه سازماندهی شوند، بدون اینکه نیاز به ایجاد چند کلاستر مستقل باشد.
در یک کلاستر کوبرنتیز، زمانی که چند تیم، پروژه یا محیط (مانند dev ،staging و production) بهصورت همزمان کار میکنند، قرار گرفتن همه منابع در یک فضای مشترک میتواند باعث پیچیدگی در مدیریت، افزایش احتمال خطا در دسترسیها و دشواری در تفکیک منابع شود. Namespace این مشکل را با ایجاد محدودههای منطقی برای منابع حل میکند.

با استفاده از Namespace، هر مجموعه از منابع میتواند در یک محدوده مستقل قرار گیرد و مدیریت آنها بهصورت جداگانه انجام شود. این ساختار امکان اعمال سیاستهای دسترسی و کنترل مصرف منابع را در سطح هر محدوده فراهم میکند.
نکته مهم این است که Namespaceها یک مرز فیزیکی یا امنیتی در سطح زیرساخت ایجاد نمیکنند، بلکه تنها یک جداسازی منطقی در سطح API هستند و منابع همچنان روی یک کلاستر و زیرساخت مشترک اجرا میشوند.
Namespaceهای پیشفرض در کوبرنتیز
در کوبرنتیز، هنگام ایجاد یک کلاستر، چند Namespace بهصورت پیشفرض ساخته میشوند که هر کدام نقش مشخصی در ساختار و عملکرد کلاستر دارند.
default: اگر هنگام ایجاد منابع، Namespace مشخصی تعیین نشده باشد. منابع بهصورت خودکار در این فضا قرار میگیرند.
kube-system: شامل منابع و اجزای داخلی کوبرنتیز است. کامپوننتهایی که برای عملکرد کلاستر ضروری هستند (مانند برخی سرویسهای سیستمی از جمله kube-dns ،kube-proxy و …)، در این بخش قرار دارند.
kube-public: بهگونهای تنظیم شده است که بهصورت عمومی قابل خواندن باشد. این فضا برای منابعی استفاده میشود که نیاز به دسترسی عمومی دارند.
kube-node-lease: این فضای نام کوبرنتیز به مدیریت وضعیت نودها در کلاستر کمک میکند و کوبرنتیز به کمک آن میتواند بدون ایجاد بار بیش از حد روی سیستم، از زندهبودن نودها مطمئن شود.
Namespace و RBAC در کوبرنتیز
در کوبرنتیز، کنترل دسترسی به منابع از طریق مکانیزم RBAC (مخفف Role-Based Access Control) انجام میشود. این سیستم امکان تعریف سطح دسترسی کاربران و سرویسها را فراهم میکند.
در RBAC، دو مفهوم اصلی وجود دارد:
- Role: مجموعهای از مجوزها را تعریف میکند. Roleها در کوبرنتیز معمولاً به یک Namespace خاص محدود هستند. این یعنی یک Role فقط روی منابع داخل همان Namespace اعمال میشود و به سایر Namespaceها گسترش پیدا نمیکند.
- RoleBinding: مجوزهای تعریف شده تحت Role را به یک کاربر، گروه یا سرویساکانت نسبت میدهد. RoleBinding نیز میتواند یک Role را به موجودیتهای مختلف در همان Namespace متصل کند.
برای اعمال دسترسی در سطح کل کلاستر، از ClusterRole و ClusterRoleBinding استفاده میشود که خارج از محدوده Namespace عمل میکنند.
به این ترتیب، Namespace نقش مهمی در محدود کردن دامنه دسترسیها در ساختار RBAC دارد و امکان جداسازی سطح دسترسی بین تیمها و پروژهها را فراهم میکند.
Namespace و مدیریت منابع (ResourceQuota و LimitRange)
در کوبرنتیز، Namespace فقط برای سازماندهی منابع استفاده نمیشود، بلکه میتواند برای اعمال محدودیت مصرف منابع نیز کاربرد داشته باشد.
با استفاده از مکانیزم ResourceQuota میتوان میزان کل منابع قابل استفاده در یک Namespace را محدود کرد. این محدودیت میتواند شامل CPU، حافظه، تعداد پادها و سایر منابع قابل شمارش باشد. این مکانیزم باعث میشود مصرف منابع در یک Namespace از حد مشخصی فراتر نرود.
در کنار آن، LimitRange برای تعریف محدودیتهای پیشفرض یا حداقل و حداکثر مصرف منابع برای هر کانتینر در یک Namespace استفاده میشود. این امکان موجب میشود که هر پاد یا کانتینر، بدون نیاز به تعریف دستی در هر بار ایجاد، دارای محدودیتهای مشخصی باشد.
این دو مکانیزم در کنار Namespace باعث میشوند که مدیریت مصرف منابع در سطح هر Namespace بهصورت مستقل انجام شود و بتوان برای هر تیم یا پروژه سقف مصرف مشخصی تعریف کرد.
نحوه ارتباط بین Namespaceها
در کوبرنتیز، Namespaceها در سطح نامگذاری و سازماندهی منابع از هم جدا هستند، اما این جداسازی بهتنهایی به معنای جداسازی شبکهای نیست.
در حالت پیشفرض، پادها میتوانند با استفاده از آدرسهای شبکهای با یکدیگر ارتباط برقرار کنند؛ حتی اگر در Namespaceهای متفاوت قرار داشته باشند. این ارتباط محدود به Namespace نیست و در صورت عدم وجود محدودیتهای شبکهای، بین Namespaceها نیز برقرار است. برای مدیریت ارتباط بین پادها در سطح شبکه، از Network Policy استفاده میشود. این مکانیزم امکان تعریف قوانین مشخص برای اجازه دادن یا مسدود کردن ترافیک بین پادها را فراهم میکند و میتواند ارتباط بین Namespaceها را محدود کند.
در زمینه DNS، کوبرنتیز برای سرویسها در هر Namespace یک نام دامنه داخلی ایجاد میکند. ساختار نامگذاری سرویسها بهگونهای است که شامل نام سرویس و Namespace آن میشود و از طریق DNS داخلی کلاستر قابل دسترسی است.
به این ترتیب، ارتباط بین Namespaceها هم از طریق شبکه و هم از طریق DNS امکانپذیر است، مگر اینکه بهصورت مشخص با سیاستهای شبکه محدود شده باشد.
چگونه در کوبرنتیز Namespace جدید ایجاد کنیم؟
اگر با مفاهیمی مانند پاد کوبرنتیز و دیپلویمنت در کوبرنتیز آشنایی داشته باشید، فرایند ساخت یک فضای نام برایتان ساده و واضح خواهد بود. برای تعریف Namespace میتوانید به دو روش اقدام کنید:
روش اول: ایجاد Namespace از طریق فایل YAML
در مرحله اول نیاز است که یک فایل YAML ایجاد کنید. نام آن را my-namespace.yaml قرار داده و اطلاعات زیر را در آن قرار دهید:
apiVersion: v1
kind: Namespace
metadata:
name: namespace1
یکی از بخشهای مهم فایل مقدار kind است که آن را Namespace قرار دادهایم.
همچنین نام Namespace جدید را namespace1 قرار دادهایم. برای نامگذاری مطمئن شوید که در کلاستر مورد نظر، قبلا فضای نام دیگری را با این عنوان ندارید.
در قدم بعدی با استفاده از دستور زیر namespace مورد نظر را ایجاد کنید:
kubectl create -f ./my-namespace.yaml
برای مشاهده Namespace ساخته شده میتوانید دستور زیر را وارد کنید:
kubectl get namespace namespace1
همچنین برای مشاهده جزئیات بیشتر Namespace ساخته شده، دستور زیر را وارد کنید:
kubectl describe namespace namespace1
روش دوم: ایجاد Namespace بدون فایل YAML
یک روش بسیار سادهتر برای ایجاد فضای نام کوبرنتیز استفاده از دستور زیر است:
kubectl create namespace namespace1
اشتباهات رایج در استفاده از Namespace کوبرنتیز
Namespace در کوبرنتیز یک ابزار سازماندهی و جداسازی منطقی منابع است، اما استفاده نادرست از آن میتواند باعث پیچیدگی در مدیریت کلاستر و کاهش بهرهوری شود.
یکی از اشتباهات رایج این است که از Namespace بهعنوان مرز کامل امنیتی استفاده میشود. در حالی که Namespace بهتنهایی تضمینکننده ایزولهسازی کامل نیست و برای کنترل امنیت باید از مکانیزمهایی مانند Network Policy و RBAC استفاده شود.
اشتباه رایج دیگر، ایجاد تعداد زیاد Namespace برای هر سرویس یا هر جزء کوچک سیستم است. این کار باعث افزایش پیچیدگی در مدیریت منابع، سیاستها و مانیتورینگ میشود و معمولاً (به استثنا سناریوهای خاص) توصیه نمیشود.
از دیگر خطاهای متداول، عدم تعریف سیاستهای منابع در سطح Namespace است. در چنین حالتی ممکن است یک تیم یا سرویس، مصرف منابع را بدون محدودیت افزایش دهد و روی سایر بخشهای کلاستر تأثیر بگذارد.
همچنین استفاده نکردن از استاندارد مشخص برای نامگذاری Namespaceها باعث سردرگمی در محیطهای چند تیمی و چند پروژهای میشود.
جمعبندی
Namespace در کوبرنتیز یک مکانیزم برای سازماندهی منابع داخل یک کلاستر است که امکان تفکیک منطقی بین تیمها، پروژهها و محیطهای مختلف را فراهم میکند. این قابلیت کمک میکند منابعی مانند Pod ،Service و Deployment در محدودههای جداگانه مدیریت شوند؛ بدون اینکه نیاز به ایجاد چند کلاستر مستقل باشد.
Namespaceها همچنین نقش مهمی در کنترل دسترسی و مدیریت سیاستها دارند. با استفاده از آنها میتوان محدوده اعمال RBAC را مشخص کرد و همچنین از طریق ResourceQuota و LimitRange مصرف منابع را در هر محدوده کنترل کرد.
با وجود این قابلیتها، Namespace بهتنهایی یک مرز امنیتی کامل محسوب نمیشود و برای ایزولهسازی شبکه یا اعمال محدودیتهای امنیتی دقیقتر باید از ابزارهای تکمیلی مانند Network Policy استفاده شود. در نتیجه، Namespace بیشتر از اینکه یک مکانیزم برای ایزولهسازی در سطح زیرساخت باشد، یک ابزار برای ساختاردهی، مدیریت و کنترل منابع در سطح منطقی است.
در برخی پلتفرمهای مبتنی بر کوبرنتیز، امکان استفاده از Namespace بهصورت یکپارچه فراهم شده تا تیمها بتوانند منابع، دسترسیها و محیطهای مختلف را سادهتر مدیریت کنند. بهعنوان مثال، سرویس دارکوب همروش این قابلیت را در اختیار شما قرار میدهند تا بدون درگیر شدن با پیچیدگیهای زیرساخت، از مزایای Namespace در مدیریت پروژههای خود استفاده کنید.