<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>کوبرنتیز آرشیو - بلاگ هم‌روش</title>
	<atom:link href="https://hamravesh.com/blog/category/kubernetes/feed/" rel="self" type="application/rss+xml" />
	<link>https://hamravesh.com/blog/category/kubernetes/</link>
	<description>بلاگ رسمی هم‌روش</description>
	<lastBuildDate>Sat, 22 Aug 2026 07:36:25 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://hamravesh.com/blog/wp-content/uploads/2026/08/cropped-favicon-96x96-1-32x32.png</url>
	<title>کوبرنتیز آرشیو - بلاگ هم‌روش</title>
	<link>https://hamravesh.com/blog/category/kubernetes/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ری‌استارت کانتینر یا ساخت پاد جدید؛ کوبرنتیز چگونه تصمیم می‌گیرد؟</title>
		<link>https://hamravesh.com/blog/kubernetes-container-restart-vs-pod-replacement/</link>
					<comments>https://hamravesh.com/blog/kubernetes-container-restart-vs-pod-replacement/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 19 Aug 2026 12:30:23 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5603</guid>

					<description><![CDATA[<p>تفاوت اصلی در سطح انتزاع است. پاد (Pod) واحد کوچک‌تری از اجرا در کوبرنتیز است که میزبان یک یا چند کانتینر محسوب می‌شود. هنگام ری‌استارت کانتینر، لایه انتزاعی پاد دست‌نخورده باقی می‌ماند و فقط کانتینرِ داخل آن دوباره اجرا می‌شود؛ اما هنگام ایجاد مجدد پاد، کل واحد پاد (شامل فضای شبکه، حافظه مشترک و تمامی کانتینرها) از بین رفته و یک نمونه کاملاً جدید با هویت و Pod UID متفاوت ایجاد می‌شود.</p>
<p>The post <a href="https://hamravesh.com/blog/kubernetes-container-restart-vs-pod-replacement/">ری‌استارت کانتینر یا ساخت پاد جدید؛ کوبرنتیز چگونه تصمیم می‌گیرد؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">در گفت‌وگوهای فنی، عبارت «پاد ری‌استارت شد» زیاد استفاده می‌شود، اما این عبارت همیشه یک اتفاق مشخص را توصیف نمی‌کند. در کوبرنتیز ممکن است فقط کانتینر داخل همان پاد دوباره اجرا شود یا پاد فعلی جای خود را به یک پاد جدید بدهد. این دو وضعیت از نظر چرخه عمر، هویت پاد و نحوه مدیریت توسط کوبرنتیز با یکدیگر تفاوت دارند.</p>



<p class="wp-block-paragraph">باید ابتدا مشخص شود که با ری‌استارت کانتینر در همان پاد روبه‌رو هستیم یا ایجاد مجدد پاد در کوبرنتیز اتفاق افتاده است. معیارهایی مانند Pod UID و تعداد ری‌استارت کانتینر (restartCount) در ادامه به ما کمک می‌کنند این دو وضعیت را از یکدیگر تشخیص دهیم.</p>



<p class="wp-block-paragraph">در این مقاله بررسی می‌کنیم کوبرنتیز در چه شرایطی کانتینر را دوباره اجرا می‌کند، چه تغییراتی باعث جایگزینی پاد می‌شوند و چگونه می‌توان با بررسی وضعیت پاد تشخیص داد که کانتینر در همان پاد ری‌استارت شده یا پاد جدیدی ساخته شده است. این مقاله بر رفتارهای مستندشده در Kubernetes 1.35 تمرکز دارد و قابلیت In-place Pod Resize را نیز بررسی می‌کند که در این نسخه به وضعیت پایدار رسید.</p>



<h2 id="h-تفاوت-ری-استارت-کانتینر-با-ایجاد-مجدد-پاد-چیست" class="wp-block-heading"><strong>تفاوت ری‌استارت کانتینر با ایجاد مجدد پاد چیست؟</strong></h2>



<p class="wp-block-paragraph">تفاوت اصلی به حفظ یا تغییر هویت پاد مربوط است. هنگام ری‌استارت کانتینر، همان پاد با همان Pod UID باقی می‌ماند و kubelet، کانتینر را داخل آن دوباره اجرا می‌کند. در مقابل، هنگام جایگزینی پاد، پاد قبلی حذف می‌شود و یک پاد جدید با Pod UID متفاوت ایجاد می‌شود. حتی اگر پاد جایگزین نامی مشابه پاد قبلی داشته باشد، از نظر هویت یک پاد جدید محسوب می‌شود.</p>



<h3 id="h-ری-استارت-کانتینر-در-همان-پاد" class="wp-block-heading"><strong>ری‌استارت کانتینر در همان پاد</strong></h3>



<p class="wp-block-paragraph">اگر فرایند یک کانتینر متوقف شود، در صورت اجازه سیاست ری‌استارت (restartPolicy)، kubelet همان کانتینر را دوباره داخل همان پاد اجرا می‌کند. در این حالت، خود پاد حذف نمی‌شود و هویت آن تغییر نمی‌کند؛ بنابراین Pod UID ثابت باقی می‌ماند و تعداد ری‌استارت همان کانتینر افزایش پیدا می‌کند.</p>



<p class="wp-block-paragraph">در واقع، ری‌استارت کانتینر به معنی ساخته شدن پاد جدید نیست. فرایند کانتینر در همان پاد دوباره اجرا می‌شود و kubelet این رفتار را بر اساس سیاست ری‌استارت تعریف‌شده برای پاد مدیریت می‌کند.</p>



<h3 id="h-ایجاد-مجدد-یا-جایگزینی-پاد" class="wp-block-heading"><strong>ایجاد مجدد یا جایگزینی پاد</strong></h3>



<p class="wp-block-paragraph">در حالت جایگزینی پاد یا ایجاد مجدد، پاد قبلی حذف و یک پاد جدید ایجاد می‌شود. حتی اگر پاد جدید نام مشابهی داشته باشد، با Pod UID متفاوت ساخته می‌شود. بنابراین تغییر UID یکی از معیارهای اصلی برای تشخیص ایجاد مجدد پاد در کوبرنتیز است.</p>



<p class="wp-block-paragraph">کنترلرهایی مانند <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment/" data-type="link" data-id="https://hamravesh.com/blog/what-is-kubernetes-deployment/" target="_blank" rel="noreferrer noopener">دیپلویمنت</a> می‌توانند هنگام تغییر الگوی پاد (Pod Template) یک Rollout جدید آغاز کنند. در این فرایند، ReplicaSet جدید ایجاد می‌شود و پادهای جدید بر اساس الگوی جدید ساخته می‌شوند. ازآنجایی‌که این پادها هویت مستقلی دارند، تعداد ری‌استارت کانتینرهای آن‌ها از صفر آغاز می‌شود، مگر اینکه کانتینرهای پاد جدید پس از ایجاد، ری‌استارت شوند.</p>



<h3 id="h-جدول-مقایسه-ری-استارت-کانتینر-و-ایجاد-مجدد-پاد" class="wp-block-heading"><strong>جدول مقایسه ری‌استارت کانتینر و ایجاد مجدد پاد</strong></h3>



<p class="wp-block-paragraph">در جدول زیر تفاوت ری‌استارت کانتینر و ایجاد مجدد پاد را مشاهده می‌کنید:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>معیار</strong></td><td><strong>ری‌استارت کانتینر</strong></td><td><strong>ایجاد مجدد پاد</strong></td></tr><tr><td>وضعیت Pod UID</td><td>بدون تغییر باقی می‌ماند</td><td>تغییر می‌کند و پاد جدید با UID جدید ساخته می‌شود</td></tr><tr><td>وضعیت مقدار ری‌استارت کانتینر</td><td>برای کانتینر ری‌استارت‌شده افزایش پیدا می‌کند</td><td>در پاد جدید از صفر آغاز می‌شود، مگر اینکه کانتینرهای آن بعداً ری‌استارت شوند</td></tr><tr><td>وضعیت باقی ماندن همان پاد</td><td>همان پاد حفظ می‌شود</td><td>پاد قبلی حذف و پاد جدید جایگزین می‌شود</td></tr><tr><td>نقش kubelet یا کنترلر</td><td>kubelet بر اساس restartPolicy کانتینر را دوباره اجرا می‌کند</td><td>کنترلرهایی مانند دیپلویمنت پاد جدید ایجاد می‌کنند</td></tr></tbody></table></figure>



<h2 id="h-نقش-restartpolicy-در-ری-استارت-کانتینرها" class="wp-block-heading">نقش restartPolicy در ری‌استارت کانتینرها</h2>



<p class="wp-block-paragraph">پاد مشخص می‌کند که پس از متوقف شدن کانتینر، kubelet در چه شرایطی آن را دوباره اجرا کند. فیلد restartPolicy در مشخصات پاد تعریف می‌شود و برای کانتینرهای برنامه می‌تواند یکی از سه مقدار Always ،OnFailure یا Never را داشته باشد. مقدار پیش‌فرض آن Always است. ری‌استارت‌هایی که بر اساس این سیاست انجام می‌شوند، کانتینر را داخل همان پاد و روی همان نود دوباره اجرا می‌کنند و به معنای ایجاد پاد جدید نیستند.</p>



<h3 id="h-سیاست-always" class="wp-block-heading"><strong>سیاست Always</strong></h3>



<p class="wp-block-paragraph">با انتخاب سیاست Always، هر بار که اجرای کانتینر به پایان برسد، kubelet صرف‌نظر از اینکه اجرای آن با موفقیت یا خطا پایان یافته باشد، کانتینر را دوباره اجرا می‌کند. به همین دلیل، این سیاست برای بارهای کاری (Workload) که باید به‌صورت مداوم در حال اجرا باشند کاربرد دارد. برای نمونه، دیپلویمنت‌ها از restartPolicy: Always استفاده می‌کنند تا برنامه‌ها به‌طور پیوسته اجرا شوند.</p>



<h3 id="h-سیاست-onfailure" class="wp-block-heading"><strong>سیاست OnFailure</strong></h3>



<p class="wp-block-paragraph">در سیاست OnFailure، نحوه خاتمه کانتینر تعیین می‌کند که اجرای مجدد انجام شود یا خیر. اگر کانتینر با خطا و وضعیت خروج غیرصفر (Non-zero Exit Status) خاتمه پیدا کند، kubelet آن را دوباره اجرا می‌کند، اما اگر کانتینر با وضعیت خروج صفر و به‌صورت موفق خاتمه یابد، ری‌استارت انجام نمی‌شود. معمولا Jobها از OnFailure یا Never برای مدیریت وظایف پردازش دسته‌ای استفاده می‌کنند.</p>



<h3 id="h-سیاست-never" class="wp-block-heading"><strong>سیاست Never</strong></h3>



<p class="wp-block-paragraph">با انتخاب Never، کانتینر پس از خاتمه (صرف‌نظر از اینکه اجرای آن موفق بوده یا با خطا پایان یافته باشد) به‌طور خودکار دوباره اجرا نمی‌شود. بنابراین، برخلاف Always و OnFailure، حتی خاتمه ناموفق کانتینر هم باعث نمی‌شود kubelet آن را بر اساس سیاست ری‌استارت دوباره اجرا کند.</p>



<h3 id="h-تاخیر-تصاعدی-میان-ری-استارت-ها" class="wp-block-heading"><strong>تاخیر تصاعدی میان ری‌استارت‌ها</strong></h3>



<p class="wp-block-paragraph">در تنظیمات پیش‌فرض، kubelet پس از توقف‌های متوالی کانتینر از تأخیر تصاعدی استفاده می‌کند. فاصله میان تلاش‌های بعدی از ۱۰ ثانیه آغاز می‌شود و به‌ترتیب به ۲۰، ۴۰ ثانیه و مقادیر بیشتر افزایش می‌یابد تا به سقف پیش‌فرض ۳۰۰ ثانیه برسد. این سقف به فاصله میان تلاش‌ها مربوط است و به معنای محدود بودن تعداد تلاش‌های ری‌استارت نیست. اگر کانتینر ۱۰ دقیقه بدون مشکل اجرا شود، kubelet تأخیر میان تلاش‌های ری‌استارت را دوباره از مقدار اولیه محاسبه می‌کند.</p>



<p class="wp-block-paragraph">این سازوکار با وضعیت CrashLoopBackOff ارتباط دارد. این وضعیت نشان می‌دهد کانتینر به‌طور مکرر با شکست مواجه شده و سازوکار تأخیر میان تلاش‌های اجرای مجدد آن فعال است.</p>



<h2 id="h-crashloopbackoff-به-چه-معناست" class="wp-block-heading"><strong>CrashLoopBackOff به چه معناست؟</strong></h2>



<p class="wp-block-paragraph">CrashLoopBackOff زمانی مشاهده می‌شود که یک کانتینر به‌طور مکرر متوقف شود و در صورت اجازه سیاست ری‌استارت، kubelet برای اجرای مجدد آن تلاش کند. با تکرار این چرخه، تعداد ری‌استارت کانتینر افزایش می‌یابد و kubelet با استفاده از سازوکار Backoff، فاصله میان تلاش‌های متوالی برای اجرای مجدد کانتینر را به‌تدریج بیشتر می‌کند.</p>



<p class="wp-block-paragraph">نکته مهم این است که CrashLoopBackOff به معنای حذف پاد و ساخته شدن پاد جدید نیست. در این شرایط، کانتینر داخل همان پاد دوباره اجرا می‌شود؛ بنابراین Pod UID ثابت می‌ماند و تعداد ری‌استارت کانتینر افزایش پیدا می‌کند. در مقابل، هنگام ایجاد مجدد پاد در کوبرنتیز، پاد جدید با Pod UID متفاوت ساخته می‌شود.</p>



<h2 id="h-probeها-چه-زمانی-باعث-ری-استارت-کانتینر-می-شوند" class="wp-block-heading"><strong>Probeها چه زمانی باعث ری‌استارت کانتینر می‌شوند؟</strong></h2>



<p class="wp-block-paragraph">پروب‌ها (Probe) برای بررسی وضعیت کانتینرها در کوبرنتیز استفاده می‌شوند، اما شکست همه آن‌ها نتیجه یکسانی ندارد. بسته به نوع پروب، نتیجه بررسی می‌تواند به ری‌استارت کانتینر منجر شود یا روی آماده بودن آن برای دریافت ترافیک تأثیر بگذارد. برای درک این تفاوت، باید عملکرد پروب زنده‌بودن (Liveness Probe)، پروب آمادگی (Readiness Probe) و پروب راه‌اندازی (Startup Probe) را جداگانه بررسی کرد.</p>



<h3 id="h-تفاوت-liveness-readiness-و-startup-probe" class="wp-block-heading"><strong>تفاوت Liveness ،Readiness و Startup Probe</strong></h3>



<p class="wp-block-paragraph">هر سه پروب هدف متفاوتی دارند و شکست آن‌ها هم نتیجه یکسانی ایجاد نمی‌کند:</p>



<ul class="wp-block-list">
<li><strong>پروب زنده‌بودن:</strong> مشخص می‌کند کانتینر همچنان سالم است یا باید متوقف شود. اگر Liveness Probe بیش از تعداد دفعات تعیین‌شده شکست بخورد، kubelet کانتینر را متوقف می‌کند. رفتار بعدی به سیاست ری‌استارت پاد بستگی دارد و در صورت اجازه این سیاست، کانتینر داخل همان پاد دوباره اجرا می‌شود. بنابراین، شکست این پروب به‌خودی‌خود به معنای ساخته شدن پاد جدید نیست.</li>



<li><strong>پروب آمادگی:</strong> مشخص می‌کند کانتینر برای دریافت ترافیک آماده است یا خیر. اگر Readiness Probe شکست بخورد، آدرس پاد از EndpointSlice سرویس‌های منطبق حذف می‌شود؛ اما kubelet کانتینر را به‌دلیل شکست این پروب ری‌استارت نمی‌کند.</li>



<li><strong>پروب راه‌اندازی:</strong> مشخص می‌کند برنامه داخل کانتینر شروع به کار کرده است یا خیر. اگر Startup Probe تعریف شده باشد، پروب‌های زنده‌بودن و آمادگی تا موفق شدن آن اجرا نمی‌شوند. اگر این پروب بیش از تعداد دفعات تعیین‌شده شکست بخورد، kubelet کانتینر را متوقف می‌کند و رفتار بعدی بر اساس سیاست ری‌استارت پاد تعیین می‌شود.</li>
</ul>



<p class="wp-block-paragraph">در نتیجه، شکست Readiness Probe فقط بر دریافت ترافیک تأثیر می‌گذارد؛ اما شکست Liveness Probe یا Startup Probe می‌تواند به توقف کانتینر و سپس اجرای مجدد آن در همان پاد منجر شود.</p>



<h2 id="h-هنگام-تغییر-image-چه-اتفاقی-برای-پاد-می-افتد" class="wp-block-heading"><strong>هنگام تغییر Image چه اتفاقی برای پاد می‌افتد؟</strong></h2>



<p class="wp-block-paragraph">ایمیج کانتینر (Container Image) نسخه آماده‌ای است که کانتینر بر اساس آن ساخته و اجرا می‌شود. برای مثال، تغییر ایمیج از یک نسخه برنامه به نسخه‌ای دیگر مشخص می‌کند که کانتینرهای جدید باید کدام نسخه را اجرا کنند.</p>



<p class="wp-block-paragraph">در یک دیپلویمنت، ایمیج کانتینر بخشی از Pod Template است؛ یعنی همان الگویی که مشخصات پادهای موردنظر را تعریف می‌کند. با تغییر ایمیج، این الگو نیز تغییر می‌کند. اگر دیپلویمنت در حالت Paused نباشد، این تغییر یک Rollout جدید را آغاز می‌کند. سپس ReplicaSet جدیدی ایجاد می‌شود و پادهای جدید بر اساس ایمیج به‌روزشده ساخته می‌شوند. بنابراین، تغییر ایمیج در دیپلویمنت به معنای ری‌استارت کانتینر داخل پادهای موجود نیست؛ بلکه پادهای جدیدی ساخته می‌شوند که کانتینرهای آن‌ها از ایمیج جدید استفاده می‌کنند.</p>



<h3 id="h-تغییر-pod-template-و-ایجاد-replicaset-جدید" class="wp-block-heading"><strong>تغییر Pod Template و ایجاد ReplicaSet جدید</strong></h3>



<p class="wp-block-paragraph">دیپلویمنت، مشخصات پادهای موردنظر را در الگوی پاد تعریف می‌کند و ایمیج کانتینر هم بخشی از همین الگو است. براساس مستندات رسمی کوبرنتیز، تغییر در الگوی پاد باعث آغاز یک Rollout جدید می‌شود، بنابراین تغییر Image این فرایند را آغاز می‌کند.</p>



<p class="wp-block-paragraph">پس از تغییر الگوی پاد، استقرار یک ReplicaSet جدید ایجاد می‌کند و پادهای جدید براساس الگوی به‌روزشده ساخته می‌شوند. در به‌روزرسانی تدریجی (Rolling Update)، کوبرنتیز به‌تدریج تعداد پادهای جدید را افزایش و تعداد پادهای قبلی را کاهش می‌دهد. این فرایند با افزایش مقیاس ReplicaSet جدید و کاهش مقیاس ReplicaSet قبلی انجام می‌شود. اگر Deployment در حالت Paused باشد، تغییر Pod Template ثبت می‌شود، اما Rollout تا زمان خارج شدن Deployment از این حالت پیش نمی‌رود.</p>



<h3 id="h-تفاوت-rolling-update-با-ری-استارت-کانتینر" class="wp-block-heading"><strong>تفاوت Rolling Update با ری‌استارت کانتینر</strong></h3>



<p class="wp-block-paragraph">در به‌روزرسانی تدریجی، کانتینر داخل همان پاد دوباره اجرا نمی‌شود، بلکه پادهای جدید براساس الگوی پاد جدید ساخته می‌شوند. این تفاوت را می‌توان با Pod UID (شناسه منحصربه‌فرد پاد) تشخیص داد. با ایجاد پاد جدید، این شناسه تغییر می‌کند، اما در ری‌استارت کانتینر، همان شناسه قبلی حفظ می‌شود.</p>



<p class="wp-block-paragraph">تعداد ری‌استارت کانتینر هم به کانتینرهای همان پاد مربوط است و از پاد قبلی به پاد جدید منتقل نمی‌شود. بنابراین، به‌روزرسانی تدریجی را نباید ری‌استارت کانتینر در همان پاد در نظر گرفت؛ زیرا در این فرایند، پادهای جدید با هویت مستقل ایجاد می‌شوند.</p>



<h3 id="h-رفتار-deployment-در-imagepullbackoff" class="wp-block-heading"><strong>رفتار Deployment در ImagePullBackOff</strong></h3>



<p class="wp-block-paragraph">اگر پاد جدید نتواند ایمیج مشخص‌شده را دریافت کند، کانتینر آن راه‌اندازی نمی‌شود و پاد ممکن است در وضعیت <code>ImagePullBackOff</code> قرار بگیرد. در نتیجه، پاد جدید آماده نمی‌شود و Rollout نمی‌تواند طبق انتظار تکمیل شود.</p>



<p class="wp-block-paragraph">در به‌روزرسانی تدریجی، ممکن است دیپلویمنت بخشی از پادهای قبلی را همچنان در حال اجرا نگه دارد و جایگزینی پادها متوقف شود. تعداد پادهای قبلی باقی‌مانده و نحوه ادامه Rollout به تنظیماتی مانند <code>maxUnavailable</code> و <code>maxSurge</code> بستگی دارد. بنابراین، وقوع <code>ImagePullBackOff</code> لزوماً به معنای حذف همه پادهای قبلی نیست.</p>



<h2 id="h-آیا-تغییر-configmap-باعث-ری-استارت-پاد-می-شود" class="wp-block-heading"><strong>آیا تغییر ConfigMap باعث ری‌استارت پاد می‌شود؟</strong></h2>



<p class="wp-block-paragraph">تغییر ConfigMap به‌خودی‌خود باعث ری‌استارت کانتینر یا جایگزینی پاد نمی‌شود، بلکه اثر این تغییرات به روشی بستگی دارد که داده‌های ConfigMap در اختیار کانتینر قرار گرفته‌اند. همچنین استفاده از ConfigMap به‌صورت متغیر محیطی با اتصال آن به‌صورت Volume رفتار متفاوتی دارد، بنابراین این دو حالت باید جداگانه بررسی شوند.</p>



<h3 id="h-مصرف-configmap-از-طریق-متغیر-محیطی" class="wp-block-heading"><strong>مصرف ConfigMap از طریق متغیر محیطی</strong></h3>



<p class="wp-block-paragraph">وقتی داده‌های ConfigMap به‌صورت متغیر محیطی در اختیار کانتینر قرار می‌گیرند، kubelet هنگام راه‌اندازی کانتینر از این داده‌ها استفاده می‌کند. اگر ConfigMap بعداً تغییر کند، مقادیر جدید به‌صورت خودکار در متغیرهای محیطی کانتینر در حال اجرا اعمال نمی‌شوند.</p>



<p class="wp-block-paragraph">برای دریافت مقادیر جدید در یک دیپلویمنت، باید Rollout جدیدی انجام شود تا پادهای جدید با متغیرهای محیطی به‌روز ساخته شوند. صرف تغییر ConfigMap این Rollout را به‌صورت خودکار آغاز نمی‌کند؛ زیرا تغییر ConfigMap به‌خودی‌خود Pod Template یک دیپلویمنت را تغییر نمی‌دهد.</p>



<h3 id="h-اتصال-configmap-به-صورت-volume" class="wp-block-heading"><strong>اتصال ConfigMap به‌صورت Volume</strong></h3>



<p class="wp-block-paragraph">اگر ConfigMap به‌صورت Volume به پاد متصل شده باشد، پس از تغییر ConfigMap، داده‌های متصل‌شده در نهایت به‌روزرسانی می‌شوند. این به‌روزرسانی فوری نیست و ممکن است میان تغییر ConfigMap و به‌روزرسانی فایل‌های داخل پاد فاصله زمانی وجود داشته باشد.</p>



<p class="wp-block-paragraph">به‌روزرسانی فایل‌های متصل‌شده هم به‌خودی‌خود باعث ری‌استارت کانتینر نمی‌شود. اینکه برنامه از تنظیمات جدید استفاده کند، به نحوه مدیریت تغییرات فایل توسط خود برنامه بستگی دارد.</p>



<h3 id="h-محدودیت-استفاده-از-subpath" class="wp-block-heading"><strong>محدودیت استفاده از subPath</strong></h3>



<p class="wp-block-paragraph"><code>subPath</code> مشخص می‌کند که به‌جای اتصال کل Volume، فقط یک فایل یا مسیر مشخص از آن داخل کانتینر متصل شود. رفتار اتصال ConfigMap با subPath متفاوت است. براساس مستندات رسمی کوبرنتیز، کانتینری که ConfigMap را با استفاده از subPath به‌صورت Volume متصل کرده باشد، به‌روزرسانی‌های بعدی ConfigMap را دریافت نمی‌کند. بنابراین، برخلاف اتصال کامل ConfigMap به‌صورت Volume که فایل‌های متصل‌شده می‌توانند به‌روزرسانی شوند، در اتصال مبتنی بر subPath تغییرات جدید ConfigMap در فایل متصل‌شده منعکس نمی‌شوند.</p>



<h3 id="h-تفاوت-به-روزرسانی-فایل-با-reload-شدن-برنامه" class="wp-block-heading"><strong>تفاوت به‌روزرسانی فایل با Reload شدن برنامه</strong></h3>



<p class="wp-block-paragraph">به‌روزرسانی فایل و بارگذاری مجدد تنظیمات توسط برنامه دو فرایند متفاوت هستند. کوبرنتیز می‌تواند در اتصال معمول ConfigMap به‌صورت Volume، فایل‌های متصل‌شده را به‌روزرسانی کند؛ اما این اتفاق به‌تنهایی باعث نمی‌شود برنامه تنظیمات جدید را بارگذاری کند.</p>



<p class="wp-block-paragraph">برای استفاده از تنظیمات جدید بدون ری‌استارت کانتینر، خود برنامه باید بتواند تغییر فایل را تشخیص دهد و تنظیمات را دوباره بارگذاری کند. در غیر این صورت، ممکن است فایل تغییر کرده باشد، اما برنامه همچنان با تنظیمات قبلی به کار خود ادامه دهد.</p>



<h2 id="h-دستور-rollout-restart-چه-کاری-انجام-می-دهد" class="wp-block-heading"><strong>دستور rollout restart چه کاری انجام می‌دهد؟</strong></h2>



<p class="wp-block-paragraph">دستور <code>kubectl rollout restart</code> برای راه‌اندازی مجدد Rollout یک دیپلویمنت استفاده می‌شود. در این عملیات، پادهای دیپلویمنت مطابق استراتژی به‌روزرسانی آن با پادهای جدید جایگزین می‌شوند. بنابراین، این دستور، کانتینر را داخل همان پاد دوباره اجرا نمی‌کند و پادهای جایگزین هویت و Pod UID جدیدی دارند.</p>



<h2 id="h-تغییر-cpu-و-memory-بدون-ایجاد-مجدد-پاد" class="wp-block-heading"><strong>تغییر CPU و Memory بدون ایجاد مجدد پاد</strong></h2>



<p class="wp-block-paragraph">قابلیت In-place Pod Resize امکان تغییر Request و Limit مربوط به CPU و Memory را بدون جایگزینی پاد فراهم می‌کند. این قابلیت به همین دو نوع منبع محدود است و منابعی غیر از CPU و Memory همچنان با این سازوکار قابل تغییر نیستند.</p>



<h3 id="h-قابلیت-in-place-pod-resize-چیست" class="wp-block-heading"><strong>قابلیت In-place Pod Resize چیست؟</strong></h3>



<p class="wp-block-paragraph">قابلیت In-place Pod Resize در کوبرنتیز نسخه 1.35 به وضعیت پایدار رسید. پیش از ارائه این قابلیت، مقادیر CPU و Memory تخصیص‌یافته به کانتینر در مشخصات پاد تغییرناپذیر بودند و تغییر آن‌ها به حذف و ایجاد مجدد پاد نیاز داشت. این قابلیت Request و Limit مربوط به CPU و Memory را قابل تغییر می‌کند و امکان اعمال آن‌ها را داخل پاد در حال اجرا فراهم می‌سازد.</p>



<p class="wp-block-paragraph">در این روش، مقادیر موردنظر CPU و Memory در مشخصات پاد به‌روزرسانی می‌شوند و کوبرنتیز می‌تواند تغییرات را بدون جایگزینی پاد اعمال کند. بنابراین، هویت پاد حفظ می‌شود و برای تغییر این منابع الزاما نیازی به ایجاد پاد جدید نیست.</p>



<h3 id="h-نقش-resizepolicy-در-ری-استارت-کانتینر" class="wp-block-heading"><strong>نقش resizePolicy در ری‌استارت کانتینر</strong></h3>



<p class="wp-block-paragraph">رفتار کانتینر هنگام تغییر منابع به <code>resizePolicy</code> تعریف‌شده برای هر منبع بستگی دارد. این سیاست می‌تواند یکی از دو مقدار <code>NotRequired</code> یا <code>RestartContainer</code> را داشته باشد.</p>



<p class="wp-block-paragraph">با سیاست <code>NotRequired</code>، تغییر منبع بدون نیاز به ری‌استارت کانتینر اعمال می‌شود. در مقابل، سیاست <code>RestartContainer</code> مشخص می‌کند که برای اعمال تغییر، کانتینر داخل همان پاد دوباره اجرا شود. برای مثال، می‌توان تغییر CPU را بدون ری‌استارت انجام داد و برای تغییر Memory، ری‌استارت کانتینر را الزامی کرد.</p>



<p class="wp-block-paragraph">در هر دو حالت، خود پاد جایگزین نمی‌شود و Pod UID ثابت باقی می‌ماند. بنابراین، حتی اگر تغییر منابع باعث ری‌استارت کانتینر شود، این اتفاق به معنای ایجاد پاد جدید نیست.</p>



<h3 id="h-محدودیت-های-in-place-pod-resize" class="wp-block-heading"><strong>محدودیت‌های In-place Pod Resize</strong></h3>



<p class="wp-block-paragraph">قابلیت In-place Pod Resize با وجود رسیدن به وضعیت پایدار در کوبرنتیز 1.35، همچنان محدودیت‌هایی دارد. براساس منبع رسمی، در حال حاضر CPU و Memory را می‌توان با این روش تغییر داد و سایر منابع همچنان تغییرناپذیر هستند.</p>



<p class="wp-block-paragraph">همچنین استفاده از این قابلیت همراه با Swap، Static CPU Manager و Static Memory Manager پشتیبانی نمی‌شود. برخی محیط‌های اجرای زبان‌های برنامه‌نویسی هم برای تغییر Memory بدون ری‌استارت محدودیت دارند. برای مثال، طبق منبع رسمی، Java و Python در زمان انتشار این مطلب از تغییر اندازه حافظه بدون ری‌استارت پشتیبانی نمی‌کردند.</p>



<p class="wp-block-paragraph">در نتیجه، In-place Pod Resize امکان تغییر CPU و Memory بدون ساخت پاد جدید را فراهم می‌کند؛ اما نحوه اعمال تغییر و نیاز به ری‌استارت کانتینر می‌تواند به سیاست تعریف‌شده و محدودیت‌های محیط اجرا بستگی داشته باشد.</p>



<h2 id="h-چگونه-ری-استارت-کانتینر-را-از-جایگزینی-پاد-تشخیص-دهیم" class="wp-block-heading"><strong>چگونه ری‌استارت کانتینر را از جایگزینی پاد تشخیص دهیم؟</strong></h2>



<p class="wp-block-paragraph">برای تشخیص ری‌استارت کانتینر در همان پاد از ایجاد پاد جدید، می‌توان شناسه پاد، تعداد ری‌استارت کانتینر و رویدادهای ثبت‌شده را بررسی کرد. Pod UID و تعداد ری‌استارت کانتینر دو معیار مهم برای این تشخیص هستند و بررسی وضعیت و رویدادهای پاد نیز اطلاعات تکمیلی در اختیار ما قرار می‌دهد.</p>



<h3 id="h-بررسی-pod-uid" class="wp-block-heading"><strong>بررسی Pod UID</strong></h3>



<p class="wp-block-paragraph">Pod UID یکی از معیارهای اصلی برای تشخیص هویت پاد است. هنگام ری‌استارت کانتینر در همان پاد، Pod UID تغییر نمی‌کند و فقط فرایند کانتینر دوباره اجرا می‌شود.</p>



<p class="wp-block-paragraph">در سمت مقابل، اگر پاد قبلی حذف و پاد جدیدی جایگزین آن شود، پاد جدید UID متفاوتی خواهد داشت. بنابراین، بررسی Pod UID می‌تواند مشخص کند که کانتینر در همان پاد ری‌استارت شده یا پاد جدیدی ایجاد شده است.</p>



<h3 id="h-بررسی-restartcount" class="wp-block-heading"><strong>بررسی restartCount</strong></h3>



<p class="wp-block-paragraph">تعداد ری‌استارت کانتینر نشان می‌دهد کانتینر چند بار توسط kubelet در همان پاد دوباره اجرا شده است. بنابراین، افزایش این مقدار همراه با ثابت ماندن Pod UID نشان‌دهنده ری‌استارت کانتینر در همان پاد است.</p>



<p class="wp-block-paragraph">پاد تازه‌ساخته‌شده وضعیت کانتینرهای خود را مستقل از پاد قبلی دارد؛ بنابراین اگر کانتینرهای آن هنوز ری‌استارت نشده باشند، تعداد ری‌استارت کانتینر صفر خواهد بود. به همین دلیل، این مقدار را بهتر است همراه با Pod UID بررسی کرد.</p>



<h3 id="h-بررسی-وضعیت-و-رویدادهای-پاد" class="wp-block-heading">بررسی وضعیت و رویدادهای پاد</h3>



<p class="wp-block-paragraph">برای بررسی دقیق‌تر می‌توان وضعیت و رویدادهای پاد را هم مشاهده کرد. دستور زیر اطلاعات کلی وضعیت پاد را نمایش می‌دهد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pod &lt;pod-name> -o wide</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">get</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">pod-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-o</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">wide</span></span></code></pre></div>



<p class="wp-block-paragraph">برای مشاهده جزئیات پاد و رویدادهای مرتبط با آن می‌توان از دستور زیر استفاده کرد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl describe pod &lt;pod-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">describe</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">pod-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">نمایش JSON پاد با دستور زیر امکان‌پذیر است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pod &lt;pod-name> -o json</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">get</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">pod-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-o</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">json</span></span></code></pre></div>



<p class="wp-block-paragraph">برای مشاهده هم‌زمان نام پاد، Pod UID، آدرس IP، نام کانتینرها و تعداد ری‌استارت هر کانتینر می‌توان از دستور زیر استفاده کرد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pod &lt;pod-name> -o custom-columns=\
"NAME:.metadata.name,UID:.metadata.uid,IP:.status.podIP,RESTARTS:.status.containerStatuses&#91;0&#93;.restartCount"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">get</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">pod-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-o</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">custom-columns=</span><span style="color: #F47067">\</span></span>
<span class="line"><span style="color: #96D0FF">&quot;NAME:.metadata.name,UID:.metadata.uid,IP:.status.podIP,RESTARTS:.status.containerStatuses&#91;0&#93;.restartCount&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">این دستور فقط تعداد ری‌استارت اولین کانتینر موجود در <code>containerStatuses</code> را نمایش می‌دهد. در پادهای چندکانتینری، برای مشاهده وضعیت همه کانتینرها باید آرایه <code>containerStatuses</code> در خروجی JSON پاد بررسی شود.</p>



<h2 id="h-جدول-نهایی-هر-تغییر-چه-اثری-روی-کانتینر-و-پاد-دارد" class="wp-block-heading"><strong>جدول نهایی: هر تغییر چه اثری روی کانتینر و پاد دارد؟</strong></h2>



<p class="wp-block-paragraph">جدول زیر نشان می‌دهد در سناریوهای بررسی‌شده، چه زمانی کانتینر در همان پاد ری‌استارت می‌شود و چه زمانی پاد جدیدی با Pod UID متفاوت ایجاد می‌شود.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>سناریو</strong></th><th><strong>ری‌استارت کانتینر در همان پاد</strong></th><th><strong>ایجاد پاد جدید</strong></th><th><strong>تغییر Pod UID</strong></th></tr></thead><tbody><tr><td>متوقف شدن کانتینر با restartPolicy: Always</td><td>بله؛ kubelet کانتینر را در همان پاد دوباره اجرا می‌کند</td><td>خیر</td><td>خیر</td></tr><tr><td>شکست Liveness Probe بیش از آستانه تعیین‌شده</td><td>در صورت اجازه restartPolicy، بله</td><td>خیر؛ شکست Probe به‌خودی‌خود پاد جدیدی ایجاد نمی‌کند</td><td>خیر</td></tr><tr><td>وقوع CrashLoopBackOff</td><td>بله؛ کانتینر در همان پاد دوباره اجرا می‌شود</td><td>خیر</td><td>خیر</td></tr><tr><td>تغییر ایمیج در استقرار (Deployment)</td><td>خیر</td><td>بله؛ تغییر الگوی پاد باعث Rollout و ساخت پادهای جدید می‌شود</td><td>بله</td></tr><tr><td>اجرای kubectl rollout restart</td><td>خیر</td><td>بله؛ پادهای Deployment در جریان Rollout با پادهای جدید جایگزین می‌شوند</td><td>بله</td></tr><tr><td>صرف تغییر ConfigMap مصرف‌شده از طریق متغیر محیطی</td><td>خیر؛ متغیرهای محیطی کانتینر موجود به‌روزرسانی نمی‌شوند</td><td>خیر؛ تغییر ConfigMap به‌تنهایی پاد جدیدی ایجاد نمی‌کند&nbsp;</td><td>خیر&nbsp;</td></tr><tr><td>تغییر ConfigMap متصل‌شده به‌صورت Volume</td><td>خیر؛ به‌روزرسانی فایل‌ها باعث ری‌استارت خودکار کانتینر نمی‌شود</td><td>خیر</td><td>خیر</td></tr><tr><td>تغییر ConfigMap متصل‌شده با subPath</td><td>خیر؛ به‌روزرسانی‌های ConfigMap هم به فایل متصل‌شده منتقل نمی‌شوند</td><td>خیر</td><td>خیر</td></tr><tr><td>تغییر CPU با In-place Pod Resize</td><td>خیر؛ کانتینر ری‌استارت نمی‌شود</td><td>خیر</td><td>خیر</td></tr><tr><td>تغییر Memory براساس resizePolicy</td><td>با NotRequired نیازی به ری‌استارت نیست؛ با RestartContainer کانتینر در همان پاد دوباره اجرا می‌شود</td><td>خیر</td><td>خیر</td></tr></tbody></table></figure>



<h2 id="h-جمع-بندی" class="wp-block-heading">جمع‌بندی</h2>



<p class="wp-block-paragraph">با اینکه عبارت «ری‌استارت پاد» در گفت‌وگوهای فنی رایج است، اما از نظر فنی می‌تواند مبهم باشد. در برخی شرایط، kubelet کانتینر را در همان پاد دوباره اجرا می‌کند، اما در شرایط دیگر، کنترلرهایی مانند دیپلویمنت پاد قبلی را با پاد جدید جایگزین می‌کنند. تشخیص این تفاوت برای عیب‌یابی ری‌استارت پاد در کوبرنتیز اهمیت دارد.</p>



<p class="wp-block-paragraph">برای تشخیص این دو وضعیت، تعداد ری‌استارت کانتینر و Pod UID دو معیار کاربردی هستند. تعداد ری‌استارت به تشخیص اجرای مجدد کانتینر در همان پاد کمک می‌کند و Pod UID مشخص می‌کند که هویت پاد تغییر کرده است یا خیر.</p>



<p class="wp-block-paragraph">در نهایت، تغییر ConfigMap ،Image یا منابع، الزاما رفتار یکسانی ایجاد نمی‌کند. بسته به نوع تغییر و سازوکار مربوط به آن، ممکن است کانتینر در همان پاد دوباره اجرا شود، پاد جدیدی ساخته شود یا هیچ‌کدام از این اتفاق‌ها رخ ندهد. به همین دلیل، هنگام بررسی رفتار کوبرنتیز باید مشخص شود که تغییر در کانتینر رخ داده یا خود پاد جایگزین شده است.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/kubernetes-container-restart-vs-pod-replacement/">ری‌استارت کانتینر یا ساخت پاد جدید؛ کوبرنتیز چگونه تصمیم می‌گیرد؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/kubernetes-container-restart-vs-pod-replacement/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>کنترل‌پلین در کوبرنتیز چیست و چگونه کلاستر را مدیریت می‌کند؟</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-control-plane/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-control-plane/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Tue, 18 Aug 2026 07:29:03 +0000</pubDate>
				<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5595</guid>

					<description><![CDATA[<p>کنترل‌پلین (Control Plane) مجموعه‌ای از اجزای اصلی کوبرنتیز است که اغلب به‌عنوان مغز کلاستر شناخته می‌شود و وضعیت کلی آن را مدیریت می‌کند. سرور API رابط برنامه‌نویسی کاربردی کوبرنتیز (Kubernetes API) را در دسترس قرار می‌دهد، زمان‌بند پادهای (Pod) بدون نود را به نود مناسب اختصاص می‌دهد و مدیر کنترلر، کنترلرهای (Controller) موردنیاز برای اجرای رفتارهای Kubernetes API را اجرا می‌کند. </p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-control-plane/">کنترل‌پلین در کوبرنتیز چیست و چگونه کلاستر را مدیریت می‌کند؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">مدیریت یک کلاستر در کوبرنتیز فقط به اجرای کانتینرها محدود نمی‌شود. این سامانه باید وضعیت مطلوبی را که کاربر برای منابع مختلف تعریف می‌کند دریافت کند، وضعیت فعلی کلاستر را به‌طور مداوم بسنجد و برای نزدیک‌کردن این دو وضعیت تصمیم بگیرد. برای مثال، زمانی که یک دیپلویمنت (Deployment) جدید ایجاد می‌شود یا تعداد رپلیکاها (Replica) تغییر می‌کند، کوبرنتیز باید تشخیص دهد چه اقداماتی لازم است تا کلاستر به وضعیت مورد انتظار برسد. همین موضوع باعث می‌شود هنگام آشنایی با معماری کوبرنتیز، این پرسش مطرح شود که کنترل‌پلین در کوبرنتیز چیست و چه نقشی در مدیریت کلاستر ایفا می‌کند.</p>



<p class="wp-block-paragraph">کنترل‌پلین (Control Plane) مجموعه‌ای از اجزای اصلی کوبرنتیز است که اغلب به‌عنوان مغز کلاستر شناخته می‌شود و وضعیت کلی آن را مدیریت می‌کند. سرور API کوبرنتیز (Kubernetes API) را در دسترس قرار می‌دهد، Scheduler پادهای بدون نود را به نود مناسب اختصاص می‌دهد و مدیر کنترلر، کنترلرهای موردنیاز برای اجرای رفتارهای API کوبرنتیز را اجرا می‌کند. به همین دلیل، می‌توان کنترل‌پلین را لایه مدیریتی کلاستر دانست؛ بخشی که وظیفه اصلی آن مدیریت وضعیت و هماهنگی فرایندهای کلاستر است، نه اجرای بارهای کاری کاربران.</p>



<p class="wp-block-paragraph">همچنین تفاوت کنترل‌پلین و نود ورکر (Worker Node) را نقش آن‌ها در معماری کلاستر مشخص می‌کند؛ بارهای کاری کاربران روی نودهای ورکر اجرا می‌شوند، درحالی‌که کنترل‌پلین مسئول مدیریت وضعیت کلاستر، تصمیم‌گیری و هدایت فرایندهای کنترلی است. در ادامه، معماری کنترل‌پلین کوبرنتیز، اجزای اصلی آن و نحوه کار کنترل‌پلین کوبرنتیز را بررسی می‌کنیم.</p>



<h2 id="h-کنترل-پلین-چه-نقشی-در-معماری-کوبرنتیز-دارد" class="wp-block-heading"><strong>کنترل‌پلین چه نقشی در معماری کوبرنتیز دارد؟</strong></h2>



<p class="wp-block-paragraph">معماری یک کلاستر کوبرنتیز را می‌توان به دو بخش اصلی مدیریتی و اجرایی تقسیم کرد. بخش مدیریتی را کنترل‌پلین تشکیل می‌دهد که مسئول مدیریت وضعیت کلاستر، پردازش درخواست‌های API و هماهنگ‌کردن فرایندهای کنترلی است. در مقابل، بخش اجرایی از نودهای ورکر تشکیل شده است که پادها و کانتینرهای مربوط به بارهای کاری کاربران را اجرا می‌کنند.</p>



<p class="wp-block-paragraph">مسئولیت اصلی کنترل‌پلین اجرای بارهای کاری کاربران نیست و در معماری معمول، این بارهای کاری روی نود ورکرها اجرا می‌شوند. برای مثال، Scheduler فقط نود مناسب را برای اجرای یک پاد انتخاب می‌کند، اما اجرای واقعی پاد روی نود بر عهده kubelet و محیط اجرای کانتینر است. به همین دلیل، کنترل‌پلین مسئول تصمیم‌گیری و هماهنگ‌سازی است؛ در حالی که اجرای بارهای کاری روی نودهای ورکر انجام می‌شود.</p>



<p class="wp-block-paragraph">کنترل‌پلین با کل کلاستر یکسان نیست. طبق معماری معرفی‌شده در مستندات کوبرنتیز، یک کلاستر، از کنترل‌پلین و یک یا چند نود ورکر تشکیل می‌شود. اجزای کنترل‌پلین نیز بسته به معماری استقرار می‌توانند روی یک یا چند نود کنترل‌پلین اجرا شوند. در جدول زیر تفاوت کنترل‌پلین و نود ورکر را مشاهده می‌کنید.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>بخش کلاستر</strong></td><td><strong>مسئولیت اصلی</strong></td><td><strong>اجزای شاخص</strong></td></tr><tr><td>کنترل‌پلین</td><td>مدیریت وضعیت کلاستر، تصمیم‌گیری و هماهنگ‌سازی فرایندهای کنترلی</td><td>kube-apiserver ،etcd ،kube-scheduler و kube-controller-manager</td></tr><tr><td>نود ورکر</td><td>اجرای بارهای کاری</td><td>kubelet، محیط اجرای کانتینر و kube-proxy (در صورت استفاده)</td></tr></tbody></table></figure>



<h2 id="h-اجزای-اصلی-کنترل-پلین-کوبرنتیز-کدام-اند" class="wp-block-heading"><strong>اجزای اصلی کنترل‌پلین کوبرنتیز کدام‌اند؟</strong></h2>



<p class="wp-block-paragraph">کنترل‌پلین کوبرنتیز از چند جزء اصلی تشکیل شده است که هرکدام مسئولیت مشخصی در مدیریت کلاستر بر عهده دارند. این اجزا در کنار یکدیگر درخواست‌های مربوط به API کوبرنتیز را پردازش می‌کنند، وضعیت کلاستر را پایش می‌کنند و شرایط لازم را برای نزدیک‌کردن وضعیت فعلی به وضعیت مطلوب فراهم می‌سازند.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="732" src="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-1024x732.webp" alt="اجزاری اصلی کنترل‌پلین کوبرنتیز - ارتباط کنترل پلین با kube-apiserver و etcd و kube-scheduler و kube-controller-manager و cloud-controller-manager" class="wp-image-5658" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-1024x732.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-300x214.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-768x549.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-1536x1098.webp 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-2048x1464.webp 2048w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-150x108.webp 150w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-930x665.webp 930w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-what-is-kubernetes-control-plane-02-120x86.webp 120w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="h-سرور-api-یا-kube-apiserver" class="wp-block-heading"><strong>سرور API یا kube-apiserver</strong></h3>



<p class="wp-block-paragraph">سرور API یا kube-apiserver یکی از اجزای اصلی کنترل‌پلین است که API کوبرنتیز را در دسترس قرار می‌دهد. ابزارهایی مانند <a href="https://hamravesh.com/blog/what-is-kubectl/" data-type="link" data-id="https://hamravesh.com/blog/what-is-kubectl/" target="_blank" rel="noreferrer noopener">kubectl</a> و سایر سرویس‌گیرنده‌های API، از طریق این رابط با کلاستر تعامل می‌کنند. درخواست‌های دریافتی در این بخش اعتبارسنجی شده و مراحل احراز هویت، مجوزدهی و کنترل پذیرش (Admission Control به معنی بررسی، پذیرش، رد یا اصلاح درخواست پیش از ثبت آن) روی آن‌ها انجام می‌شود. همچنین سرور API برای ثبت و بازیابی وضعیت منابع و اطلاعات پیکربندی کلاستر با etcd تعامل می‌کند.</p>



<p class="wp-block-paragraph">سرور API مسئول اجرای مستقیم کانتینرها نیست. اجرای پادها و کانتینرهای مربوط به بارهای کاری روی نودهای ورکر و به‌وسیله kubelet و محیط اجرای کانتینر انجام می‌شود.</p>



<h3 id="h-پایگاه-داده-etcd" class="wp-block-heading"><strong>پایگاه داده etcd</strong></h3>



<p class="wp-block-paragraph">پایگاه داده <a href="https://hamravesh.com/blog/what-is-etcd-in-kubernetes/" data-type="link" data-id="https://hamravesh.com/blog/what-is-etcd-in-kubernetes/" target="_blank" rel="noreferrer noopener">etcd</a> یک مخزن کلید-مقدار (Key-Value Store) سازگار و توزیع‌شده است که داده‌های API کوبرنتیز، از جمله اطلاعات منابع و پیکربندی کلاستر، را نگهداری می‌کند. ازآنجایی‌که تمام داده‌های سرور API در آن ذخیره می‌شوند، ازدست‌رفتن داده‌های etcd می‌تواند بازیابی کلاستر را دشوار یا غیرممکن کند. به همین دلیل، پشتیبان‌گیری، امنیت و دسترس‌پذیری آن برای پایداری کنترل‌پلین حیاتی است. در معماری کوبرنتیز، تمام اجزای کنترل‌پلین مستقیما به etcd متصل نمی‌شوند، بلکه تعامل آن‌ها با وضعیت کلاستر از طریق سرور API انجام می‌گیرد.</p>



<h3 id="h-زمان-بند-یا-kube-scheduler" class="wp-block-heading"><strong>زمان‌بند یا kube-scheduler</strong></h3>



<p class="wp-block-paragraph">Scheduler پادهایی را پیدا می‌کند که هنوز به نودی اختصاص داده نشده‌اند و هر پاد را به یک نود مناسب اختصاص می‌دهد. Scheduler&nbsp;فقط نود مناسب را برای هر پاد انتخاب می‌کند. پس از آن، kubelet روی نود ورکر از اجرای کانتینرهای پاد اطمینان حاصل می‌کند و محیط اجرای کانتینر مسئول اجرای کانتینرها است.</p>



<h3 id="h-مدیر-کنترلر-یا-kube-controller-manager" class="wp-block-heading"><strong>مدیر کنترلر یا kube-controller-manager</strong></h3>



<p class="wp-block-paragraph">مدیر کنترلر یا kube-controller-manager کنترلرهایی را اجرا می‌کند که مبتنی بر مفهوم «حلقه کنترل» (Control Loop) کار می‌کنند. این کنترلرها وضعیت منابع را از طریق API مشاهده کرده و تلاش می‌کنند وضعیت فعلی را با وضعیت مطلوب تطبیق دهند. برای مثال، اگر تعداد پادهای در حال اجرا کمتر از تعداد تعریف‌شده باشد، کنترلر مربوط این اختلاف را تشخیص می‌دهد و برای ایجاد منابع لازم اقدام می‌کند. از نمونه‌های مهم این کنترلرها می‌توان به Node Controller (برای نظارت بر وضعیت نودها) و Job Controller اشاره کرد.</p>



<h3 id="h-مدیر-کنترلر-ابری-یا-cloud-controller-manager" class="wp-block-heading"><strong>مدیر کنترلر ابری یا cloud-controller-manager</strong></h3>



<p class="wp-block-paragraph">مدیر کنترلر ابری یا cloud-controller-manager یک جزء اختیاری کنترل‌پلین است که کوبرنتیز را با ارائه‌دهندگان زیرساخت ابری یکپارچه می‌کند. بنابراین، وجود این جزء به محیط استقرار کلاستر وابسته است و همه کلاسترها الزاما از آن استفاده نمی‌کنند.</p>



<h2 id="h-یک-درخواست-چگونه-در-کنترل-پلین-پردازش-می-شود" class="wp-block-heading"><strong>یک درخواست چگونه در کنترل‌پلین پردازش می‌شود؟</strong></h2>



<p class="wp-block-paragraph">برای درک کلی نحوه کار کنترل‌پلین کوبرنتیز، فرض کنید کاربری قصد دارد یک <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment/" data-type="link" data-id="https://hamravesh.com/blog/what-is-kubernetes-deployment/" target="_blank" rel="noreferrer noopener">دیپلویمنت کوبرنتیز</a> جدید ایجاد کند.</p>



<p class="wp-block-paragraph">۱. کاربر مشخصات دیپلویمنت را از طریق kubectl ارسال می‌کند.</p>



<p class="wp-block-paragraph">۲. درخواست به سرور API می‌رسد و مراحل احراز هویت، مجوزدهی، کنترل پذیرش و اعتبارسنجی لازم را طی می‌کند.</p>



<p class="wp-block-paragraph">۳. وضعیت مطلوب از طریق سرور API در etcd ثبت می‌شود.</p>



<p class="wp-block-paragraph">۴. کنترلر دیپلویمنت ایجاد این منبع را مشاهده می‌کند و ReplicaSet لازم را می‌سازد؛ سپس کنترلر ReplicaSet، پادهای موردنیاز را ایجاد می‌کند.</p>



<p class="wp-block-paragraph">۵. Scheduler برای پادهای بدون نود، نود مناسب انتخاب می‌کند.</p>



<p class="wp-block-paragraph">۶. سپس kubelet روی نود انتخاب‌شده از طریق سرور API، از پاد اختصاص‌یافته به آن نود مطلع می‌شود و با کمک محیط اجرای کانتینر، کانتینرهای پاد را اجرا می‌کند.</p>



<p class="wp-block-paragraph">۷. وضعیت جدید دوباره از طریق سرور API ثبت می‌شود و کنترلرها به نظارت خود ادامه می‌دهند.</p>



<p class="wp-block-paragraph">نکته مهم این است که معمولا اجزای کنترل‌پلین به‌صورت زنجیره‌ای و با ارسال فرمان مستقیم به یکدیگر عمل نمی‌کنند. هماهنگی میان آن‌ها بیشتر بر اساس مشاهده و به‌روزرسانی وضعیت منابع از طریق API کوبرنتیز انجام می‌شود؛ به همین دلیل هر جزء، بر اساس تغییرات وضعیت کلاستر، وظیفه خود را انجام می‌دهد.</p>



<h2 id="h-در-صورت-خرابی-کنترل-پلین-چه-اتفاقی-می-افتد" class="wp-block-heading"><strong>در صورت خرابی کنترل‌پلین چه اتفاقی می‌افتد؟</strong></h2>



<p class="wp-block-paragraph">پیامد خرابی کنترل‌پلین به نوع خرابی و میزان افزونگی معماری بستگی دارد. خرابی یک فرایند یا یک نود کنترل‌پلین در معماری دسترس‌پذیر لزوماً کل کنترل‌پلین را از دسترس خارج نمی‌کند؛ زیرا Instanceهای سالم می‌توانند ارائه سرویس را ادامه دهند. در مقابل، ازدسترس‌خارج‌شدن کامل کنترل‌پلین، فعالیت‌های مدیریتی کلاستر را مختل می‌کند. پیامدهای از دسترس خارج شدن کامل کنترل‌پلین عبارت‌اند از:</p>



<ul class="wp-block-list">
<li>پردازش نشدن درخواست‌های جدید API</li>



<li>اختلال در ایجاد، تغییر یا حذف منابع از طریق API</li>



<li>زمان‌بندی‌نشدن پادهای جدید</li>



<li>توقف فرایند تطبیق وضعیت فعلی با وضعیت مطلوب</li>



<li>مختل‌شدن مشاهده وضعیت کلاستر با ابزارهایی مانند kubectl</li>
</ul>



<p class="wp-block-paragraph">ازدسترس‌خارج‌شدن کامل کنترل‌پلین لزوماً باعث توقف فوری پادها و کانتینرهای در حال اجرا روی نودهای سالم نمی‌شود. این بارهای کاری ممکن است به فعالیت خود ادامه دهند، اما کلاستر امکان زمان‌بندی پادهای جدید، اعمال تغییرات مدیریتی و واکنش کامل به خرابی‌ها را از دست می‌دهد.</p>



<p class="wp-block-paragraph">خرابی یک عضو etcd لزوماً کل کلاستر etcd را از دسترس خارج نمی‌کند. تا زمانی که بیش از نیمی از اعضا فعال و در دسترس باشند، حد نصاب حفظ می‌شود و کلاستر می‌تواند به فعالیت عادی خود ادامه دهد. اما اگر تعداد اعضای در دسترس از حد نصاب کمتر شود، کلاستر etcd دیگر نمی‌تواند عملیات عادی خود را انجام دهد. همچنین ازدست‌رفتن داده‌های etcd در نبود نسخه پشتیبان معتبر، بازیابی کلاستر کوبرنتیز را با مشکل جدی مواجه می‌کند.</p>



<h2 id="h-کنترل-پلین-با-دسترس-پذیری-بالا-چگونه-طراحی-می-شود" class="wp-block-heading"><strong>کنترل‌پلین با دسترس‌پذیری بالا چگونه طراحی می‌شود؟</strong></h2>



<p class="wp-block-paragraph">در معماری دارای <a href="https://hamravesh.com/blog/what-is-high-availability/" data-type="link" data-id="https://hamravesh.com/blog/what-is-high-availability/" target="_blank" rel="noreferrer noopener">دسترس‌پذیری بالا</a>، اجزای کنترل‌پلین روی بیش از یک نود اجرا می‌شوند و در محیط‌های ابری، این نودها پشت یک لود بالانسر مبتنی بر TCP قرار می‌گیرند. لود بالانسر ترافیک ورودی API کوبرنتیز را میان instanceهای سالم kube-apiserver توزیع می‌کند و باید بتواند از طریق پورت سرور API با همه نودهای کنترل‌پلین ارتباط برقرار کند. برای افزایش دسترس‌پذیری کنترل‌پلین، معمولا از اصول زیر در طراحی معماری استفاده می‌شود:</p>



<ul class="wp-block-list">
<li>استفاده از چند نود کنترل‌پلین</li>



<li>توزیع نودهای کنترل‌پلین و اعضای etcd میان دامنه‌های خرابی مستقل، در صورت امکان</li>



<li>قراردادن instanceهای kube-apiserver پشت یک لود بالانسر</li>



<li>اطمینان از ارتباط لود بالانسر با instanceهای kube-apiserver و هدایت ترافیک به instanceهای سالم</li>



<li>انتخاب یکی از دو توپولوژی stacked etcd یا external etcd</li>



<li>استفاده از تعداد فرد اعضای etcd برای حفظ حد نصاب و تداوم فعالیت کلاستر در صورت خرابی برخی از اعضا</li>



<li>پایش سلامت اجزای کنترل‌پلین</li>



<li>تهیه نسخه پشتیبان منظم از etcd و آزمایش فرایند بازیابی آن</li>



<li>حفاظت از گواهی‌ها و اطلاعات حساس کنترل‌پلین</li>
</ul>



<p class="wp-block-paragraph">مستندات رسمی کوبرنتیز دو توپولوژی اصلی را برای استقرار کنترل‌پلین با دسترس‌پذیری بالا معرفی می‌کنند:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>توپولوژی</strong></td><td><strong>نحوه استقرار</strong></td><td><strong>مزیت اصلی</strong></td><td><strong>محدودیت اصلی</strong></td></tr><tr><td>stacked etcd</td><td>اعضای etcd و اجزای کنترل‌پلین روی نودهای مشترک قرار می‌گیرند</td><td>زیرساخت کمتر و راه‌اندازی ساده‌تر</td><td>وابستگی بیشتر خرابی کنترل‌پلین و etcd</td></tr><tr><td>external etcd</td><td>کلاستر etcd جدا از نودهای کنترل‌پلین اجرا می‌شود</td><td>جداسازی بهتر اجزا و دامنه‌های خرابی</td><td>زیرساخت و پیچیدگی عملیاتی بیشتر</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">تفاوت اصلی این دو رویکرد در هم‌مکان بودن یا جدا بودن اعضای etcd و نودهای کنترل‌پلین است. روش stacked etcd به زیرساخت کمتری نیاز دارد، درحالی‌که روش external etcd با جدا کردن این دو بخش، ماشین‌های بیشتری را برای اعضای etcd در نظر می‌گیرد.</p>



<h2 id="h-دسترسی-به-کنترل-پلین-چگونه-ایمن-می-شود" class="wp-block-heading"><strong>دسترسی به کنترل‌پلین چگونه ایمن می‌شود؟</strong></h2>



<p class="wp-block-paragraph">ازآنجایی‌که سرور API نقطه اصلی ورود مدیریتی به کلاستر است، نحوه دسترسی شبکه‌ای به آن بر سطح حمله کنترل‌پلین اثر مستقیم دارد. این دسترسی می‌تواند از طریق Endpoint عمومی یا خصوصی فراهم شود. در صورت استفاده از Endpoint عمومی، دسترسی باید تا حد امکان به آدرس‌ها یا شبکه‌های مجاز محدود شود. Endpoint خصوصی هم برای محیط‌هایی مناسب است که دسترسی عمومی به سرور API در آن‌ها ضروری نیست. برای افزایش امنیت کنترل‌پلین، رعایت موارد زیر ضروری است:</p>



<ul class="wp-block-list">
<li>استفاده از ارتباط رمزنگاری‌شده مبتنی بر TLS</li>



<li>اعمال احراز هویت و مجوزدهی مبتنی بر کمترین سطح دسترسی</li>



<li>حفاظت از فایل‌های kubeconfig، گواهی‌ها و کلیدهای کنترل‌پلین</li>



<li>ثبت و بررسی رویدادهای Audit</li>



<li>محافظت از دسترسی شبکه‌ای و داده‌های etcd</li>
</ul>



<h2 id="h-مدیریت-کنترل-پلین-در-کوبرنتیز-خودمدیریت-شده-و-مدیریت-شده-چه-تفاوتی-دارد" class="wp-block-heading"><strong>مدیریت کنترل‌پلین در کوبرنتیز خودمدیریت‌شده و مدیریت‌شده چه تفاوتی دارد؟</strong></h2>



<p class="wp-block-paragraph">در یک کلاستر کوبرنتیز خودمدیریت‌شده (Self-managed Kubernetes) مبتنی بر kubeadm، تیم بهره‌بردار باید نودهای کنترل‌پلین، لود بالانسر مربوط به kube-apiserver و توپولوژی etcd را راه‌اندازی و مدیریت کند. همچنین این تیم باید اجزای لازم را روی نودهای کنترل‌پلین مستقر کند و در مدل external etcd، کلاستر جداگانه etcd را پیش از راه‌اندازی کنترل‌پلین آماده سازد.</p>



<p class="wp-block-paragraph">در کوبرنتیز مدیریت‌شده (Managed Kubernetes)، ارائه‌دهنده، سرویس کنترل‌پلین را مدیریت می‌کند و اجزای اصلی آن، مانند kube-apiserver، etcd ،kube-scheduler و kube-controller-manager، در محدوده کنترل‌پلین مدیریت‌شده قرار می‌گیرند. در مقابل، نودهای ورکر، زیرساختی هستند که برنامه‌های کاربران را اجرا می‌کنند.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>موضوع</strong></td><td><strong>کوبرنتیز خودمدیریت‌شده</strong> (Self-Managed)</td><td><strong>کوبرنتیز مدیریت‌شده</strong> (Managed)</td></tr><tr><td>استقرار کنترل‌پلین</td><td>بر عهده تیم کاربر</td><td>عمدتاً بر عهده ارائه‌دهنده</td></tr><tr><td>دسترس‌پذیری و بازیابی</td><td>نیازمند طراحی و اجرای داخلی</td><td>بخشی از مسئولیت سرویس</td></tr><tr><td>ارتقا و نگهداری کنترل‌پلین</td><td>نیازمند برنامه‌ریزی و اجرای مستقیم تیم</td><td>بر اساس فرایندها و محدوده مسئولیت تعریف‌شده در سرویس</td></tr><tr><td>کنترل مستقیم بر پیکربندی و عملیات کنترل‌پلین</td><td>بیشتر</td><td>وابسته به گستره و امکانات سرویس</td></tr><tr><td>سربار عملیاتی برای کاربر</td><td>بیشتر</td><td>کمتر</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">تفاوت اصلی این دو مدل در مسئولیت راه‌اندازی و مدیریت کنترل‌پلین است. در مدل خودمدیریت‌شده، این مسئولیت بر عهده تیم بهره‌بردار قرار دارد؛ اما در مدل مدیریت‌شده، ارائه‌دهنده سرویس کنترل‌پلین و اجزای اصلی آن را مدیریت می‌کند.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه" class="wp-block-heading">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده، بر بستر ابر اختصاصی یا به صورت On-Premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a type="link" href="https://hamravesh.com/managed-kubernetes" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز مدیریت‌شده هم‌روش</a></p>
</div></div>
</div>



<h2 id="h-جمع-بندی" class="wp-block-heading"><strong>جمع‌بندی</strong></h2>



<p class="wp-block-paragraph">درپاسخ به این پرسش که کنترل‌پلین در کوبرنتیز چیست، می‌توان گفت کنترل‌پلین لایه تصمیم‌گیری و مدیریت وضعیت کلاستر است. اجزایی مانند kube-apiserver ،etcd ،kube-scheduler و kube-controller-manager مسئولیت مشخصی در مدیریت وضعیت کلاستر بر عهده دارند و در کنار یکدیگر امکان تصمیم‌گیری و هماهنگی فرایندهای کنترلی را فراهم می‌کنند. در سمت مقابل، اجرای مستقیم بارهای کاری بر عهده نودهای ورکر است، نه کنترل‌پلین.</p>



<p class="wp-block-paragraph">خرابی کامل کنترل‌پلین لزوما به توقف فوری پادهای در حال اجرا منجر نمی‌شود، اما می‌تواند مدیریت کلاستر، زمان‌بندی بارهای کاری جدید و فرایندهای بازیابی خودکار را مختل کند. به همین دلیل، در محیط‌های عملیاتی (Production)، استفاده از معماری دسترس‌پذیر، حفظ حد نصاب در etcd، تهیه نسخه پشتیبان منظم و کنترل دسترسی از مهم‌ترین ملاحظات طراحی کنترل‌پلین به شمار می‌روند. در نهایت، انتخاب میان کوبرنتیز خودمدیریت‌شده و مدیریت‌شده، در عمل انتخاب میان کنترل عملیاتی بیشتر و کاهش بخشی از سربار نگهداری است.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-control-plane/">کنترل‌پلین در کوبرنتیز چیست و چگونه کلاستر را مدیریت می‌کند؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-control-plane/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>مدیریت داخلی ارتقا کوبرنتیز چه هزینه‌ای دارد؟ بررسی نقش کوبرنتیز مدیریت‌شده</title>
		<link>https://hamravesh.com/blog/hidden-costs-of-kubernetes-upgrades/</link>
					<comments>https://hamravesh.com/blog/hidden-costs-of-kubernetes-upgrades/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Mon, 10 Aug 2026 12:30:13 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5572</guid>

					<description><![CDATA[<p>ارتقای کوبرنتیز فقط به تغییر شماره نسخه محدود نمی‌شود. هر ارتقا می‌تواند مجموعه‌ای از فعالیت‌های فنی مانند نصب Patchها، بررسی APIهای منسوخ‌شده، رفع ناسازگاری Add-onها و اطمینان از سازگاری وابستگی‌های مختلف پلتفرم را به همراه داشته باشد. در پلتفرم‌هایی که بر پایه چندین پروژه متن‌باز ساخته شده‌اند، دنبال کردن تغییرات پروژه‌های Upstream هم به بخشی از فرایند نگهداری تبدیل می‌شود.</p>
<p>The post <a href="https://hamravesh.com/blog/hidden-costs-of-kubernetes-upgrades/">مدیریت داخلی ارتقا کوبرنتیز چه هزینه‌ای دارد؟ بررسی نقش کوبرنتیز مدیریت‌شده</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ارتقا کوبرنتیز فقط به تغییر شماره نسخه محدود نمی‌شود. هر ارتقا می‌تواند مجموعه‌ای از فعالیت‌های فنی مانند نصب Patchها، بررسی APIهای منسوخ‌شده، رفع ناسازگاری Add-onها و اطمینان از سازگاری وابستگی‌های مختلف پلتفرم را به همراه داشته باشد. در پلتفرم‌هایی که بر پایه چند پروژه متن‌باز ساخته شده‌اند، دنبال کردن تغییرات پروژه‌های Upstream هم به بخشی از فرایند نگهداری تبدیل می‌شود.</p>



<p class="wp-block-paragraph">انجام این فعالیت‌ها به زمان و ظرفیت مهندسی نیاز دارد؛ ظرفیتی که می‌تواند صرف توسعه قابلیت‌های جدید یا سایر اولویت‌های محصول شود. به همین دلیل، نگهداری کوبرنتیز در بسیاری از تیم‌ها، با برنامه توسعه محصول برای استفاده از زمان مهندسی رقابت می‌کند. در این مطلب، فرایندهای اصلی نگهداری و ارتقا کوبرنتیز، عوامل مؤثر بر پیچیدگی این فرایند و راهکارهای مدیریت آن را بررسی می‌کنیم.</p>



<h2 id="h-نگهداری-کوبرنتیز-زمان-تیم-را-صرف-چه-کارهایی-می-کند" class="wp-block-heading">نگهداری کوبرنتیز زمان تیم را صرف چه کارهایی می‌کند؟</h2>



<p class="wp-block-paragraph">نگهداری کوبرنتیز مجموعه‌ای از فعالیت‌های مستمر است که فقط به زمان اجرای ارتقا محدود نمی‌شود. تیم پلتفرم باید تغییرات خود کوبرنتیز و اجزای وابسته را دنبال کند، سازگاری آن‌ها را بررسی کند و پس از هر تغییر، از عملکرد درست پلتفرم مطمئن شود. مهم‌ترین بخش‌های این فرایند عبارت‌اند از:</p>



<ul class="wp-block-list">
<li><strong>ارتقا نسخه و نصب اصلاحیه‌ها (Patch):</strong> تیم باید نسخه‌ها و اصلاحیه‌های جدید، از جمله اصلاحیه‌های امنیتی را دنبال و برای اعمال آن‌ها روی کلاسترها برنامه‌ریزی کند.</li>



<li><strong>رسیدگی به APIهای منسوخ‌شده: </strong>نسخه‌های قدیمی API ابتدا منسوخ می‌شوند و ممکن است در نسخه‌های بعدی دیگر ارائه نشوند. به همین دلیل، تیم باید وابستگی فایل‌های YAML، کلاینت‌های API، کنترل‌کننده‌ها و یکپارچه‌سازی‌ها به این APIها را شناسایی کند و در صورت نیاز، آن‌ها را به نسخه‌های جدیدتر انتقال دهد.</li>



<li><strong>رفع ناسازگاری افزونه‌ها (Add-on):</strong> ابزارها و افزونه‌های نصب‌شده روی کلاستر ممکن است با نسخه جدید کوبرنتیز سازگار نباشند، بنابراین تیم باید سازگاری آن‌ها را بررسی کند و در صورت نیاز، نسخه مناسب‌تری از آن‌ها را به کار بگیرد.</li>



<li><strong>ارتقا هلم چارت‌ها (Helm Chart):</strong> نسخه‌های جدید هلم چارت‌ها باید از نظر تغییر مانیفست‌ها (Manifest)، وابستگی‌ها و سازگاری با کلاستر بررسی شوند. حتی اگر بررسی مانیفست‌ها بدون خطا انجام شود، ممکن است برخی ناسازگاری‌ها فقط هنگام اجرای واقعی سیستم آشکار شوند.</li>



<li><strong>دنبال‌کردن تغییرات پروژه‌های بالادستی (Upstream):</strong> پلتفرم‌های مبتنی بر کوبرنتیز معمولا از چند پروژه متن‌باز تشکیل شده‌اند. تغییراتی مانند انتشار نسخه‌های جدید، ارائه اصلاحیه‌های امنیتی یا پایان پشتیبانی هر یک از این پروژه‌ها می‌تواند تیم را به ارتقا یکی از اجزای پلتفرم ملزم کند.</li>



<li><strong>آزمایش و پایش پس از تغییرات:</strong> تغییرات باید پیش از استقرار بررسی شوند و پس از اجرا هم عملکرد سرویس‌ها در محیط واقعی پایش شود؛ زیرا برخی ناسازگاری‌ها فقط هنگام اجرا یا پس از گذشت زمان آشکار می‌شوند.</li>
</ul>



<h2 id="h-حجم-بار-نگهداری-چقدر-است" class="wp-block-heading">حجم بار نگهداری چقدر است؟</h2>



<p class="wp-block-paragraph">میزان زمانی که نگهداری کوبرنتیز از تیم مهندسی می‌گیرد، به عواملی مانند تعداد کلاسترها، اندازه محیط، معماری پلتفرم و میزان خودکارسازی فرایندها بستگی دارد. بنابراین، نمی‌توان عدد ثابتی را برای همه محیط‌های مبتنی بر کوبرنتیز در نظر گرفت. بااین‌حال، تجربه‌های منتشرشده نشان می‌دهند که حجم این بار نگهداری در محیط‌های مختلف یکسان نیست.</p>



<p class="wp-block-paragraph">Munib Ali، مدیر مهندسی SRE در Fairwinds، می‌گوید در بسیاری از استقرارهای متوسط EKS (مخفف Amazon Elastic Kubernetes Service، سرویس مدیریت‌شده کوبرنتیز در زیرساخت ابری AWS)، انجام یک ارتقا Minor در سه منطقه (Region) می‌تواند چهار تا شش هفته تلاش مهندسی مصرف کند و توسعه دو تا سه قابلیت در سطح نقشه راه را به تعویق اندازد. این عدد که یک مشاهده تجربی از سوی Fairwinds است، به شرایط محیط بستگی دارد و نباید به همه کلاسترهای کوبرنتیز تعمیم داده شود</p>



<p class="wp-block-paragraph">همچنین Jehoszafat Zimnowoda و Matthias Erll، مهندسان ارشد نرم‌افزار در Akamai، انتشارهای سه سال گذشته ۱۴ پروژه متن‌باز را بررسی کرده‌اند. بر اساس تجربه و تحلیل آن‌ها، یک پلتفرم متکی به این مجموعه پروژه‌ها ممکن است در هر سال با ۲ تا ۵ ارتقا اصلی، ۴۳ تا ۵۲ ارتقا فرعی و ۲۷۶ تا ۳۲۷ اصلاحیه روبه‌رو شود. این داده هم به همان پروژه‌های بررسی‌شده مربوط است و معیار عمومی همه پلتفرم‌های کوبرنتیز نیست.</p>



<h2 id="h-چرا-ارتقا-کوبرنتیز-پیچیده-تر-از-یک-ارتقا-نسخه-version-bump-است" class="wp-block-heading">چرا ارتقا کوبرنتیز پیچیده‌تر از یک ارتقا نسخه (Version Bump) است؟</h2>



<p class="wp-block-paragraph">چند عامل فنی مانند تغییر APIها، وابستگی میان نسخه اجزای مختلف کلاستر و بررسی سازگاری افزونه‌ها (Add-on) و چارت‌های <a href="https://hamravesh.com/blog/what-is-helm/#h-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-%DA%86%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7-%D8%AF%D8%B1-helm" data-type="link" data-id="https://hamravesh.com/blog/what-is-helm/#h-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-%DA%86%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7-%D8%AF%D8%B1-helm" target="_blank" rel="noreferrer noopener">Helm</a> باعث می‌شوند فرایند ارتقا کلاستر کوبرنتیز، پیچیده‌تر از یک به‌روزرسانی ساده باشد. </p>



<h3 id="h-تغییر-و-حذف-apiها" class="wp-block-heading">تغییر و حذف APIها</h3>



<p class="wp-block-paragraph">با تکامل API کوبرنتیز، نسخه‌های قدیمی ابتدا منسوخ و در نهایت حذف می‌شوند. پس از حذف یک نسخه API، آن نسخه دیگر توسط kube-apiserver ارائه نمی‌شود و مانیفست‌ها یا کلاینت‌هایی که همچنان به آن وابسته‌اند باید به نسخه‌ای پشتیبانی‌شده مهاجرت کنند.</p>



<p class="wp-block-paragraph">مهاجرت APIهای منسوخ‌شده کوبرنتیز ممکن است به تغییر فایل‌های YAML، کلاینت‌های API، کنترل‌کننده‌ها و یکپارچه‌سازی‌های سفارشی نیاز داشته باشد. مستندات رسمی، ابزار <code>kubectl convert</code> را نیز برای تبدیل خودکار بعضی منابع معرفی می‌کنند؛ بااین‌حال، این تبدیل ممکن است از مقادیر پیش‌فرض نامناسب استفاده کند و نتیجه آن باید با مراجعه به مستندات API همان منبع بررسی شود.</p>



<h3 id="h-وابستگی-میان-نسخه-اجزا" class="wp-block-heading">وابستگی میان نسخه اجزا</h3>



<p class="wp-block-paragraph">پروژه کوبرنتیز شاخه‌های سه نسخه Minor اخیر را نگهداری می‌کند و نسخه‌های ۱.۱۹ به بعد تقریباً یک سال پشتیبانی از Patch دریافت می‌کنند. بنابراین، باقی‌ماندن روی نسخه‌های قدیمی نمی‌تواند برای مدتی نامحدود ادامه پیدا کند و برنامه ارتقا باید چرخه پشتیبانی کوبرنتیز را در نظر بگیرد.</p>



<p class="wp-block-paragraph">اجزای مختلف کلاستر همچنین باید از قواعد اختلاف نسخه (Version Skew؛ محدوده مجاز تفاوت نسخه میان اجزای مختلف کوبرنتیز) پیروی کنند. برای مثال، kubelet نباید از kube-apiserver جدیدتر باشد و می‌تواند حداکثر سه نسخه Minor از آن قدیمی‌تر باشد. kube-proxy نیز نباید از kube-apiserver جدیدتر باشد و باید محدودیت اختلاف نسخه با kube-apiserver و kubelet را رعایت کند.</p>



<p class="wp-block-paragraph">این محدودیت‌ها بر ترتیب ارتقا اثر می‌گذارند. ابتدا kube-apiserver ارتقا پیدا می‌کند. در کلاسترهای دارای <a href="https://hamravesh.com/blog/what-is-high-availability" data-type="link" data-id="https://hamravesh.com/blog/what-is-high-availability" target="_blank" rel="noreferrer noopener">دسترس‌پذیری بالا</a>، تمام نمونه‌های kube-apiserver که سایر اجزای Control Plane ممکن است با آن‌ها ارتباط برقرار کنند، باید پیش از ارتقا kube-controller-manager، ‏kube-scheduler و cloud-controller-manager ارتقا یافته باشند. پس از آن، kubelet و kube-proxy را می‌توان با رعایت محدوده مجاز اختلاف نسخه ارتقا داد.</p>



<h3 id="h-ناسازگاری-add-onها-و-helm-chartها" class="wp-block-heading">ناسازگاری Add-onها و Helm Chartها</h3>



<p class="wp-block-paragraph">ارتقا افزونه‌ها و هلم چارت‌ها هم می‌تواند با چالش‌هایی همراه باشد. برخی نسخه‌های جدید هلم چارت تغییراتی در فیلدهای تغییرناپذیر (Immutable Fields) منابع کوبرنتیز ایجاد می‌کنند که می‌تواند فرایند ارتقا را با مشکل مواجه کند.</p>



<p class="wp-block-paragraph">همه مشکلات در مرحله بررسی مانیفست‌ها مشخص نمی‌شوند و بعضی ناسازگاری‌ها فقط هنگام اجرای واقعی سامانه آشکار می‌شوند. پیش از اعمال تغییرات، می‌توان مانیفست‌های رندرشده نسخه فعلی و نسخه جدید را با یکدیگر مقایسه کرد، آن‌ها را با طرح‌واره OpenAPI (همان OpenAPI schema) کوبرنتیز و CRDهای اضافه‌شده سنجید و تغییرات را به‌صورت Dry Run (بررسی آزمایشی یک تغییر، بدون اعمال و ذخیره‌کردن واقعی آن در کلاستر) در برابر کلاستر در حال اجرا بررسی کرد.</p>



<p class="wp-block-paragraph">بااین‌حال، استقرار بدون خطا تضمین نمی‌کند که برنامه همچنان مطابق انتظار کار می‌کند. به همین دلیل، تست‌های یکپارچگی باید روی کلاستر در حال اجرا انجام شوند تا ارتباط سرویس‌ها با وابستگی‌ها و در دسترس بودن Endpointها بررسی شود. پایش بلندمدت نیز ضروری است؛ زیرا مشکلاتی مانند کمبود حافظه، محدودشدن CPU یا تمام‌شدن فضای دیسک ممکن است چند روز یا چند هفته پس از تغییر آشکار شوند.</p>



<h2 id="h-چگونه-بار-نگهداری-را-ساختاریافته-تر-کنیم" class="wp-block-heading">چگونه بار نگهداری را ساختاریافته‌تر کنیم؟</h2>



<p class="wp-block-paragraph">اگرچه مدیریت چرخه عمر کوبرنتیز همواره به فعالیت‌های نگهداری نیاز دارد، اما می‌توان بخشی از این فرایند را با برنامه‌ریزی و خودکارسازی ساختاریافته‌تر کرد. در ادامه، برخی اقدام‌های پیشنهادی برای ساختاریافته‌ترکردن این فرایند را بررسی می‌کنیم:</p>



<ul class="wp-block-list">
<li><strong>خودکارسازی شناسایی نسخه‌های جدید و ایجاد درخواست تغییر (Pull Request): </strong>بخشی از فرایند شناسایی نسخه‌های جدید پروژه‌های متن‌باز و هلم چارت‌ها را می‌توان خودکار کرد تا پس از انتشار نسخه جدید، یک درخواست تغییر برای بررسی و اعمال به‌روزرسانی ایجاد شود.</li>



<li><strong>شناسایی APIهای منسوخ‌شده: </strong>مستندات رسمی کوبرنتیز استفاده از هشدارهای کلاینت، معیارها و اطلاعات Audit را برای یافتن وابستگی به APIهای منسوخ‌شده پیشنهاد می‌کنند. پس از شناسایی این وابستگی‌ها، فایل‌های YAML، کلاینت‌های API، کنترل‌کننده‌ها و یکپارچه‌سازی‌های سفارشی باید پیش از حذف نسخه قدیمی به APIهای منسوخ‌نشده مهاجرت کنند.</li>



<li><strong>اعتبارسنجی مانیفست‌های رندرشده پیش از اعمال تغییرات:</strong> می‌توان تمام مانیفست‌هایی را که پلتفرم مستقر می‌کند با طرح‌واره OpenAPI کوبرنتیز و CRDهای اضافه‌شده اعتبارسنجی کرد. مقایسه مانیفست‌های نسخه فعلی و نسخه جدید و اجرای Dry Run در برابر کلاستر در حال اجرا نیز می‌تواند تغییرات مخرب احتمالی را پیش از اعمال آن‌ها آشکار کند</li>



<li><strong>اجرای تست‌های یکپارچگی و پایش پس از ارتقا:</strong> اجرای موفق فرایند استقرار، به‌تنهایی تضمین نمی‌کند که سامانه همچنان مطابق انتظار عمل می‌کند. به همین دلیل، اجرای تست‌های یکپارچگی روی کلاسترِ در حال اجرا و پایش مداوم سامانه پس از ارتقا، بخشی از فرایند نگهداری محسوب می‌شود.</li>
</ul>



<p class="wp-block-paragraph">بااین‌حال، خودکارسازی، فقط بخشی از فعالیت‌های نگهداری را ساده‌تر می‌کند و همچنان مسئولیت‌هایی مانند برنامه‌ریزی ارتقا، بررسی سازگاری وابستگی‌ها و تصمیم‌گیری درباره نگهداری مستمر بر عهده تیم فنی باقی می‌ماند. به بیان دیگر، خودکارسازی می‌تواند بخشی از بار عملیاتی را کاهش دهد، اما مسئولیت مدیریت چرخه عمر کوبرنتیز را حذف نمی‌کند.</p>



<h2 id="h-مدیریت-داخلی-کوبرنتیز-چه-زمانی-توجیه-دارد" class="wp-block-heading">مدیریت داخلی کوبرنتیز چه زمانی توجیه دارد؟</h2>



<p class="wp-block-paragraph">مدیریت داخلی کوبرنتیز برای همه سازمان‌ها انتخاب مناسبی نیست، اما در برخی شرایط می‌تواند توجیه فنی و اقتصادی داشته باشد. برای مثال، اگر کوبرنتیز بخشی از خود محصول سازمان باشد، مالکیت کامل و مدیریت داخلی آن می‌تواند توجیه راهبردی داشته باشد. همچنین در سازمان‌هایی که مقیاس عملیات به‌اندازه‌ای بزرگ است که حتی یک بهبود محدود در بهره‌وری، ارزش اقتصادی قابل‌توجهی ایجاد می‌کند، سرمایه‌گذاری روی مدیریت داخلی پلتفرم ممکن است منطقی باشد.</p>



<p class="wp-block-paragraph">نمونه دیگر، سازمان‌هایی هستند که می‌توانند تشکیل و نگهداری یک تیم پلتفرم بسیار تخصصی را از نظر عملیاتی و اقتصادی توجیه کنند. این نمونه‌ها تنها بخشی از موقعیت‌هایی هستند که مدیریت داخلی کوبرنتیز می‌تواند در آن‌ها ارزش ایجاد کند و نباید آن‌ها را به‌عنوان فهرست کامل معیارهای تصمیم‌گیری برای همه سازمان‌ها در نظر گرفت.</p>



<h2 id="h-چگونه-واگذاری-نگهداری-کوبرنتیز-ظرفیت-تیم-داخلی-را-آزاد-می-کند" class="wp-block-heading">چگونه واگذاری نگهداری کوبرنتیز ظرفیت تیم داخلی را آزاد می‌کند؟</h2>



<p class="wp-block-paragraph">Fairwinds بر اساس تجربه خود گزارش می‌کند که انتقال مسئولیت انجام ارتقا، اعمال اصلاحیه‌ها و مدیریت افزونه‌ها از برنامه کاری داخلی به یک تیم تخصصی Kubernetes SRE، می‌تواند بخشی از زمان مهندسان ارشد را آزاد کند. البته این نتیجه، تجربه Fairwinds است و نباید به‌عنوان پیامد قطعی این الگو برای همه سازمان‌ها در نظر گرفته شود. همچنین زمان آزادشده می‌تواند صرف توسعه قابلیت‌های جدید، بهبود قابلیت اطمینان، بهینه‌سازی عملکرد و ارتقا تجربه توسعه‌دهندگان شود. به این ترتیب، بخشی از ظرفیت مهندسی به فعالیت‌هایی اختصاص پیدا می‌کند که اثر مستقیم‌تری بر محصول و اولویت‌های مهندسی دارند.</p>



<p class="wp-block-paragraph">در سازمان‌هایی که تمایلی به مدیریت مستقیم همه فعالیت‌های عملیاتی کوبرنتیز ندارند، استفاده از خدمات مدیریت‌شده کوبرنتیز (Kubernetes as a Service یا KaaS) هم می‌تواند یکی از گزینه‌های قابل بررسی باشد. البته قابلیت‌ها و مسئولیت‌های هر سرویس مدیریت‌شده به ارائه‌دهنده آن بستگی دارد و باید بر اساس مستندات رسمی همان سرویس ارزیابی شود.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه" class="wp-block-heading">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده، بر بستر ابر اختصاصی یا به صورت On-Premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a type="link" href="https://hamravesh.com/managed-kubernetes" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز مدیریت‌شده هم‌روش</a></p>
</div></div>
</div>



<h2 id="h-جمع-بندی-کوبرنتیز-باید-قابل-پیش-بینی-باشد-نه-مصرف-کننده-دائمی-تمرکز-تیم" class="wp-block-heading">جمع‌بندی: کوبرنتیز باید قابل‌پیش‌بینی باشد، نه مصرف‌کننده دائمی تمرکز تیم</h2>



<p class="wp-block-paragraph">مدیریت چرخه عمر کوبرنتیز فرایندی مستمر است و با پایان یک ارتقا نسخه به پایان نمی‌رسد. در این فرایند، انتشار نسخه‌های جدید، تغییر APIها، به‌روزرسانی وابستگی‌ها و ارزیابی تغییرات، همگی بخشی از فعالیت‌هایی هستند که در طول زمان ادامه پیدا می‌کنند و به برنامه‌ریزی و رسیدگی مداوم نیاز دارند.</p>



<p class="wp-block-paragraph">خودکارسازی می‌تواند بخشی از فعالیت‌های مرتبط با ارتقا کوبرنتیز را ساده‌تر و سریع‌تر کند، اما جایگزین مدیریت چرخه عمر کوبرنتیز نمی‌شود. در نهایت، هر سازمان باید تصمیم بگیرد که آیا مدیریت کامل این پیچیدگی برای آن ارزش راهبردی دارد یا بهتر است بخشی از مسئولیت‌های عملیاتی را به یک تیم متخصص واگذار کند تا ظرفیت بیشتری برای توسعه محصول و سایر اولویت‌های مهندسی آزاد شود.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/hidden-costs-of-kubernetes-upgrades/">مدیریت داخلی ارتقا کوبرنتیز چه هزینه‌ای دارد؟ بررسی نقش کوبرنتیز مدیریت‌شده</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/hidden-costs-of-kubernetes-upgrades/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>کارمادا چیست؟ آشنایی با ابزار مدیریت چند کلاستر کوبرنتیز</title>
		<link>https://hamravesh.com/blog/what-is-karmada/</link>
					<comments>https://hamravesh.com/blog/what-is-karmada/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Sun, 02 Aug 2026 12:30:48 +0000</pubDate>
				<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5448</guid>

					<description><![CDATA[<p>Karmada که مخفف Kubernetes Armada است، یک سیستم ارکستریشن چندکلاستری برای کوبرنتیز به‌حساب می‌آید. این ابزار به شما کمک می‌کند بارهای کاری (Workloadها) را میان چند کلاستر کوبرنتیز مدیریت کنید، بدون اینکه لازم باشد برنامه‌های خود را برای اجرا در چند کلاستر تغییر دهید.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-karmada/">کارمادا چیست؟ آشنایی با ابزار مدیریت چند کلاستر کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">با گسترش زیرساخت‌های ابری، برخی سازمان‌ها بارهای کاری خود را در چند کلاستر کوبرنتیز اجرا می‌کنند. این کلاسترها ممکن است در چند ابر عمومی، دیتاسنتر خصوصی یا محیط Edge قرار داشته باشند. با افزایش تعداد کلاسترها، هماهنگ‌سازی استقرارها، انتخاب مقصد مناسب برای هر بار کاری (workload) و واکنش به کاهش ظرفیت یا خرابی یک کلاستر دشوارتر می‌شود. در چنین شرایطی، کارمادا یک لایه هماهنگ‌سازی مرکزی برای مدیریت بارهای کاری میان چند کلاستر کوبرنتیز فراهم می‌کند. این سیستم با استفاده از APIهای آشنای کوبرنتیز و سیاست‌های تعریف‌شده، درباره محل اجرای بارهای کاری و نحوه توزیع آن‌ها میان کلاسترهای عضو تصمیم می‌گیرد. در ادامه بررسی می‌کنیم که کارمادا چیست، معماری آن چگونه کار می‌کند و استفاده از آن در چه شرایطی توجیه دارد.</p>



<h2 id="h-چرا-مدیریت-چند-کلاستر-کوبرنتیز-دشوار-است" class="wp-block-heading">چرا مدیریت چند کلاستر کوبرنتیز دشوار است؟</h2>



<p class="wp-block-paragraph">با افزایش مقیاس زیرساخت، ممکن است سازمان‌ها بارهای کاری خود را در چند دیتاسنتر، ابر عمومی یا محیط Edge اجرا کنند. در این وضعیت، هر کلاستر همچنان یک مقصد اجرایی مستقل است و تیم عملیات باید استقرارها، تنظیمات و وضعیت آن را در کنار کلاسترهای دیگر مدیریت کند. افزایش تعداد کلاسترها در عمل چالش‌های زیر را ایجاد می‌کند:</p>



<ul class="wp-block-list">
<li><strong>پراکندگی تنظیمات و پیکربندی: </strong>در مدیریت ایستای چند کلاستر، تیم‌ها ممکن است ناچار شوند قواعد Placement، یعنی قواعد انتخاب کلاستر مقصد و نحوه توزیع بار کاری، را به‌صورت ثابت تعریف کنند. همچنین باید مانیفست‌های مشابهی برای تعریف منابع و تنظیمات بار کاری بسازند و چند Context را مدیریت کنند. هر Context مجموعه‌ای از تنظیمات Kubeconfig است که کلاستر، کاربر و Namespace هدف را مشخص می‌کند. با افزایش تعداد کلاسترها، هماهنگ نگه‌داشتن این تعاریف و مقصدهای استقرار دشوارتر می‌شود.</li>



<li><strong>دشواری انتخاب محل اجرای بار کاری:</strong> انتخاب کلاستر مقصد فقط به نام یا موقعیت آن محدود نیست و ممکن است به ظرفیت در دسترس، Affinity (قواعد ترجیح یا الزام برای انتخاب محل اجرای بار کاری) و قواعد توزیع بار کاری وابسته باشد. با تغییر وضعیت کلاسترها، قواعد ثابت یا انتخاب دستی نمی‌توانند همیشه مقصد مناسبی را برای اجرای بار کاری تعیین کنند.</li>



<li><strong>نبود Failover خودکار: </strong>داشتن چند کلاستر به‌تنهایی باعث نمی‌شود بارهای کاری یک کلاستر ناموفق در کلاستر سالم دیگری اجرا شوند. بدون یک سازوکار ارکستریشن یا فرایند عملیاتی مشخص، تیم باید مقصد استقرار را تغییر دهد و اجرای مجدد بار کاری را مدیریت کند.</li>
</ul>



<p class="wp-block-paragraph">در نتیجه، چند کلاستر مستقل به‌تنهایی دسترس‌پذیری بالا سراسری ایجاد نمی‌کنند. در زیرساخت‌هایی که محل اجرا، توزیع ظرفیت و انتقال خودکار در زمان خرابی باید میان چند کلاستر هماهنگ شود، به یک لایه هماهنگ‌سازی مرکزی نیاز است. کارمادا برای پاسخ به این نیازها طراحی شده است.</p>



<h2 id="h-karmada-چیست" class="wp-block-heading">Karmada چیست؟</h2>



<p class="wp-block-paragraph">کارمادا (Karmada)، کوتاه‌شده عبارت Kubernetes Armada، یک سیستم مدیریت و ارکستریشن چندکلاستری برای کوبرنتیز است. این سیستم امکان اجرای برنامه‌های Cloud-Native را در چند کلاستر و چند محیط ابری فراهم می‌کند، بدون آنکه برای این منظور لازم باشد تعریف اصلی برنامه‌ها تغییر کند.</p>



<p class="wp-block-paragraph">کلاسترهای عضو کارمادا می‌توانند در ابر عمومی، دیتاسنتر خصوصی یا محیط Edge قرار داشته باشند. کارمادا با APIهای بومی کوبرنتیز کار می‌کند و یک کنترل‌پلین (Control Plane) بالاتر از کلاسترهای عضو در اختیار تیم قرار می‌دهد تا تعریف بارهای کاری و قواعد توزیع آن‌ها به‌صورت متمرکز مدیریت شود.</p>



<p class="wp-block-paragraph">کارمادا جایگزین کوبرنتیز نیست؛ بلکه روی کلاسترهای آن یک لایه مدیریتی و هماهنگ‌سازی ایجاد می‌کند. همچنین کارمادا ابزار ایجاد یا تأمین کلاسترهای کوبرنتیز و جایگزین Service Mesh نیست و به‌تنهایی ارتباط شبکه‌ای میان کلاسترها را برقرار نمی‌کند. مدیریت بار کاری هم با مدیریت داده یکسان نیست؛ بنابراین کارمادا داده‌های برنامه را به‌طور خودکار میان کلاسترها همانندسازی نمی‌کند و دسترسی کلاستر مقصد به داده‌های موردنیاز را نیز تضمین نمی‌کند. علاوه بر این، معماری ذخیره‌سازی، همانندسازی و حفظ سازگاری داده‌ها باید جداگانه طراحی شود.</p>



<p class="wp-block-paragraph">کارمادا یک پروژه Incubating در بنیاد CNCF است. این عنوان وضعیت بلوغ و پذیرش پروژه را در چرخه CNCF نشان می‌دهد و به معنای بتا بودن نرم‌افزار نیست. برای آشنایی بیشتر با این پروژه، می‌توانید به <a href="https://karmada.io/" target="_blank" rel="noreferrer noopener">وب‌سایت رسمی Karmada</a> مراجعه کنید.</p>



<h2 id="h-معماری-کارمادا-چگونه-کار-می-کند" class="wp-block-heading">معماری کارمادا چگونه کار می‌کند؟</h2>



<p class="wp-block-paragraph">معماری کارمادا بر یک کنترل‌پلین مرکزی استوار است که منابع، سیاست‌ها و تصمیم‌های مربوط به توزیع بارهای کاری را مدیریت می‌کند. API Server&nbsp;نقطه ورود درخواست‌ها و APIهای کارمادا است و etcd اشیای API را نگهداری می‌کند. Controller Manager مجموعه‌ای از کنترل‌گرها را اجرا می‌کند که منابع کارمادا را مشاهده و عملیات لازم برای انتشار آن‌ها در کلاسترهای عضو را هماهنگ می‌کنند. Scheduler هم بر اساس سیاست‌های تعریف‌شده، دربارهٔ محل اجرای بارهای کاری در کلاسترهای عضو تصمیم می‌گیرد و به عبارتی فرایند زمان‌بندی را انجام می‌دهد.</p>



<p class="wp-block-paragraph">کلاسترهای عضو، کلاسترهای مستقلی هستند که بارهای کاری توزیع‌شده از سوی کارمادا را اجرا می‌کنند. چرخه ساده انتشار یک بار کاری به این صورت است:</p>



<ul class="wp-block-list">
<li>مرحله ۱: کاربر یک منبع کوبرنتیز، مانند Deployment را در کنترل‌پلین کارمادا تعریف می‌کند.</li>



<li>مرحله ۲: سیاست انتشار (PropagationPolicy) مشخص می‌کند چه منابعی انتخاب شوند و در کدام کلاسترها انتشار یابند.</li>



<li>مرحله ۳: Scheduler بر اساس سیاست و اطلاعات کلاسترها درباره محل اجرای منبع تصمیم می‌گیرد.</li>



<li>مرحله ۴: نتیجه Scheduler در یک ResourceBinding ثبت می‌شود.</li>



<li>مرحله ۵: کنترل‌گرهای کارمادا بر اساس این Binding، منابع Work موردنیاز کلاسترهای مقصد را ایجاد می‌کنند.</li>



<li>مرحله ۶: منابع تعریف‌شده از طریق Work در کلاسترهای عضو مقصد اعمال می‌شوند و بار کاری در آن کلاسترها اجرا می‌شود.</li>
</ul>



<p class="wp-block-paragraph">در این مدل، تعریف اصلی بار کاری از قواعد محل اجرا جدا می‌شود. کاربر منبع و سیاست مربوط به آن را در کنترل‌پلین ثبت می‌کند و کارمادا بر اساس همان سیاست، تصمیم زمان‌بندی را ثبت و منابع موردنیاز را در کلاسترهای مقصد منتشر می‌کند.</p>



<p class="wp-block-paragraph">کارمادا از دو مدل برای اتصال کلاسترهای عضو پشتیبانی می‌کند. در حالت Push، کنترل‌پلین مستقیماً به API Server کلاستر عضو (Member Cluster) متصل می‌شود و منابع را در آن منتشر می‌کند. در حالت Pull، مؤلفه karmada-agent داخل کلاستر عضو اجرا می‌شود، از همان‌جا با کنترل‌پلین ارتباط برقرار می‌کند و منابع تخصیص‌یافته را دریافت و در کلاستر عضو اجرا می‌کند. این عامل جزء ثابت کنترل‌پلین نیست و فقط در مدل Pull کاربرد دارد. انتخاب میان این دو مدل به توپولوژی شبکه، محدودیت‌های فایروال و الزامات امنیتی بستگی دارد.</p>



<h2 id="h-قابلیت-ها-و-کاربردهای-اصلی-karmada" class="wp-block-heading">قابلیت‌ها و کاربردهای اصلی Karmada</h2>



<p class="wp-block-paragraph">قابلیت اصلی کارمادا، جداسازی تعریف بار کاری از قواعد انتخاب کلاستر، توزیع Replicaها و اعمال تنظیمات وابسته به محیط است. در ادامه مهم‌ترین قابلیت‌ها و سناریوهای کاربرد آن را بررسی می‌کنیم.</p>



<h3 id="h-استقرار-بارهای-کاری-بر-اساس-سیاست-انتشار-policy" class="wp-block-heading">استقرار بارهای کاری بر اساس سیاست انتشار (Policy)</h3>



<p class="wp-block-paragraph">سیاست انتشار (PropagationPolicy) مشخص می‌کند چه منابعی انتخاب شوند، در کدام کلاسترها انتشار یابند و Replicaهای آن‌ها چگونه میان کلاسترهای مقصد توزیع شوند. به این ترتیب، مانیفست اصلی بار کاری، از قواعد محل اجرا جدا باقی می‌ماند.</p>



<p class="wp-block-paragraph">اگر مقصد اجرای بار کاری تغییر کند یا کلاسترهای دیگری به مجموعه مقصد اضافه شوند، می‌توان سیاست را تغییر داد؛ بدون آنکه لزوما مانیفست اصلی بار کاری ویرایش شود.</p>



<h3 id="h-توزیع-replicaها-میان-کلاسترها" class="wp-block-heading">توزیع Replicaها میان کلاسترها</h3>



<p class="wp-block-paragraph">در حالت Duplicated، تعداد Replica تعریف‌شده در هر کلاستر مقصد ایجاد می‌شود. برای مثال، اگر یک Deployment با ۵ عدد Replica در ۳ کلاستر توزیع شود، هر کلاستر، ۵ عدد Replica و در مجموع ۱۵ عدد Replica دریافت می‌کند.</p>



<p class="wp-block-paragraph">در حالت Divided، تعداد کل Replicaها میان کلاسترهای مقصد تقسیم می‌شود. برای مثال، اگر تعداد کل ۱۵ عدد Replica باشد و ۳ کلاستر با شرایط یکسان انتخاب شوند، ممکن است در هر کلاستر ۵ عدد Replica اجرا شود. این توزیع می‌تواند با توجه به سیاست و وضعیت منابع کلاسترها متفاوت باشد.</p>



<h3 id="h-اعمال-تنظیمات-متفاوت-برای-هر-کلاستر" class="wp-block-heading">اعمال تنظیمات متفاوت برای هر کلاستر</h3>



<p class="wp-block-paragraph">یک مانیفست یکسان همیشه برای تمام کلاسترها مناسب نیست. ممکن است StorageClass ،Container Registry ،IngressClass ،Annotationهای وابسته به Cloud Provider یا تنظیمات مرتبط با Region در کلاسترهای مختلف تفاوت داشته باشند.</p>



<p class="wp-block-paragraph">سیاست بازنویسی (OverridePolicy) امکان می‌دهد پیش از انتشار منبع در کلاستر مقصد، بخش‌های مشخصی از آن برای همان محیط تغییر کنند. در نتیجه، مانیفست پایه در کنترل‌پلین ثابت می‌ماند و نسخه منتشرشده در کلاستر مقصد تنظیمات متناسب با آن محیط را دریافت می‌کند.</p>



<h3 id="h-failover" class="wp-block-heading">Failover</h3>



<p class="wp-block-paragraph">کارمادا می‌تواند وضعیت کلاسترهای عضو را در تصمیم‌های Placement و Failover لحاظ کند و بر اساس سیاست‌های پیکربندی‌شده، بارهای کاری را در کلاسترهای سالم اجرا کند. اگر یک کلاستر ناموفق تشخیص داده شود، کارمادا می‌تواند بر اساس سیاست‌های پیکربندی‌شده، بارهای کاری آن را برای اجرا در کلاستر سالم دیگری در نظر بگیرد.</p>



<p class="wp-block-paragraph">انتقال بار کاری به کلاستر دیگر، به‌تنهایی بازیابی کامل برنامه‌های Stateful را تضمین نمی‌کند. اگر هنگام اختلال شبکه، برنامه هم‌زمان در کلاستر مبدأ و مقصد فعال بماند، ممکن است هر دو نسخه به‌طور مستقل، داده‌ها را تغییر دهند و باعث ناسازگاری یا خرابی داده شوند؛ وضعیتی که به آن Split-Brain می‌گویند. علاوه بر جلوگیری از این وضعیت، کلاستر مقصد نیز باید ظرفیت کافی برای اجرای بار کاری منتقل‌شده داشته باشد.</p>



<h3 id="h-سناریوهای-کاربردی" class="wp-block-heading">سناریوهای کاربردی</h3>



<p class="wp-block-paragraph">سناریوهای کاربرد کارمادا شامل Multi-Cloud ،Hybrid Cloud ،Cloud Bursting، بازیابی بار کاری پس از خرابی یک کلاستر، استقرار جغرافیایی و کاهش دامنه خرابی از طریق توزیع بارهای کاری میان چند کلاستر است.</p>



<p class="wp-block-paragraph">این سناریوها هزینه و پیچیدگی عملیاتی خاص خود را دارند و البته ارتباط شبکه میان کلاسترها، مانیتورینگ چندلایه، کنترل دسترسی و مدیریت Failover باید جداگانه طراحی و نگهداری شوند. در نتیجه، استفاده از کارمادا زمانی توجیه دارد که مسئله واقعی Placement یا Failover در چند کلاستر مطرح باشد.</p>



<h2 id="h-تفاوت-gitops-با-کارمادا-چیست" class="wp-block-heading">تفاوت GitOps با کارمادا چیست؟</h2>



<p class="wp-block-paragraph">ابزارهای <a href="https://hamravesh.com/blog/what-is-gitops" data-type="link" data-id="https://hamravesh.com/blog/what-is-gitops" target="_blank" rel="noreferrer noopener">GitOps</a> مانند <a href="https://hamravesh.com/blog/what-is-argocd" data-type="link" data-id="https://hamravesh.com/blog/what-is-argocd" target="_blank" rel="noreferrer noopener">Argo CD</a> و Flux بر تحویل تعریفی و همگام‌سازی وضعیت مقصد با منابع ثبت‌شده در Git تمرکز دارند. این ابزارها می‌توانند چند کلاستر را نیز مدیریت کنند، اما مقصدها و وضعیت مطلوب معمولاً در پیکربندی GitOps تعریف می‌شوند.</p>



<p class="wp-block-paragraph">کارمادا بر محل اجرا، زمان‌بندی و انتشار بار کاری میان کلاسترهای عضو تمرکز دارد. این سیستم با استفاده از سیاست‌ها و اطلاعات کلاسترها تعیین می‌کند بار کاری در کدام مقصدها اجرا شود و Replicaهای آن چگونه میان کلاسترها توزیع شوند.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="449" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-karmada-2-1024x449.webp" alt="تفاوت GitOps با کارمادا چیست؟" class="wp-image-5551" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-karmada-2-1024x449.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-karmada-2-300x132.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-karmada-2-768x337.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-karmada-2-120x53.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-karmada-2.webp 1201w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">بنابراین، تفاوت اصلی این نیست که GitOps از چند کلاستر پشتیبانی نمی‌کند، بلکه تفاوت اصلی در این است که کارمادا یک موتور زمان‌بندی و محل‌یابی چندکلاستری در اختیار می‌گذارد، در حالی‌که GitOps اساسا وضعیت تعریف‌شده در Git را با مقصدهای تعیین‌شده همگام می‌کند.</p>



<p class="wp-block-paragraph">کارمادا و GitOps می‌توانند در کنار یکدیگر استفاده شوند. برای مثال، ابزار GitOps می‌تواند بارهای کاری، سیاست‌های انتشار (PropagationPolicy) و سیاست‌های بازنویسی (OverridePolicy) را با کنترل‌پلین کارمادا همگام کند و کارمادا هم محل اجرا و انتشار آن‌ها در کلاسترهای عضو را بر عهده بگیرد.</p>



<h2 id="h-مزایا-و-محدودیت-های-کارمادا" class="wp-block-heading">مزایا و محدودیت‌های کارمادا</h2>



<p class="wp-block-paragraph">کارمادا قابلیت‌های مشخصی را برای هماهنگ‌سازی چندکلاستری ارائه می‌کند، اما در عین حال یک کنترل‌پلین و لایه عملیاتی جدید به زیرساخت اضافه می‌کند. به‌این‌ترتیب، ارزیابی آن باید هم‌زمان بر اساس مزایای زمان‌بندی و هزینه نگهداری این لایه انجام شود.</p>



<h3 id="h-مزایای-کارمادا" class="wp-block-heading">مزایای کارمادا</h3>



<p class="wp-block-paragraph">اگر بدانید مهم‌ترین مزایای کارمادا چیست، می‌توانید تشخیص دهید که آیا این ابزار برای مدیریت چند کلاستر کوبرنتیز در سازمان شما مناسب است یا خیر. مهم‌ترین مزایای آن عبارت‌اند از:</p>



<ul class="wp-block-list">
<li><strong>سازگاری با APIهای Kubernetes: </strong>کارمادا با APIها و منابع آشنای کوبرنتیز کار می‌کند و می‌تواند با ابزارهای موجود این اکوسیستم یکپارچه شود.</li>



<li><strong>مدیریت متمرکز چند کلاستر:</strong> بارهای کاری، سیاست‌ها و تصمیم‌های محل اجرا از طریق کنترل‌پلین کارمادا مدیریت می‌شوند.</li>



<li><strong>جداسازی تعریف بار کاری از قواعد استقرار:</strong> می‌توان یک بار کاری را مستقل از محل اجرای آن تعریف کرد و بعدا با سیاست‌های جداگانه مشخص کرد که در چه کلاسترهایی اجرا شود.</li>



<li><strong>توزیع و زمان‌بندی Replicaها: </strong>کارمادا از توزیع Duplicated و Divided پشتیبانی می‌کند و می‌تواند Replicaهای یک بار کاری را بر اساس سیاست میان کلاسترهای مقصد توزیع کند.</li>



<li><strong>پشتیبانی از معماری‌های Multi-Cloud و Hybrid Cloud: </strong>کارمادا برای اجرای بارهای کاری در چند ابر یا ترکیب ابر عمومی و دیتاسنتر خصوصی طراحی شده است.</li>



<li><strong>سازگاری با ابزارهای موجود کوبرنتیز: </strong>کارمادا را می‌توان در کنار ابزارهای دیگر اکوسیستم کوبرنتیز به کار گرفت.</li>



<li><strong>کاهش وابستگی در لایه هماهنگ‌سازی:</strong> کارمادا می‌تواند توزیع بارهای کاری میان چند محیط ابری را از سازوکار اختصاصی یک ارائه‌دهنده ابر مستقل‌تر کند. بااین‌حال، وابستگی اپلیکیشن به سرویس‌های اختصاصی هر ارائه‌دهنده را به‌طور خودکار از بین نمی‌برد.</li>
</ul>



<h3 id="h-محدودیت-های-کارمادا" class="wp-block-heading">محدودیت‌های کارمادا</h3>



<p class="wp-block-paragraph">شناخت مزایا به‌تنهایی کافی نیست و در کنار آن باید بدانید محدودیت‌های کارمادا چیست. از جمله این محدودیت‌ها، می‌توان موارد زیر را نام برد:</p>



<ul class="wp-block-list">
<li><strong>اضافه‌شدن یک کنترل‌پلین جدید: </strong>API Server، ذخیره‌ساز داده، کنترل‌گرها و اجزای زمان‌بندی این لایه باید ایمن‌سازی، پایش، پشتیبان‌گیری و نگهداری شوند.</li>



<li><strong>افزایش پیچیدگی مانیتورینگ و عیب‌یابی:</strong> ممکن است که بررسی علت یک مشکل نیازمند بررسی هم‌زمان کلاستر عضو و کنترل‌پلین کارمادا باشد.</li>



<li><strong>نیاز به طراحی دقیق ارتباط شبکه:</strong> اتصال کنترل‌پلین به کلاسترهای عضو، مخصوصا وقتی کلاسترها در شبکه‌ها یا محیط‌های مختلف باشند، نیازمند طراحی جداگانه است.</li>



<li><strong>پیچیده‌ترشدن <a href="https://hamravesh.com/blog/what-is-kubernetes-rbac/" data-type="link" data-id="https://hamravesh.com/blog/what-is-kubernetes-rbac/" target="_blank" rel="noreferrer noopener">RBAC</a> و مدیریت دسترسی:</strong> با اضافه‌شدن یک لایه مدیریتی جدید، مدیریت مجوزهای دسترسی هم پیچیده‌تر می‌شود.</li>



<li><strong>افزایش فشار عملیاتی در خرابی گسترده: </strong>خرابی یک کلاستر بزرگ می‌تواند باعث زمان‌بندی مجدد هم‌زمان تعداد زیادی بار کاری و افزایش فشار بر کنترل‌پلین کارمادا و سرور API کلاسترهای سالم شود.</li>



<li><strong>عدم حل خودکار مسائل ذخیره‌سازی و Replication داده: </strong>کارمادا مشکلات مربوط به فضای ذخیره‌سازی یا همگام‌سازی داده‌ها را به‌صورت خودکار حل نمی‌کند.</li>



<li><strong>نیاز به تیم مسلط به کوبرنتیز و سیستم‌های توزیع‌شده:</strong> استفاده مؤثر از کارمادا نیازمند دانش کافی در هر دو حوزه است.</li>
</ul>



<h2 id="h-راه-اندازی-و-شروع-کار-با-کارمادا" class="wp-block-heading">راه‌اندازی و شروع کار با کارمادا</h2>



<p class="wp-block-paragraph">راه‌اندازی کارمادا شامل استقرار کنترل‌پلین، آماده‌سازی Kubeconfig، ثبت کلاسترهای عضو و بررسی انتشار بار کاری است. دستورها و جزئیات این فرایند ممکن است در نسخه‌های مختلف تغییر کنند؛ بنابراین برای اجرای عملی باید از مستند رسمی همان نسخه استفاده شود. در ادامه هر یک از این بخش‌ها را مرور می‌کنیم.</p>



<h3 id="h-مراحل-کلی-راه-اندازی-کارمادا" class="wp-block-heading">مراحل کلی راه‌اندازی کارمادا</h3>



<p class="wp-block-paragraph">برای راه‌اندازی کارمادا، ابتدا باید با مراحل کلی این فرایند آشنا شوید:</p>



<ul class="wp-block-list">
<li>آماده‌سازی یک کلاستر Kubernetes برای میزبانی کنترل‌پلین کارمادا</li>



<li>نصب اجزای کنترل‌پلین، از جمله API Server ،Controller Manager ،Scheduler و etcd</li>



<li>آماده‌سازی Kubeconfig مربوط به کارمادا</li>



<li>اتصال کلاسترهای عضو به روش Push یا Pull</li>



<li>بررسی سلامت و دسترس‌پذیری کلاسترهای عضو</li>



<li>تعریف بار کاری در کنترل‌پلین کارمادا</li>



<li>تعریف سیاست انتشار (PropagationPolicy) برای مشخص‌کردن کلاسترهای مقصد</li>



<li>بررسی انتشار بار کاری در کلاسترهای عضو</li>
</ul>



<h3 id="h-روش-های-نصب-کارمادا" class="wp-block-heading">روش‌های نصب کارمادا</h3>



<p class="wp-block-paragraph">کارمادا از چند مسیر نصب از جمله ابزار خط فرمان کارمادا، Helm ،Karmada Operator، نصب از باینری، نصب از سورس و محیط توسعه پشتیبانی می‌کند. هیچ‌یک از این مسیرها را نمی‌توان بدون در نظر گرفتن معماری سازمان، به‌طور مطلق بهترین گزینه برای محیط تولید دانست. انتخاب روش عملیاتی به طراحی دسترس‌پذیری بالا، امنیت، پشتیبان‌گیری، به‌روزرسانی و مدل نگهداری زیرساخت بستگی دارد.</p>



<h3 id="h-توصیه-برای-ارزیابی-اولیه" class="wp-block-heading">توصیه برای ارزیابی اولیه</h3>



<p class="wp-block-paragraph">اگر هدفتان فقط آشنایی با کارمادا یا اجرای یک نمونه آزمایشی (Proof of Concept) است، می‌توانید از محیط توسعه رسمی استفاده کنید. کد منبع و اسکریپت راه‌اندازی محیط توسعه کارمادا در <a href="https://github.com/karmada-io/karmada" target="_blank" rel="noreferrer noopener">مخزن رسمی Karmada در GitHub</a> در دسترس است. این محیط، Control Plane و کلاسترهای عضو آزمایشی را به‌صورت خودکار آماده می‌کند و فرایند یادگیری را ساده‌تر می‌سازد. البته این محیط برای توسعه و آزمایش طراحی شده است و الگوی مناسبی برای استقرار در محیط عملیاتی نیست.</p>



<h2 id="h-چه-زمانی-کارمادا-انتخاب-مناسبی-است" class="wp-block-heading">چه زمانی کارمادا انتخاب مناسبی است؟</h2>



<p class="wp-block-paragraph">کارمادا برای هر زیرساخت کوبرنتیز ضروری نیست. مزیت اصلی آن زمانی آشکار می‌شود که محل اجرا، توزیع Replicaها یا انتقال خودکار در زمان خرابی باید میان چند کلاستر هماهنگ شود. اگر مقصد بارهای کاری ثابت باشد و ابزارهای موجود نیاز عملیاتی را پوشش دهند، افزودن کارمادا ممکن است فقط پیچیدگی بیشتری ایجاد کند.</p>



<h3 id="h-چه-زمانی-استفاده-از-کارمادا-منطقی-است" class="wp-block-heading">چه زمانی استفاده از کارمادا منطقی است؟</h3>



<p class="wp-block-paragraph">اگر شرایط زیر را دارید، کارمادا می‌تواند انتخاب مناسبی برای مدیریت زیرساخت شما باشد:</p>



<ul class="wp-block-list">
<li>چند کلاستر کوبرنتیز عملیاتی دارید و باید آن‌ها را به‌صورت متمرکز مدیریت کنید.</li>



<li>مقصد اجرای بارهای کاری همیشه ثابت نیست و باید با توجه به شرایط، میان کلاسترهای مختلف انتخاب شود.</li>



<li>در چند ابر، منطقه جغرافیایی یا دیتاسنتر فعالیت می‌کنید.</li>



<li>به توزیع Replicaهای یک بار کاری میان چند کلاستر نیاز دارید.</li>



<li>Failover در سطح کلاستر و اجرای مجدد بارهای کاری در کلاستر سالم، یکی از نیازهای واقعی شماست.</li>



<li>تیم Platform Engineering یا SRE توانایی نگهداری و پایش یک Control Plane جدید را دارد.</li>
</ul>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه" class="wp-block-heading">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده، بر بستر ابر اختصاصی یا به صورت On-Premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a type="link" href="https://hamravesh.com/managed-kubernetes" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز مدیریت‌شده هم‌روش</a></p>
</div></div>
</div>



<h3 id="h-چه-زمانی-کارمادا-انتخاب-مناسبی-نیست" class="wp-block-heading">چه زمانی کارمادا انتخاب مناسبی نیست؟</h3>



<p class="wp-block-paragraph">در برخی سناریوها، استفاده از کارمادا نه‌تنها مزیت قابل‌توجهی ایجاد نمی‌کند، بلکه می‌تواند هزینه و پیچیدگی بیشتری به زیرساخت اضافه کند. برای مثال، اگر شرایط زیر را دارید، احتمالا به کارمادا نیازی ندارید:</p>



<ul class="wp-block-list">
<li>فقط یک کلاستر یا چند کلاستر ساده دارید.</li>



<li>مقصد استقرار بارهای کاری همیشه مشخص و ثابت است.</li>



<li>ابزار GitOps فعلی تمام نیازهای شما را پوشش می‌دهد.</li>



<li>چالش اصلی شما مدیریت فضای ذخیره‌سازی یا انتقال و همگام‌سازی داده‌هاست.</li>



<li>تیم شما ظرفیت نگهداری، مانیتورینگ و عیب‌یابی یک Control Plane دیگر را ندارد.</li>



<li>هنوز مسئله واقعی Multi-Cluster ندارید و صرفا به‌دلیل جذابیت فناوری به استفاده از آن فکر می‌کنید.</li>
</ul>



<h2 id="h-جمع-بندی" class="wp-block-heading">جمع‌بندی</h2>



<p class="wp-block-paragraph">کارمادا یک لایه مدیریت و هماهنگ‌سازی برای انتشار بارهای کاری میان چند کلاستر کوبرنتیز است. قابلیت محوری آن، جداسازی تعریف بار کاری از قواعد محل اجرا و زمان‌بندی است؛ به‌طوری‌که سیاست‌ها مشخص می‌کنند منابع در کدام کلاسترها اجرا شوند و Replicaها چگونه میان آن‌ها توزیع شوند.</p>



<p class="wp-block-paragraph">این قابلیت‌ها می‌توانند در سناریوهای Multi-Cloud ،Hybrid Cloud، استقرار جغرافیایی متنوع و انتقال خودکار در زمان خرابی در سطح بار کاری مفید باشند. بااین‌حال، کارمادا یک کنترل‌پلین جدید به زیرساخت اضافه می‌کند و مسائل شبکه، ذخیره‌سازی و Replication داده را به‌تنهایی حل نمی‌کند.</p>



<p class="wp-block-paragraph">کارمادا برای سازمان‌هایی ارزشمند است که با مسائل محل اجرا، ظرفیت و انتقال خودکار در زمان خرابی در چند کلاستر کوبرنتیز روبه‌رو هستند و همچنین توان نگهداری لایهٔ مدیریتی جدید را دارند. در زیرساخت‌های ساده‌تر، اضافه‌کردن آن احتمالاً مزیتی متناسب با پیچیدگی ایجادشده نخواهد داشت.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-karmada/">کارمادا چیست؟ آشنایی با ابزار مدیریت چند کلاستر کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-karmada/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آموزش K9s؛ راهنمای نصب و استفاده از ابزار مدیریت کوبرنتیز در ترمینال</title>
		<link>https://hamravesh.com/blog/k9s-kubernetes-guide/</link>
					<comments>https://hamravesh.com/blog/k9s-kubernetes-guide/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 22 Jul 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5428</guid>

					<description><![CDATA[<p>ابزار K9s کوبرنتیز دقیقا برای رفع همین چالش توسعه داده شده است. این ابزار با ارائه یک رابط کاربری مبتنی بر ترمینال، فرایند مشاهده (Observe)، پیمایش (Navigate) و مدیریت (Manage) منابع و اپلیکیشن‌های Kubernetes را ساده‌تر می‌کند تا بسیاری از عملیات روزمره، بدون نیاز به اجرای مکرر دستورهای مختلف، از طریق یک محیط یکپارچه انجام شوند.</p>
<p>The post <a href="https://hamravesh.com/blog/k9s-kubernetes-guide/">آموزش K9s؛ راهنمای نصب و استفاده از ابزار مدیریت کوبرنتیز در ترمینال</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">اگر به‌صورت روزانه با کوبرنتیز کار کرده باشید، احتمالا بارها خودتان را در حال اجرای مجموعه‌ای از دستورهای تکراری kubectl دیده‌اید. معمولا برای بررسی وضعیت یک سرویس باید ابتدا فهرست پادها را دریافت کنید، نام پاد موردنظر را پیدا یا کپی کنید، لاگ آن را مشاهده کنید، در صورت نیاز خروجی describe را بررسی کنید و گاهی هم فایل YAML منبع را ویرایش کنید. تکرار مداوم این مراحل (به‌خصوص در محیط‌های عملیاتی)، به‌مرور روند بررسی و عیب‌یابی را کند و آزاردهنده می‌کند. این مسئله زمانی پررنگ‌تر است که با یک حادثه یا فرایند عیب‌یابی روبه‌رو باشید. در چنین شرایطی، جابه‌جایی مداوم بین دستورهای مختلف برای یافتن علت مشکل می‌تواند روند عیب‌یابی را کندتر کرده و زمان رسیدن به پاسخ را افزایش دهد. K9s کوبرنتیز دقیقا برای رفع همین چالش توسعه داده شده است. </p>



<p class="wp-block-paragraph">K9s ابزاری ترمینال‌محور برای کوبرنتیز است که مشاهده، پیمایش و مدیریت اپلیکیشن‌های مستقر روی کلاستر را ساده‌تر می‌کند. این ابزار با ارائه یک رابط کاربری مبتنی بر ترمینال، فرایند مشاهده (Observe)، پیمایش (Navigate) و مدیریت (Manage) منابع و اپلیکیشن‌های کوبرنتیز را ساده‌تر می‌کند تا بسیاری از عملیات روزمره، بدون نیاز به اجرای مکرر دستورهای مختلف، از طریق یک محیط یکپارچه انجام شوند. در این آموزش K9s، ابتدا به این سوال پاسخ می‌دهیم که K9s چیست و سپس به نحوه نصب، رابط کاربری، کارهای عملی با K9s و برخی قابلیت‌های پیشرفته آن را می‌پردازیم.</p>



<h2 class="wp-block-heading" id="h-k9s-چیست">K9s چیست؟</h2>



<p class="wp-block-paragraph">K9s یک رابط کاربری متنی (Terminal-based UI) برای تعامل با کلاسترهای کوبرنتیز است که به‌طور کامل داخل ترمینال اجرا می‌شود. این ابزار مدیریت کوبرنتیز، با هدف ساده‌تر کردن مشاهده، پیمایش و مدیریت اپلیکیشن‌ها و منابع مستقر روی کلاستر توسعه یافته است. کد منبع و روند توسعه این ابزار در <a href="https://github.com/derailed/k9s" target="_blank" rel="noreferrer noopener">مخزن رسمی K9s در GitHub</a> در دسترس است.</p>



<p class="wp-block-paragraph">برخلاف کار با kubectl که معمولا نیازمند اجرای چندین دستور متوالی است، K9s بسیاری از عملیات روزمره را در یک محیط تعاملی در اختیار کاربر قرار می‌دهد. پس از اجرای برنامه، می‌توانید پادها، دیپلویمنت‌ها، سرویس‌ها و سایر منابع کوبرنتیز را به‌صورت زنده مشاهده کنید و تنها با استفاده از میانبرهای صفحه‌کلید، اقداماتی مانند مشاهده لاگ‌ها، اجرای describe، ویرایش YAML یا مدیریت منابع را انجام دهید.</p>



<p class="wp-block-paragraph">یکی دیگر از ویژگی‌های مهم K9s این است که تغییرات کلاستر را به‌صورت مداوم پایش می‌کند و متناسب با منابعی که مشاهده می‌کنید، دستورها و عملیات مرتبط را در اختیار شما قرار می‌دهد. در نتیجه، مدیریت کوبرنتیز با K9s به شما امکان می‌دهد هنگام مانیتورینگ یا عیب‌یابی، وضعیت منابع را تقریبا به‌صورت لحظه‌ای دنبال کنید و بدون جابه‌جایی بین چندین دستور مختلف، عملیات موردنیاز را انجام دهید.</p>



<h2 class="wp-block-heading" id="h-k9s-چگونه-با-kubeconfig-kubernetes-api-و-rbac-کار-می-کند">K9s چگونه با kubeconfig ،Kubernetes API و RBAC کار می‌کند؟</h2>



<p class="wp-block-paragraph">یکی از مزیت‌های K9s این است که برای اتصال به کلاستر کوبرنتیز از همان Kubernetes API استفاده می‌کند که ابزار kubectl هم بر پایه آن کار می‌کند. به همین دلیل، اگر kubeconfig معتبر باشد و context انتخاب‌شده امکان اتصال به کلاستر را داشته باشد، K9s می‌تواند از همان پیکربندی برای اتصال استفاده کند.</p>



<p class="wp-block-paragraph">نکته مهم این است که K9s مجوز یا سیاست دسترسی مستقلی ایجاد نمی‌کند. این ابزار با استفاده از اطلاعات اتصال و احراز هویت موجود در kubeconfig به Kubernetes API متصل می‌شود و سطح دسترسی آن را مجوزهای تعریف‌شده در <a href="https://hamravesh.com/blog/what-is-kubernetes-rbac/" data-type="link" data-id="https://hamravesh.com/blog/what-is-kubernetes-rbac/" target="_blank" rel="noreferrer noopener">RBAC</a> (مخفف Role-Based Access Control) کلاستر تعیین می‌کنند. بنابراین، کاربر یا ServiceAccount مرتبط با context فعال فقط می‌تواند عملیاتی را در K9s انجام دهد که طبق سیاست‌های RBAC اجازه انجام آن‌ها را دارد. برای مثال، اگر مجوز کاربر به مشاهده منابع محدود باشد، امکان ویرایش یا حذف آن‌ها را از طریق K9s نیز نخواهد داشت. به بیان دیگر، K9s محدودیت‌های دسترسی کوبرنتیز را دور نمی‌زند و در همان محدوده مجاز تعریف‌شده برای هویت فعلی کار می‌کند.</p>



<p class="wp-block-paragraph">همچنین هنگام اجرای K9s، می‌توانید یک context مشخص از فایل kubeconfig را انتخاب کنید یا برنامه را به‌طور مستقیم در یک <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/" data-type="link" data-id="https://hamravesh.com/blog/what-is-kubernetes-namespace/">namespace</a> خاص اجرا کنید.</p>



<h2 class="wp-block-heading" id="h-تفاوت-k9s-و-kubectl-چیست">تفاوت K9s و kubectl چیست؟</h2>



<p class="wp-block-paragraph">K9s و kubectl نقش یکسانی ندارند و K9s را نباید جایگزین کامل kubectl دانست. kubectl ابزار خط فرمان استاندارد کوبرنتیز است، اما K9s یک رابط کاربری متنی (Terminal-based UI) برای انجام سریع‌تر عملیات روزمره و تعاملی به شمار می‌آید.&nbsp;</p>



<p class="wp-block-paragraph">بسیاری از کارهایی که در kubectl نیازمند اجرای چندین دستور هستند، در K9s تنها با میانبرهای صفحه‌کلید انجام می‌شوند؛ به همین دلیل برای فعالیت‌هایی مانند بررسی پادها، مشاهده لاگ‌ها، اجرای describe و عیب‌یابی، سریع‌تر و ساده‌تر است.&nbsp;</p>



<p class="wp-block-paragraph">ازآنجایی‌که K9s کاملاً در ترمینال اجرا می‌شود، می‌توان آن را روی Bastion Host یا سرور واسطی اجرا کرد که کاربران از طریق SSH به آن متصل می‌شوند و از آنجا به کلاستر کوبرنتیز دسترسی دارند. در مقابل، اگر هدف خودکارسازی عملیات، استفاده در اسکریپت‌ها یا ادغام با فرایندهای CI/CD باشد، همچنان kubectl انتخاب اصلی است. جدول زیر مهم‌ترین تفاوت‌های این دو ابزار را نشان می‌دهد:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>معیار</strong></td><td class="has-text-align-center" data-align="center"><strong>kubectl</strong></td><td class="has-text-align-center" data-align="center"><strong>K9s</strong></td></tr><tr><td class="has-text-align-center" data-align="center">نوع ابزار</td><td class="has-text-align-center" data-align="center">ابزار خط فرمان (CLI)</td><td class="has-text-align-center" data-align="center">رابط کاربری متنی (Terminal-based UI)</td></tr><tr><td class="has-text-align-center" data-align="center">کاربرد اصلی</td><td class="has-text-align-center" data-align="center">اجرای دستورها و Automation</td><td class="has-text-align-center" data-align="center">مدیریت و مشاهده تعاملی کلاستر</td></tr><tr><td class="has-text-align-center" data-align="center">مناسب برای</td><td class="has-text-align-center" data-align="center">اسکریپت‌نویسی، CI/CD و Cron Job</td><td class="has-text-align-center" data-align="center">مانیتورینگ، عیب‌یابی و مدیریت روزمره</td></tr><tr><td class="has-text-align-center" data-align="center">نحوه کار</td><td class="has-text-align-center" data-align="center">اجرای دستورهای متنی</td><td class="has-text-align-center" data-align="center">استفاده از میانبرهای صفحه‌کلید</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-پیش-نیازهای-استفاده-از-k9s">پیش‌نیازهای استفاده از K9s</h2>



<p class="wp-block-paragraph">پیش از نصب K9s، بهتر است مطمئن شوید محیط کاری شما برای اتصال به کلاستر کوبرنتیز آماده است. این ابزار روی سیستم‌عامل‌های لینوکس، macOS و ویندوز اجرا می‌شود. پیش‌نیازهای نصب و استفاده از این ابزار عبارت‌اند از:</p>



<ul class="wp-block-list">
<li><strong>دسترسی به یک کلاستر کوبرنتیز فعال:</strong> پیش از هر چیز باید به یک کلاستر کوبرنتیز در حال اجرا دسترسی داشته باشید، زیرا K9s ابزاری برای تعامل با یک کلاستر موجود است، نه راه‌اندازی کلاستر جدید.</li>



<li><strong>پیکربندی دسترسی به کلاستر:</strong> باید kubeconfig معتبر و امکان اتصال به کلاستر را داشته باشید. در محیط کاری معمول، بهتر است پیش از اجرای K9s از امکان اتصال به کلاستر اطمینان پیدا کنید.</li>



<li><strong>فایل kubeconfig معتبر:</strong> فایل kubeconfig باید به‌درستی تنظیم و به کلاستر موردنظر متصل شده باشد تا K9s بدون نیاز به تنظیمات اضافی بتواند به آن متصل شود.</li>



<li><strong>دسترسی‌های لازم مطابق RBAC:</strong> چون سطح دسترسی K9s تابع همان قوانین RBAC تعریف‌شده برای کاربر است، باید مطمئن شوید مجوزهای لازم برای مشاهده یا مدیریت منابع موردنظرتان از قبل برایتان تعریف شده باشد.</li>



<li><strong>ترمینال با پشتیبانی از ۲۵۶ رنگ:</strong> K9s برای نمایش صحیح رابط کاربری به حالت ۲۵۶ رنگ ترمینال نیاز دارد. اکثر ترمینال‌های مدرن به‌صورت پیش‌فرض از این قابلیت پشتیبانی می‌کنند، اما در سیستم‌های مبتنی بر یونیکس مانند لینوکس و macOS، در صورت نیاز می‌توانید متغیر محیطی TERM را به‌صورت زیر تنظیم کنید:</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly> export TERM=xterm-256color</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50"> export</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">TERM=xterm-256color</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>تنظیم EDITOR یا KUBE_EDITOR:</strong> برای ویرایش مستقیم منابع کوبرنتیز از داخل K9s، لازم است یکی از متغیرهای محیطی <code>EDITOR</code> یا <code>KUBE_EDITOR</code> روی ویرایشگر دلخواه شما تنظیم شده باشد، مثلاً:</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export KUBE_EDITOR=vim</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">export</span><span style="color: #ADBAC7"> KUBE_EDITOR</span><span style="color: #F47067">=</span><span style="color: #96D0FF">vim</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-روش-های-نصب-k9s-روی-لینوکس-macos-و-ویندوز">روش‌های نصب K9s روی لینوکس، macOS و ویندوز</h2>



<p class="wp-block-paragraph">K9s روی سیستم‌عامل‌های لینوکس، macOS و ویندوز در دسترس است. می‌توانید علاوه بر استفاده از Package Manager، فایل‌های Binary رسمی را هم از صفحه انتشار (Release) پروژه دریافت و نصب کنید. همچنین در صورت نیاز، امکان کامپایل برنامه از سورس هم وجود دارد.</p>



<h3 class="wp-block-heading" id="h-نصب-k9s-روی-macos">نصب K9s روی macOS</h3>



<p class="wp-block-paragraph">در مستندات رسمی، دو روش برای نصب K9s روی مک معرفی شده است:</p>



<p class="wp-block-paragraph">برای نصب با Homebrew:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew install derailed/k9s/k9s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">brew</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">derailed/k9s/k9s</span></span></code></pre></div>



<p class="wp-block-paragraph">برای نصب با MacPorts:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo port install k9s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">port</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">k9s</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-نصب-k9s-روی-لینوکس">نصب K9s روی لینوکس</h3>



<p class="wp-block-paragraph">برای نصب K9s روی لینوکس، مستندات رسمی K9s روش‌های زیر را پیشنهاد می‌کنند:</p>



<p class="wp-block-paragraph">برای نصب با LinuxBrew:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew install derailed/k9s/k9s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">brew</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">derailed/k9s/k9s</span></span></code></pre></div>



<p class="wp-block-paragraph">برای نصب با Pacman:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pacman -S k9s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">pacman</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-S</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">k9s</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-نصب-k9s-روی-ویندوز">نصب K9s روی ویندوز</h3>



<p class="wp-block-paragraph">برای نصب K9s روی ویندوز مستندات رسمی K9s روش‌های زیر را پیشنهاد می‌کنند:</p>



<p class="wp-block-paragraph">برای نصب با Scoop:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>scoop install k9s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">scoop</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">k9s</span></span></code></pre></div>



<p class="wp-block-paragraph">نصب با Chocolatey:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>choco install k9s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">choco</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">k9s</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-نصب-k9s-با-binary-رسمی-یا-ساخت-از-روی-سورس">نصب K9s با Binary رسمی یا ساخت از روی سورس</h3>



<p class="wp-block-paragraph">اگر نمی‌خواهید از Package Manager استفاده کنید، می‌توانید فایل اجرایی متناسب با سیستم‌عامل خود را از <a href="https://github.com/derailed/k9s/releases" data-type="link" data-id="https://github.com/derailed/k9s/releases" target="_blank" rel="noreferrer noopener">صفحه انتشارهای رسمی K9s در GitHub</a> دریافت کنید. فایل‌های رسمی K9s برای لینوکس، macOS و ویندوز در این صفحه در دسترس‌اند. همچنین، اگر قصد دارید K9s را از کد منبع بسازید، طبق مستندات نصب مورداستفاده در این مقاله باید Go نسخه ۱.۱۴ یا بالاتر روی سیستم نصب باشد. در این روش، ابتدا مخزن پروژه را Clone و سپس برنامه را با دستور زیر Build و اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>make build &amp;&amp; ./execs/k9s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">make</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">build</span><span style="color: #ADBAC7"> &amp;&amp; </span><span style="color: #F69D50">./execs/k9s</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-اجرای-اولیه-k9s-و-گزینه-های-مهم-cli">اجرای اولیه K9s و گزینه‌های مهم CLI</h2>



<p class="wp-block-paragraph">پس از اینکه فرایند نصب را انجام دادید، کافی است دستور k9s را اجرا کنید تا محیط تعاملی برنامه باز شود. در بخش بالای صفحه، اطلاعاتی مانند نام کلاستر، Context فعلی، نسخه کوبرنتیز و میزان مصرف CPU و Memory نمایش داده می‌شود. همچنین در بخش میانی، فهرست منابع کوبرنتیز قرار دارد و در پایین صفحه، مسیر پیمایش (Breadcrumb) و پیام‌های وضعیت دیده می‌شوند. هر زمان کلید : یا / را فشار دهید، نوار فرمان برای اجرای دستورها یا جستجو ظاهر می‌شود.&nbsp;</p>



<p class="wp-block-paragraph">نکته کاربردی دیگر این است که کنار نام هر Namespace، عددی نمایش داده می‌شود. در اینجا عدد ۰ نمایانگر همه Namespaceها است و اعداد دیگر به‌ترتیب به Namespaceهایی اختصاص پیدا می‌کنند که در همان نشست کاری بازدید کرده‌اید.</p>



<p class="wp-block-paragraph">مستندات رسمی K9s چند گزینه مهم برای اجرای برنامه معرفی کرده است که در ادامه با آن‌ها آشنا می‌شوید.</p>



<h3 class="wp-block-heading" id="h-مشاهده-راهنما-و-اطلاعات-برنامه">مشاهده راهنما و اطلاعات برنامه</h3>



<p class="wp-block-paragraph">برای مشاهده همه گزینه‌های خط فرمان می‌توانید از دستور زیر استفاده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s help</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">help</span></span></code></pre></div>



<p class="wp-block-paragraph">اگر بخواهید اطلاعات Runtime برنامه، مانند مسیر فایل‌های پیکربندی و لاگ‌ها را مشاهده کنید، دستور زیر کاربرد دارد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s info</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">info</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-اجرای-k9s-در-یک-namespace-مشخص">اجرای K9s در یک Namespace مشخص</h3>



<p class="wp-block-paragraph">اگر فقط قصد کار با یک Namespace خاص را دارید، می‌توانید K9s را به‌طور مستقیم در همان Namespace اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s -n &lt;namespace-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-n</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">namespace-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">اجرای K9s با گزینه <code>-n</code> باعث می‌شود برنامه کار را در namespace مشخص‌شده آغاز کند. این روش در کلاسترهای شلوغ، دسترسی به منابع namespace موردنظر را ساده‌تر می‌کند.</p>



<h3 class="wp-block-heading" id="h-اجرای-مستقیم-در-نمای-پاد">اجرای مستقیم در نمای پاد</h3>



<p class="wp-block-paragraph">برای اینکه K9s پس از اجرا به‌طور مستقیم نمای پادها را نمایش دهد، از دستور زیر استفاده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s -c pod</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-c</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-اجرای-k9s-با-context-دلخواه">اجرای K9s با Context دلخواه</h3>



<p class="wp-block-paragraph">اگر فایل kubeconfig شما شامل چند Context باشد، هنگام اجرای K9s، می‌توانید Context موردنظر را مشخص کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s --context &lt;context-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--context</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">context-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">این قابلیت زمانی مفید است که بین چند کلاستر کوبرنتیز جابه‌جا می‌شوید و نمی‌خواهید Context پیش‌فرض را تغییر دهید.</p>



<h3 class="wp-block-heading" id="h-اجرای-k9s-در-حالت-فقط-خواندنی">اجرای K9s در حالت فقط‌خواندنی</h3>



<p class="wp-block-paragraph">برای جلوگیری از هرگونه تغییر ناخواسته روی منابع، می‌توانید K9s را با گزینه <code>--readonly</code> اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s --readonly</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--readonly</span></span></code></pre></div>



<p class="wp-block-paragraph">در این حالت، تمام دستورهای ویرایش، حذف و سایر عملیات تغییردهنده غیرفعال می‌شوند.</p>



<h3 class="wp-block-heading" id="h-تغییر-context-و-namespace-در-زمان-اجرا">تغییر Context و Namespace در زمان اجرا</h3>



<p class="wp-block-paragraph">K9s علاوه بر گزینه‌های خط فرمان، امکان جابه‌جایی بین Contextها و Namespaceها را از داخل محیط برنامه هم فراهم می‌کند. برای مشاهده و تغییر Context فعال، دستور زیر را وارد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>:ctx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">:ctx</span></span></code></pre></div>



<p class="wp-block-paragraph">یا مستقیما به یک Context مشخص بروید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>:ctx &lt;context-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">:ctx</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">context-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">برای تغییر Namespace هم کافی است بنویسید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>:ns</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">:ns</span></span></code></pre></div>



<p class="wp-block-paragraph">همچنین می‌توانید با ساختار <code>:pod &lt;namespace-name&gt;</code>، پادهای یک Namespace مشخص را مشاهده کنید. برای نمایش پادها در یک Context دیگر نیز از ساختار <code>:pod @&lt;context-name&gt;</code> استفاده کنید. اجرای دستور دوم، Context فعال K9s را نیز به Context مشخص‌شده تغییر می‌دهد. توجه داشته باشید که این دستور دوم، Context فعلی شما را هم تغییر می‌دهد.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 class="wp-block-heading" id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده، بر بستر ابر اختصاصی یا به صورت On-Premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a href="https://hamravesh.com/managed-kubernetes" type="link" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز مدیریت‌شده</a></p>
</div></div>
</div>



<h2 class="wp-block-heading" id="h-آشنایی-با-رابط-کاربری-k9s">آشنایی با رابط کاربری K9s</h2>



<p class="wp-block-paragraph">همان‌طور که در بخش قبل دیدیم، صفحه اصلی K9s شامل بخش بالایی (نام کلاستر، Context، نسخه کوبرنتیز و مصرف CPU/Memory)، جدول منابع در وسط و نوار پیمایش در پایین صفحه است. تصویر زیر نمونه‌ای از این چیدمان را در نمای پادها نشان می‌دهد:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="539" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-k9s-kubernetes-guide-02-1024x539.webp" alt="آشنایی با رابط کاربری K9s" class="wp-image-5470" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-k9s-kubernetes-guide-02-1024x539.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-k9s-kubernetes-guide-02-300x158.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-k9s-kubernetes-guide-02-768x404.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-k9s-kubernetes-guide-02-1536x808.webp 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-k9s-kubernetes-guide-02-2048x1078.webp 2048w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-k9s-kubernetes-guide-02-120x63.webp 120w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">نکته مهم درباره این رابط این است که میانبرهای نمایش‌داده‌شده در بالای صفحه، بسته به نوع منبعی که مشاهده می‌کنید تغییر می‌کنند. برای مثال، کلید s روی پادها به‌معنای Shell است، اما همین کلید روی دیپلویمنت‌ها به‌معنای Scale خواهد بود. به همین دلیل نیازی نیست این میانبرها را از قبل حفظ کنید، چون K9s همیشه میانبرهای مرتبط با نمای فعلی را نمایش می‌دهد.</p>



<p class="wp-block-paragraph">دو میانبر کاربردی که بهتر است به خاطر بسپارید، <code>?</code> و <code>Ctrl+a</code> هستند. کلید ? در هر بخشی از K9s راهنما را باز می‌کند و <code>Ctrl+a</code> فهرست تمام alias‌های منابع شناخته‌شده توسط K9s را نشان می‌دهد. اگر نام کوتاه یا alias یک منبع را نمی‌دانید، می‌توانید با فشردن <code>Ctrl+a</code> فهرست aliasهای موجود را مشاهده کنید.</p>



<p class="wp-block-paragraph">برای جابه‌جایی در محیط K9s هم می‌توانید از کلیدهای جهت‌دار یا <code>j</code>/<code>k</code> (مشابه Vim) استفاده کنید. علاوه بر این‌ها، با فشردن Enter وارد یک منبع می‌شوید و با Esc به نمای قبلی بازمی‌گردید.</p>



<h2 class="wp-block-heading" id="h-مشاهده-و-جابه-جایی-بین-منابع-کوبرنتیز-در-k9s">مشاهده و جابه‌جایی بین منابع کوبرنتیز در K9s</h2>



<p class="wp-block-paragraph">یکی از مهم‌ترین قابلیت‌های K9s، دسترسی سریع به منابع مختلف کوبرنتیز از طریق میانبرهای متنی (Resource Alias) است. به‌جای اجرای مداوم دستورهای kubectl، کافی است کلید <code>:</code> را فشار دهید و نام منبع موردنظر را وارد کنید تا همان نما در ترمینال باز شود. از پرکاربردترین میانبرهای K9s می‌توان به موارد زیر اشاره کرد:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>میانبر</strong></td><td><strong>کاربرد</strong></td></tr><tr><td><code>:pod</code></td><td>نمایش Podها</td></tr><tr><td><code>:deploy</code></td><td>نمایش Deploymentها</td></tr><tr><td><code>:svc</code></td><td>نمایش Serviceها</td></tr><tr><td><code>:ns</code></td><td>نمایش Namespaceها</td></tr><tr><td><code>:node</code></td><td>نمایش Nodeها</td></tr><tr><td><code>:pvc</code></td><td>نمایش PersistentVolumeClaimها</td></tr><tr><td><code>:cm</code></td><td>نمایش ConfigMapها</td></tr><tr><td><code>:secret</code></td><td>نمایش Secretها</td></tr><tr><td><code>:ing</code></td><td>نمایش Ingressها</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">اگر بخواهید فقط منابع یک Namespace مشخص را مشاهده کنید، می‌توانید هنگام ورود به نمای پاد، نام Namespace را هم مشخص کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>:pod kube-system</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">:pod</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">kube-system</span></span></code></pre></div>



<p class="wp-block-paragraph">همچنین اگر بخواهید پادهای یک Context دیگر را ببینید، می‌توانید از دستور زیر استفاده کنید. این دستور، Context فعال را هم تغییر می‌دهد.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>:pod @&lt;context-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">:pod</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">@</span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">context-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-جابه-جایی-بین-context-و-namespace">جابه‌جایی بین Context و Namespace</h3>



<p class="wp-block-paragraph">در محیط‌هایی که چند کلاستر یا Namespace در اختیار دارید، جابه‌جایی سریع میان آن‌ها اهمیت زیادی دارد. K9s این کار را با چند دستور ساده امکان‌پذیر می‌کند:</p>



<ul class="wp-block-list">
<li><code>:ctx</code> برای مشاهده و تغییر Context</li>



<li><code>:ctx &lt;context-name&gt;</code> برای رفتن مستقیم به یک Context مشخص</li>



<li><code>:ns</code> برای مشاهده و تغییر Namespace</li>
</ul>



<p class="wp-block-paragraph">همچنین با فشردن کلید 0 می‌توانید منابع موجود در تمام Namespaceها را به‌صورت یکجا مشاهده کنید. این گزینه برای بررسی وضعیت کلی کلاستر بسیار کاربردی است.</p>



<h2 class="wp-block-heading" id="h-جست-وجو-و-فیلتر-کردن-منابع-در-k9s">جست‌وجو و فیلتر کردن منابع در K9s</h2>



<p class="wp-block-paragraph">در کلاسترهای کوبرنتیز که تعداد زیادی پاد، دیپلویمنت یا سایر منابع وجود دارد، پیدا کردن یک منبع مشخص می‌تواند زمان‌بر باشد. K9s با ارائه قابلیت‌های متنوع جست‌وجو و فیلتر، یافتن منابع را در نمای فعلی ساده‌تر می‌کند.</p>



<p class="wp-block-paragraph">برای فیلتر کردن منابع، کافی است کلید / را فشار دهید و عبارت موردنظر را وارد کنید. این فیلتر به‌صورت لحظه‌ای روی نمای فعلی اعمال می‌شود و تنها منابع منطبق با عبارت جست‌وجو را نمایش می‌دهد.</p>



<p class="wp-block-paragraph">یکی از قابلیت‌های کاربردی K9s، پشتیبانی از عبارت‌های منظم (Regular Expression یا Regex) است؛ بنابراین می‌توانید چند الگو را به‌طور هم‌زمان جست‌وجو کنید. برای مثال، دستور زیر تمام منابعی را که نام آن‌ها با یکی از دو عبارت مشخص‌شده مطابقت داشته باشد، نمایش می‌دهد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/fred|blee</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">/fred</span><span style="color: #F47067">|</span><span style="color: #F69D50">blee</span></span></code></pre></div>



<p class="wp-block-paragraph">K9s علاوه بر جست‌وجوی متنی، روش‌های دیگری هم برای فیلتر کردن منابع در اختیار شما قرار می‌دهد. در جدول زیر می‌توانید این روش‌ها را ببینید:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>روش</strong></td><td><strong>کاربرد</strong></td></tr><tr><td><code>/text</code></td><td>فیلتر منابع بر اساس متن</td></tr><tr><td><code>/-l app=nginx</code></td><td>فیلتر منابع بر اساس Label</td></tr><tr><td><code>/-f text</code></td><td>جست‌وجوی فازی (Fuzzy Search)</td></tr><tr><td><code>/!text</code></td><td>فیلتر معکوس و نمایش منابعی که با عبارت واردشده مطابقت ندارند</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">اگر بخواهید همه منابع، به‌جز مواردی که شامل عبارت <code>error</code> هستند، نمایش داده شوند، می‌توانید از دستور زیر استفاده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/!error</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">/!error</span></span></code></pre></div>



<p class="wp-block-paragraph">همچنین قابلیت فیلتر تنها به فهرست منابع محدود نمی‌شود. هنگام مشاهده لاگ پادها یا کانتینرها هم می‌توانید با وارد کردن عباراتی مانند <code>/error</code> یا <code>/timeout</code>، فقط خطوط مرتبط با خطاها یا وقفه‌های زمانی را نمایش دهید.</p>



<h2 class="wp-block-heading" id="h-کارهای-عملی-با-k9s-logs-describe-yaml-shell-و-port-forward">کارهای عملی با K9s؛ Logs ،Describe ،YAML ،Shell و Port Forward</h2>



<p class="wp-block-paragraph">K9s علاوه بر نمایش منابع کوبرنتیز، مجموعه‌ای از میانبرهای کاربردی را برای انجام عملیات روزمره در اختیار کاربران قرار می‌دهد. این میانبرها باعث می‌شوند بدون خروج از محیط ترمینال، بتوانید وضعیت منابع را بررسی کنید یا اقدامات مدیریتی موردنیاز را انجام دهید. از مهم‌ترین میانبرهای K9s می‌توان به موارد زیر اشاره کرد:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>کلید</strong></td><td><strong>کاربرد</strong></td></tr><tr><td><code>d</code></td><td>نمایش اطلاعات کامل منبع (Describe)</td></tr><tr><td><code>y</code></td><td>مشاهده فایل YAML منبع</td></tr><tr><td><code>e</code></td><td>ویرایش منبع با ویرایشگر تنظیم‌شده</td></tr><tr><td><code>l</code></td><td>مشاهده لاگ‌های پاد یا کانتینر</td></tr><tr><td><code>s</code></td><td>اجرای Shell روی پاد یا Scale کردن دیپلویمنت</td></tr><tr><td><code>Shift+F</code></td><td>ایجاد Port Forward</td></tr><tr><td><code>Ctrl+d</code></td><td>حذف منبع با دریافت تأیید</td></tr><tr><td><code>Ctrl+k</code></td><td>حذف فوری منبع بدون دریافت تأیید</td></tr><tr><td><code>Ctrl+s</code></td><td>ذخیره نمای فعلی یا Logها روی دیسک</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">اگر پاد چند کانتینر داشته باشد، ابتدا می‌توانید کانتینر موردنظر را انتخاب و سپس با کلید l لاگ آن را مشاهده کنید. همچنین در شرایطی که یک کانتینر دچار Crash شده و پس از راه‌اندازی مجدد، لاگ فعلی اطلاعات کافی در اختیار شما قرار نمی‌دهد، می‌توانید با استفاده از <code>Shift+L</code> لاگ کانتینر قبلی را مشاهده و علت بروز خطا را بررسی کنید.</p>



<h3 class="wp-block-heading" id="h-نمونه-ای-از-عیب-یابی-یک-deployment">نمونه‌ای از عیب‌یابی یک Deployment</h3>



<p class="wp-block-paragraph">فرض کنید یکی از Deploymentهای کلاستر با مشکل مواجه شده است. در K9s می‌توان مراحل عیب‌یابی را به‌ترتیب زیر انجام داد:</p>



<ul class="wp-block-list">
<li>با دستور <code>:deploy</code> به نمای دیپلویمنت‌ها بروید و دیپلویمنت موردنظر را انتخاب کنید.</li>



<li>کلید <code>d</code> را فشار دهید و بخش Events را بررسی کنید تا علت اولیه خطا مشخص شود.</li>



<li>با فشردن Enter، پادهای مربوط به آن دیپلویمنت را مشاهده و پادی را که در وضعیت Running نیست، انتخاب کنید.</li>



<li>با کلید <code>l</code>، لاگ پاد را بررسی کنید تا خطاهایی مانند OOMKilled، نبود متغیرهای محیطی یا خطاهای ارتباطی را شناسایی کنید.</li>



<li>در صورت نیاز، با کلید y فایل YAML منبع را مشاهده و تنظیمات آن را بررسی کنید.</li>



<li>اگر مشکل مشخص شد، با کلید <code>e</code> منبع را ویرایش کرده و تغییرات را ذخیره کنید. K9s این تغییر را اعمال می‌کند و می‌توانید ری‌استارت شدن پاد را مشاهده کنید.</li>



<li>به نمای دیپلویمنت بازگردید و مطمئن شوید Replicaها به وضعیت سالم بازگشته‌اند.</li>
</ul>



<h2 class="wp-block-heading" id="h-مانیتورینگ-قابلیت-های-پیشرفته-pluginها-نکات-production-و-محدودیت-ها">مانیتورینگ، قابلیت‌های پیشرفته، Pluginها، نکات Production و محدودیت‌ها</h2>



<p class="wp-block-paragraph">ابزار K9s در کنار عملیات روزمره مشاهده و مدیریت منابع، مجموعه‌ای از قابلیت‌های تکمیلی هم در اختیار کاربران قرار می‌دهد که از پایش لحظه‌ای وضعیت کلاستر تا امکان تعریف Plugin اختصاصی را پوشش می‌دهند. در ادامه، این قابلیت‌ها را به همراه نکاتی برای استفاده در محیط Production و محدودیت‌های K9s بررسی می‌کنیم.</p>



<h3 class="wp-block-heading" id="h-مشاهده-زنده-وضعیت-منابع-و-متریک-ها">مشاهده زنده وضعیت منابع و متریک‌ها</h3>



<p class="wp-block-paragraph" id="h-مشاهده-وضعیت-real-time-و-metricها"></p>



<p class="wp-block-paragraph">K9s فعالیت منابع کلاستر و متریک‌های مرتبط با پادها، کانتینرها و نودها را به‌صورت زنده نمایش می‌دهد. در استفاده روزمره، یکی از اولین کارهایی که بسیاری از مدیران کلاستر انجام می‌دهند، بررسی سلامت کلی محیط است. برای این منظور می‌توان با دستور <code>:pulses</code> نمایی خلاصه از وضعیت کلاستر مشاهده کرد. این نما تعداد دیپلویمنت‌ها، پادها، StatefulSetها، DaemonSetها و جاب‌ها را نمایش می‌دهد و مشخص می‌کند چه تعداد از آن‌ها با مشکل مواجه هستند.</p>



<p class="wp-block-paragraph">پس از آن، معمولا وضعیت نودها با دستور <code>:node</code> بررسی می‌شود تا مشخص شود که آیا همه نودها در وضعیت Ready قرار دارند یا خیر. همچنین وجود وضعیت‌هایی مانند MemoryPressure یا DiskPressure می‌تواند نشانه بروز مشکل در اجرای Workloadها باشد.</p>



<p class="wp-block-paragraph">در ادامه هم با ورود به نمای پادها و فشردن کلید 0 برای نمایش همه Namespaceها، می‌توان ستون STATUS را بررسی کرد و پادهایی را که در وضعیت‌هایی مانند CrashLoopBackOff ،Error ،Pending یا ImagePullBackOff قرار دارند، به‌سرعت شناسایی کرد.</p>



<p class="wp-block-paragraph">نکته مهم این است که K9s برای مشاهده و بررسی تعاملی وضعیت فعلی کلاستر کاربرد دارد؛ اما برای ذخیره‌سازی و تحلیل تاریخچه متریک‌ها، ساخت داشبورد و هشداردهی مستمر طراحی نشده است. برای این کاربردها باید از ابزارهای تخصصی مانند Prometheus و Grafana استفاده کرد.</p>



<h3 class="wp-block-heading" id="h-pulses-xray-و-rbac">Pulses ،XRay و RBAC</h3>



<p class="wp-block-paragraph">K9s چند قابلیت پیشرفته برای تحلیل وضعیت کلاستر هم در اختیار کاربران قرار می‌دهد. قابلیت Pulses یک داشبورد سطح بالا از وضعیت کلی کلاستر ارائه می‌کند و برای بررسی سریع سلامت منابع بسیار کاربردی است. همان‌طور که در بخش قبل اشاره شد، اجرای دستور <code>:pulses</code> دید مناسبی از وضعیت دیپلویمنت‌ها، پادها و سایر منابع در اختیار مدیر کلاستر قرار می‌دهد.</p>



<p class="wp-block-paragraph">قابلیت XRay برای مشاهده وابستگی میان منابع کوبرنتیز طراحی شده است. برای مثال، با اجرای دستور زیر می‌توان ساختار یک دیپلویمنت را به‌صورت درختی مشاهده کرد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>:xray deploy</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">:xray</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">deploy</span></span></code></pre></div>



<p class="wp-block-paragraph">در این نما، ارتباط دیپلویمنت با ReplicaSetها، پادها و در نهایت کانتینرهای مرتبط، به‌صورت درختی نمایش داده می‌شود. این قابلیت برای منابع دیگری مانند Service ،StatefulSet ،DaemonSet و ReplicaSet هم قابل استفاده است و هنگام عیب‌یابی وابستگی‌ها، بسیار مفید خواهد بود.</p>



<h3 class="wp-block-heading" id="h-popeye-در-k9s">Popeye در K9s</h3>



<p class="wp-block-paragraph">با اجرای دستور <code>:popeye</code> می‌توانید بررسی کلاستر را براساس مجموعه‌ای از Best Practiceها آغاز کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>:popeye</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">:popeye</span></span></code></pre></div>



<p class="wp-block-paragraph">این قابلیت مواردی مانند نبود Probeهای لازم، مشکلات ایمیج‌ها، تخصیص نامناسب منابع و پیکربندی نادرست RBAC را بررسی و نتیجه را با وضعیت‌هایی مانند <code>OK</code> ،<code>Info</code> ،<code>Warn</code> یا <code>Error</code> نمایش می‌دهد.</p>



<h3 class="wp-block-heading" id="h-pluginها-در-k9s">Pluginها در K9s</h3>



<p class="wp-block-paragraph">یکی از قابلیت‌های توسعه‌پذیر K9s، پشتیبانی از Pluginهاست. با استفاده از Plugin می‌توانید فرمان‌های اختصاصی خود را تعریف کنید و آن‌ها را از طریق میانبرهای صفحه‌کلید روی منابع کوبرنتیز اجرا کنید. K9s برای پیدا کردن Pluginها ابتدا فایل زیر را بررسی می‌کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Plaintext</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$XDG_CONFIG_HOME/k9s/plugins.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #adbac7">$XDG_CONFIG_HOME/k9s/plugins.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph">علاوه بر این فایل، K9s پوشه‌های زیر را نیز برای یافتن فایل‌های Plugin بررسی می‌کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Plaintext</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$XDG_CONFIG_HOME/k9s/plugins
$XDG_DATA_HOME/k9s/plugins
$XDG_DATA_DIRS/k9s/plugins</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #adbac7">$XDG_CONFIG_HOME/k9s/plugins</span></span>
<span class="line"><span style="color: #adbac7">$XDG_DATA_HOME/k9s/plugins</span></span>
<span class="line"><span style="color: #adbac7">$XDG_DATA_DIRS/k9s/plugins</span></span></code></pre></div>



<p class="wp-block-paragraph">امکان تعریف تنظیمات اختصاصی Plugin برای هر Context نیز وجود دارد. فایل مربوط به این تنظیمات در ساختار زیر قرار می‌گیرد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Plaintext</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$XDG_DATA_HOME/k9s/clusters/&lt;cluster-name>/&lt;context-name>/plugins.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #adbac7">$XDG_DATA_HOME/k9s/clusters/&lt;cluster-name&gt;/&lt;context-name&gt;/plugins.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph">در این مسیر، <code>&lt;cluster-name&gt;</code> و <code>&lt;context-name&gt;</code> مقادیر جایگزین‌شدنی هستند و باید با نام کلاستر و Context موردنظر جایگزین شوند. هر Plugin می‌تواند شامل میانبر اجرا، توضیح، دامنه منابع، فرمان اجرایی و آرگومان‌های موردنیاز باشد. گزینه <code>scopes</code> مشخص می‌کند که Plugin در نمای کدام منابع فعال باشد. برای مثال، اگر مقدار آن روی <code>pods</code> تنظیم شود، میانبر Plugin در نمای پادها در دسترس خواهد بود.</p>



<p class="wp-block-paragraph">نمونه زیر یک Plugin برای اجرای فرمان <code>kubectl debug</code> روی پاد انتخاب‌شده تعریف می‌کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>plugins:
  debug:
    shortCut: Shift-D
    description: Debug pod
    scopes:
      - pods
    command: kubectl
    background: false
    args:
      - debug
      - -it
      - $NAME
      - -n
      - $NAMESPACE
      - --image=busybox</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">plugins</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">debug</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">shortCut</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Shift-D</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">description</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Debug pod</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">scopes</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #96D0FF">pods</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">command</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">kubectl</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">background</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">false</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">args</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #96D0FF">debug</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #96D0FF">-it</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #96D0FF">$NAME</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #96D0FF">-n</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #96D0FF">$NAMESPACE</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #96D0FF">--image=busybox</span></span></code></pre></div>



<p class="wp-block-paragraph">در این مثال، با فشردن میانبر <code>Shift+D</code> در نمای پادها، فرمان تعریف‌شده برای Pod انتخاب‌شده اجرا می‌شود. متغیر <code>$NAME</code> نام منبع انتخاب‌شده و <code>$NAMESPACE</code> نام Namespace آن را در اختیار فرمان قرار می‌دهد. K9s متغیرهای دیگری مانند <code>$CONTEXT</code> و <code>$CLUSTER</code> را نیز برای استفاده در آرگومان‌های Plugin ارائه می‌کند. به این ترتیب، می‌توان فرمان‌هایی تعریف کرد که بر اساس منبع انتخاب‌شده، Namespace ،Context یا کلاستر فعال اجرا شوند.</p>



<h3 class="wp-block-heading" id="h-نکات-استفاده-از-k9s-در-محیط-production">نکات استفاده از K9s در محیط Production</h3>



<p class="wp-block-paragraph">اگر قصد استفاده از K9s در محیط‌های عملیاتی را دارید، رعایت چند نکته می‌تواند احتمال بروز خطا را کاهش دهد.</p>



<p class="wp-block-paragraph">مهم‌ترین توصیه، اجرای برنامه در حالت فقط‌خواندنی است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s --readonly</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--readonly</span></span></code></pre></div>



<p class="wp-block-paragraph">در این حالت، تمام عملیات‌های تغییردهنده مانند <code>Edit</code> ،<code>Delete</code> و <code>Kill</code> غیرفعال می‌شوند و تنها امکان مشاهده منابع وجود دارد. همچنین هنگام حذف منابع باید به تفاوت میان دو میانبر توجه داشت. کلید <code>Ctrl+d</code> قبل از حذف، از کاربر تایید می‌گیرد، اما <code>Ctrl+k</code> منبع را بدون نمایش پیام تأیید حذف می‌کند؛ بنابراین در محیط Production استفاده از <code>Ctrl+d</code> گزینه ایمن‌تری است.</p>



<p class="wp-block-paragraph">ازآنجایی‌که K9s کاملاً در ترمینال اجرا می‌شود، می‌توانید آن را از طریق SSH روی Bastion Host یا Jump Server نیز اجرا کنید. این موضوع در بسیاری از زیرساخت‌های سازمانی مزیت مهمی محسوب می‌شود.</p>



<p class="wp-block-paragraph">در کلاسترهای بزرگ که تعداد زیادی پاد در حال اجراست، می‌توانید مقدار <code>refreshRate</code> را در فایل تنظیمات افزایش دهید تا فاصله زمانی میان به‌روزرسانی‌ها بیشتر شود. همچنین می‌توانید K9s را با گزینه <code>-n</code> در Namespace موردنظر اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>k9s -n &lt;namespace-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">k9s</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-n</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">namespace-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">در این دستور، <code>&lt;namespace-name&gt;</code> باید با نام Namespace موردنظر جایگزین شود. شروع کار در یک Namespace مشخص، دسترسی به منابع همان Namespace را در کلاسترهای شلوغ ساده‌تر می‌کند.</p>



<p class="wp-block-paragraph">در نهایت، اگر اعضای تیم به‌صورت مشترک از K9s استفاده می‌کنند، می‌توانید فایل‌های تنظیمات، میانبرها، Pluginها و Skinهای سفارشی را در یک مخزن Git نگهداری کنید تا امکان به‌اشتراک‌گذاری و هماهنگ‌سازی این تنظیمات میان اعضای تیم فراهم شود.</p>



<h3 class="wp-block-heading" id="h-محدودیت-های-k9s">محدودیت‌های K9s</h3>



<p class="wp-block-paragraph">K9s با وجود قابلیت‌های متعدد، محدودیت‌هایی نیز دارد که بهتر است پیش از استفاده از این ابزار از آن‌ها آگاه باشید. مهم‌ترین محدودیت این است که K9s برای Automation طراحی نشده است. خروجی آن قابل استفاده در Scriptها نیست و نمی‌توان از آن در Pipelineهای CI/CD یا Cron Jobها استفاده کرد. برای این سناریوها همچنان kubectl ابزار اصلی به شمار می‌آید.</p>



<p class="wp-block-paragraph">همچنین ناوبری K9s تا حدی از Vim الهام گرفته است؛ بنابراین اگر قبلا با کلیدهایی مانند <code>k</code> ،<code>j</code> یا فرمان‌های مبتنی بر <code>:</code> کار نکرده باشید، ممکن است در روزهای نخست برای یادگیری نحوه کار با آن به کمی زمان نیاز داشته باشید. از دیگر محدودیت‌ها می‌توان به موارد زیر اشاره کرد:</p>



<ul class="wp-block-list">
<li>امکان مشاهده هم‌زمان دو کلاستر در یک پنجره وجود ندارد و برای مقایسه آن‌ها باید دو نمونه جداگانه از K9s را اجرا کنید.</li>



<li>Port Forwardهایی که در K9s ایجاد می‌شوند، پس از بسته‌شدن برنامه متوقف می‌شوند. برای اتصال‌های پایدارتر باید از روش دیگری مانند <code>kubectl port-forward</code> استفاده کنید.</li>



<li>K9s برای دنبال‌کردن هم‌زمان لاگ چند پاد یا کانتینر طراحی نشده است و در هر نوبت، لاگ یک کانتینر را نمایش می‌دهد.</li>



<li>K9s قابلیت نگهداری History یا ارسال Alert ندارد و اگر بخواهید اطلاعاتی مانند لاگ‌ها یا خروجی Viewها را نگه دارید، باید قبل از خروج با <code>Ctrl+s</code> آن‌ها را ذخیره کنید.</li>



<li>اگرچه Pluginهای آماده‌ای برای K9s وجود دارد، اما تعداد آن‌ها محدود است و با وجود Pluginهای آماده، ممکن است برای پوشش نیازهای اختصاصی تیم به تعریف Plugin سفارشی نیاز داشته باشید.</li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p class="wp-block-paragraph">در این راهنمای K9s توضیح دادیم که این ابزار چگونه مشاهده، پیمایش و مدیریت تعاملی منابع کوبرنتیز را از داخل ترمینال ساده‌تر می‌کند. K9s با دنبال‌کردن مداوم تغییرات کلاستر، انجام کارهای روزمره‌ای مانند بررسی پادها، مشاهده لاگ‌ها، اجرای <code>describe</code> و جابه‌جایی میان Namespaceها را سریع‌تر می‌کند.</p>



<p class="wp-block-paragraph">بااین‌حال، K9s جایگزین کامل <code>kubectl</code> نیست. برای اسکریپت‌نویسی، فرایندهای CI/CD و خودکارسازی عملیات همچنان باید از ابزارهایی مانند <code>kubectl</code> استفاده کنید. K9s همچنین قابلیت نگهداری تاریخچه داده‌ها یا ارسال هشدار را فراهم نمی‌کند.</p>



<p class="wp-block-paragraph">استفاده از K9s در محیط‌های Production باید با احتیاط همراه باشد. اجرای برنامه در حالت <code>readonly</code>، توجه به مجوزهای تعریف‌شده در RBAC و دقت در عملیات مخربی مانند <code>Delete</code> یا <code>Kill</code> می‌تواند احتمال ایجاد تغییرات ناخواسته در کلاستر را کاهش دهد.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/k9s-kubernetes-guide/">آموزش K9s؛ راهنمای نصب و استفاده از ابزار مدیریت کوبرنتیز در ترمینال</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/k9s-kubernetes-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>راهنمای عملی تنظیم CPU Limit در کوبرنتیز؛ از Request تا Throttling</title>
		<link>https://hamravesh.com/blog/how-to-manage-kubernetes-cpu-limits/</link>
					<comments>https://hamravesh.com/blog/how-to-manage-kubernetes-cpu-limits/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 15 Jul 2026 12:30:33 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5406</guid>

					<description><![CDATA[<p>CPU Request و CPU Limit در کوبرنتیز نقش‌های متفاوتی دارند و نباید آن‌ها را به‌جای یکدیگر در نظر گرفت. Request مقداری از منابع است که Kubernetes هنگام Scheduling برای Pod در نظر می‌گیرد. Scheduler هنگام انتخاب Node، مقدار Request را با ظرفیت Allocatable هر Node مقایسه می‌کند و مصرف لحظه‌ای CPU یا Memory را ملاک تصمیم‌گیری قرار نمی‌دهد.</p>
<p>The post <a href="https://hamravesh.com/blog/how-to-manage-kubernetes-cpu-limits/">راهنمای عملی تنظیم CPU Limit در کوبرنتیز؛ از Request تا Throttling</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">فرض کنید یکی از سرویس‌های مبتنی بر کوبرنتیز شما ناگهان کند شده است. کاربران از افزایش تاخیر شکایت می‌کنند، اما وقتی داشبوردهای مانیتورینگ را بررسی می‌کنید، همه‌چیز عادی به نظر می‌رسد. Podها در وضعیت Running هستند، مصرف CPU روی نود پایین است، Memory تحت فشار نیست و Alert غیرعادی هم دیده نمی‌شود. با این حال، زمان پاسخ‌دهی سرویس همچنان بیشتر از حد انتظار است. معمولا در چنین شرایطی پیدا کردن منشأ مشکل ساده نیست. یکی از دلایلی که کمتر مورد توجه قرار می‌گیرد، CPU Throttling ناشی از CPU Limit در کوبرنتیز است. این مسئله ممکن است در بررسی اولیه داشبوردها به‌وضوح دیده نشود و از چشم تیم عملیات پنهان بماند.</p>



<p class="wp-block-paragraph">نکته مهم اینجاست که وجود CPU آزاد روی نود، لزوما به این معنا نیست که همه کانتینرها بدون محدودیت از منابع پردازشی استفاده می‌کنند. حتی اگر بخشی از ظرفیت پردازشی نود هنوز آزاد باشد، اعمال CPU Limit می‌تواند باعث CPU Throttling در سرویس‌های حساس به تاخیر شود. در ادامه بررسی می‌کنیم که CPU Request و CPU Limit در کوبرنتیز چه تفاوتی با هم دارند، کوبرنتیز هرکدام را در چه مرحله‌ای به کار می‌گیرد و چرا این تنظیم به‌ظاهر ساده می‌تواند تاثیر زیادی بر عملکرد سرویس‌ها داشته باشد.</p>



<h2 class="wp-block-heading" id="h-cpu-request-و-cpu-limit-در-کوبرنتیز-چه-تفاوتی-دارند">CPU Request و CPU Limit در کوبرنتیز چه تفاوتی دارند؟</h2>



<p class="wp-block-paragraph">CPU Request و CPU Limit دو کاربرد متفاوت دارند. CPU Request مشخص می‌کند یک <a href="https://hamravesh.com/blog/what-is-kubernetes-pod" data-type="link" data-id="https://hamravesh.com/blog/what-is-kubernetes-pod" target="_blank" rel="noreferrer noopener">پاد</a> برای اجرا به چه میزان CPU نیاز دارد. کوبرنتیز هنگام انتخاب نود (در فرایند Scheduling)، بررسی می‌کند که با توجه به Request پادهای مستقرشده، کدام نود ظرفیت کافی برای پاد جدید دارد. در این تصمیم، مصرف لحظه‌ای CPU ملاک نیست؛ بنابراین ممکن است CPU یک نود در عمل کم‌مصرف باشد، اما به‌دلیل مجموع Requestهای ثبت‌شده، پاد جدید روی آن اجرا نشود.</p>



<p class="wp-block-paragraph">در مقابل، CPU Limit سقف مصرف CPU کانتینر را پس از اجرا مشخص می‌کند. اگر کانتینر به این سقف برسد، کرنل لینوکس دسترسی آن به CPU را موقتاً محدود می‌کند؛ حتی اگر نود همچنان CPU آزاد داشته باشد.</p>



<p class="wp-block-paragraph">برای درک بهتر تفاوت Request و Limit، در مثال زیر مقدار منابع موردنیاز کانتینر برای انتخاب نود و همچنین سقف مصرف آن پس از اجرا مشخص شده است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: v1
kind: Pod
metadata:
  name: demo-app
spec:
  containers:
    - name: web
      image: nginx
      resources:
        requests:
          cpu: "500m"
          memory: "512Mi"
        limits:
          cpu: "1"
          memory: "512Mi"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Pod</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">demo-app</span></span>
<span class="line"><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">containers</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">web</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">image</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">resources</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">requests</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">cpu</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;500m&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">memory</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;512Mi&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">limits</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">cpu</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;1&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">memory</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;512Mi&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">در این مثال:</p>



<ul class="wp-block-list">
<li>requests.cpu: 500m یعنی پاد برای زمان‌بندی به نیم هسته CPU نیاز دارد.</li>



<li>requests.memory: 512Mi یعنی Scheduler باید نودی را انتخاب کند که بتواند حداقل 512Mi حافظه را برای این پاد در نظر بگیرد.</li>



<li>limits.cpu: 1 یعنی کانتینر در زمان اجرا نمی‌تواند بیش از یک هسته CPU مصرف کند.</li>



<li>limits.memory: 512Mi سقف مصرف حافظه را مشخص می‌کند و عبور از این مقدار می‌تواند به OOM Kill منجر شود. در OOM Kill، کرنل به‌دلیل فشار حافظه یا عبور کانتینر از محدودیت حافظه، یکی از فرایندهای آن را متوقف می‌کند.</li>
</ul>



<h2 class="wp-block-heading" id="h-request-در-scheduling-چه-نقشی-دارد">Request در Scheduling چه نقشی دارد؟</h2>



<p class="wp-block-paragraph">یکی از رایج‌ترین سو برداشت‌ها درباره CPU Request در کوبرنتیز این است که آن را معادل مصرف واقعی برنامه در نظر می‌گیرند؛ درحالی‌که Request در اصل یک سیگنال برای زمان‌بندی (<a href="https://hamravesh.com/blog/what-is-scheduling-in-kubernetes/" data-type="link" data-id="https://hamravesh.com/blog/what-is-scheduling-in-kubernetes/" target="_blank" rel="noreferrer noopener">Scheduling در کوبرنتیز</a>) است و قرار نیست گزارشی از مصرف لحظه‌ای کانتینر ارائه دهد. به همین دلیل ممکن است نود از نظر مصرف واقعی CPU تقریبا بیکار به نظر برسد، اما Scheduler همچنان نتواند پاد جدیدی را روی آن قرار دهد.&nbsp;</p>



<p class="wp-block-paragraph">اگر مجموع CPU Request پادهای مستقر روی یک نود به ظرفیت قابل تخصیص (Allocatable) آن رسیده باشد، کوبرنتیز دیگر پاد جدیدی را روی آن نود قرار نمی‌دهد؛ حتی اگر نمودارهای مانیتورینگ نشان دهند که مصرف واقعی CPU پایین است. در چنین شرایطی، اگر نود مناسب دیگری هم وجود نداشته باشد، پاد جدید در وضعیت Pending باقی می‌ماند و اجرا نمی‌شود.</p>



<p class="wp-block-paragraph">تنظیم نادرست Requestها می‌تواند روی بهره‌وری کل کلاستر هم تاثیر بگذارد. اگر Requestها بیش از نیاز واقعی Workload تعیین شوند، Scheduler باید آن مقدار را در محاسبه ظرفیت قابل زمان‌بندی نود لحاظ کند. در نتیجه، بخشی از ظرفیت قابل زمان‌بندی (Schedulable Capacity) برای استقرار پادهای دیگر قابل استفاده نخواهد بود؛ حتی اگر مصرف واقعی CPU پایین باشد. پس بهتر است Request را بر اساس نیاز واقعی Workload تنظیم کنیم، زیرا Scheduler برای استقرار Podها به همین مقدار تکیه می‌کند و مصرف لحظه‌ای برنامه را معیار قرار نمی‌دهد.</p>



<h2 class="wp-block-heading" id="h-cpu-limit-در-کوبرنتیز-در-پشت-صحنه-چطور-اعمال-می-شود">CPU Limit در کوبرنتیز در پشت صحنه چطور اعمال می‌شود؟</h2>



<p class="wp-block-paragraph">برخلاف تصور رایج، کوبرنتیز مستقیماً مصرف CPU کانتینر را محدود نمی‌کند. پس از اینکه Scheduler نود مناسب را برای پاد انتخاب کرد، kubelet که روی آن نود اجرا می‌شود، مشخصات پاد را دریافت می‌کند. (عامل اجرایی کوبرنتیز روی هر نود است که پادها و کانتینرهای آن نود را راه‌اندازی و مدیریت می‌کند.) سپس kubelet از طریق Container Runtime (مانند containerd)، کانتینر را راه‌اندازی می‌کند.</p>



<p class="wp-block-paragraph">Container Runtime برای هر کانتینر یک cgroup ایجاد کرده و مقادیر Request و Limit را به آن‌ها اعمال می‌کند. cgroup قابلیتی در لینوکس است که برای مدیریت و محدودکردن منابع پردازشی کانتینرها به کار می‌رود. از این مرحله به بعد، اعمال محدودیت CPU بر عهده کرنل لینوکس است.</p>



<p class="wp-block-paragraph">در این فرایند، CPU Request و CPU Limit نقش‌های متفاوتی دارند. مقدار CPU Request معمولاً به <code>cpu.weight</code> تبدیل می‌شود و وزن نسبی کانتینر را هنگام رقابت بر سر CPU مشخص می‌کند. این مقدار به معنای اختصاص یا رزرو مقدار ثابتی از CPU نیست. در مقابل، CPU Limit به <code>cpu.max</code> تبدیل می‌شود و سقف سخت مصرف CPU کانتینر را تعیین می‌کند.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cpu.max = &lt;quota> &lt;period></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">cpu.max</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">quot</span><span style="color: #ADBAC7">a</span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">perio</span><span style="color: #ADBAC7">d</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">برای مثال، اگر CPU Limit برابر 200m باشد، مقدار cpu.max به‌صورت زیر تنظیم می‌شود:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cpu.max = 20000 100000</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">cpu.max</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">=</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">20000</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">100000</span></span></code></pre></div>



<p class="wp-block-paragraph">در این مثال، کانتینر در هر بازه ۱۰۰،۰۰۰ میکروثانیه (معادل ۱۰۰ میلی‌ثانیه) فقط مجاز است ۲۰،۰۰۰ میکروثانیه (معادل ۲۰ میلی‌ثانیه) از CPU استفاده کند. اگر این سهم را پیش از پایان بازه مصرف کند، کرنل اجرای آن را تا شروع دوره بعدی متوقف می‌کند. همین توقف موقت را CPU Throttling در کوبرنتیز می‌نامند. رابطه میان Request و Limit با تنظیمات cgroup را می‌توان به‌صورت زیر خلاصه کرد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Plaintext</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>CPU request → cpu.weight → controls fairness
CPU limit   → cpu.max    → enforces a hard cap</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #adbac7">CPU request → cpu.weight → controls fairness</span></span>
<span class="line"><span style="color: #adbac7">CPU limit   → cpu.max    → enforces a hard cap</span></span></code></pre></div>



<p class="wp-block-paragraph">نکته مهم این است که CPU Throttling صرفا به معنای «کمی کندتر شدن» کانتینر نیست. اگر سهم CPU مجاز در یک بازه زمانی به‌طور کامل مصرف شود، کانتینر تا آغاز بازه بعدی، عملا امکان دریافت CPU بیشتری را نخواهد داشت.</p>



<h2 class="wp-block-heading" id="h-چرا-با-وجود-cpu-آزاد-روی-نود-باز-هم-پاد-throttle-می-شود">چرا با وجود CPU آزاد روی نود باز هم پاد Throttle می‌شود؟</h2>



<p class="wp-block-paragraph">شاید در نگاه اول این اتفاق غیرمنطقی به نظر برسد که اگر نود هنوز CPU آزاد دارد، چرا یک پاد باید با CPU Throttling مواجه شود؟ پاسخ این سوال را باید در نحوه اعمال CPU Limit در کوبرنتیز بررسی کنیم.&nbsp;</p>



<p class="wp-block-paragraph">همان‌طور که در بخش قبل گفتیم، CPU Limit در سطح cgroup اعمال می‌شود، نه در سطح کل نود. کرنل این محدودیت را براساس سهمیه زمانی CPU تعیین‌شده برای همان cgroup اعمال می‌کند و میزان CPU آزاد نود را در این تصمیم دخالت نمی‌دهد. به همین دلیل، پایین‌بودن مصرف CPU در سطح نود لزوماً به این معنا نیست که همه کانتینرها می‌توانند از ظرفیت آزاد آن استفاده کنند. ممکن است نود همچنان CPU آزاد داشته باشد، اما کانتینری که سهمیه زمانی CPU خود را مصرف کرده است، تا آغاز دوره بعدی نتواند CPU بیشتری دریافت کند.</p>



<p class="wp-block-paragraph">همین موضوع ممکن است باعث شود مشکل را به‌اشتباه به کمبود منابع نود نسبت دهیم. در واقع، نود با کمبود CPU مواجه نیست؛ بلکه کانتینر سهمیه زمانی CPU خود را در آن دوره مصرف کرده است و کرنل تا آغاز دوره بعدی اجازه استفاده بیشتر از CPU را به آن نمی‌دهد.</p>



<p class="wp-block-paragraph">در نتیجه، با وجود ظرفیت پردازشی بلااستفاده روی نود، سرویس ممکن است با افزایش تأخیر، تشکیل صف درخواست‌ها (Queue Buildup) و در نهایت Timeout مواجه شود.</p>



<h2 class="wp-block-heading" id="h-cpu-limit-با-memory-limit-چه-فرقی-دارد">CPU Limit با Memory Limit چه فرقی دارد؟</h2>



<p class="wp-block-paragraph">یکی از اشتباهات رایج درباره CPU Limit در کوبرنتیز این است که آن را با همان منطق Memory Limit در نظر می‌گیرند؛ درحالی‌که این دو از نظر نوع و رفتار هنگام رسیدن به Limit با هم متفاوت‌اند. جدول زیر این تفاوت را نشان می‌دهد:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>منبع</strong></td><td class="has-text-align-center" data-align="center"><strong>رفتار هنگام عبور از Limit</strong></td><td class="has-text-align-center" data-align="center"><strong>نتیجه محتمل</strong></td></tr><tr><td class="has-text-align-center" data-align="center">CPU</td><td class="has-text-align-center" data-align="center">CPU Throttling</td><td class="has-text-align-center" data-align="center">افزایش Latency ،Timeout و کاهش Throughput</td></tr><tr><td class="has-text-align-center" data-align="center">Memory</td><td class="has-text-align-center" data-align="center">OOM Kill</td><td class="has-text-align-center" data-align="center">Restart کانتینر و اختلال در سرویس</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">این تفاوت در محیط‌های عملیاتی اهمیت زیادی دارد. اگر افزایش زمان پاسخ‌گویی مشاهده می‌کنید، ممکن است ریشه مشکل CPU Throttling باشد. اگر کانتینری به‌طور ناگهانی Restart می‌شود، ابتدا Last Termination Reason را بررسی کنید تا مشخص شود آیا دلیل توقف آن <code>OOMKilled</code> بوده است یا نه. در صورت مشاهده این وضعیت، Memory Limit و میزان واقعی مصرف حافظه را بررسی کنید.</p>



<h2 class="wp-block-heading" id="h-برای-سرویس-های-حساس-به-تاخیر-چه-الگویی-بهتر-است">برای سرویس‌های حساس به تاخیر چه الگویی بهتر است؟</h2>



<p class="wp-block-paragraph">اگر سرویسی به تاخیر حساس است، هدف فقط محدود کردن مصرف CPU نیست و باید تعادلی بین عملکرد و مدیریت منابع برقرار شود. پیشنهاد می‌شود که CPU Request بر اساس الگوی واقعی مصرف تنظیم شود و CPU Limit به‌صورت پیش‌فرض اعمال نشود؛ مگر اینکه واقعا به یک سقف سخت برای مصرف CPU نیاز باشد.</p>



<p class="wp-block-paragraph">همان‌طور که پیش‌تر دیدیم، CPU Limit سخت‌گیرانه می‌تواند حتی با وجود CPU آزاد روی نود باعث Throttling شود. به همین دلیل، برای بسیاری از سرویس‌های حساس به تاخیر، تنظیم یک CPU Request متناسب با مصرف واقعی و حذف CPU Limit می‌تواند به کانتینر اجازه دهد از CPU آزاد نود برای مدیریت Burstهای کوتاه‌مدت (افزایش ناگهانی و موقت مصرف CPU) استفاده کند. نمونه زیر همین رویکرد را نشان می‌دهد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: apps/v1
kind: Deployment
metadata:
  name: checkout-api
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: checkout-api
        image: example.com/checkout-api:1.0.0
        resources:
          requests:
            cpu: "300m"
            memory: "512Mi"
          limits:
            memory: "512Mi"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">apps/v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Deployment</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">checkout-api</span></span>
<span class="line"><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">replicas</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">3</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">template</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">containers</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">checkout-api</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">image</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example.com/checkout-api:1.0.0</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">resources</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">requests</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">cpu</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;300m&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">memory</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;512Mi&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">limits</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">memory</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;512Mi&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">در این مثال، برای هر پاد CPU Request برابر 300m و Memory Request برابر 512Mi تعریف شده است. Memory Limit نیز روی 512Mi قرار دارد، اما هیچ‌گونه CPU Limit تعریف نشده است. حذف CPU Limit به سرویس اجازه می‌دهد در صورت وجود ظرفیت آزاد روی نود، Burstهای کوتاه‌مدت مصرف CPU را بدون مواجهه با یک سقف سخت مدیریت کند.</p>



<p class="wp-block-paragraph">البته این توصیه به این معنا نیست که CPU Limit همیشه باید حذف شود. در برخی Workloadهای حساس به تاخیر، حذف CPU Limit می‌تواند گزینه مناسب‌تری باشد؛ اما تنها زمانی که CPU Request باتوجه‌به رفتار واقعی برنامه تنظیم شده و الگوی مصرف آن در محیط عملیاتی بررسی شده باشد.</p>



<h2 class="wp-block-heading" id="h-برای-عیب-یابی-request-و-limit-چه-مواردی-را-بررسی-کنیم">برای عیب‌یابی Request و Limit چه مواردی را بررسی کنیم؟</h2>



<p class="wp-block-paragraph">اگر احتمال می‌دهید مشکل به تنظیمات Request یا Limit مربوط باشد، چند بررسی اولیه می‌تواند سرنخ‌های مهمی در اختیارتان قرار دهد. ابتدا مصرف فعلی CPU و Memory هر پاد را بررسی کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl top pod</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">top</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span></span></code></pre></div>



<p class="wp-block-paragraph">سپس جزئیات پاد را مشاهده کنید تا مقدار Request ،Limit، کلاس QoS، رویدادها (Events) و آخرین دلیل توقف کانتینر (Last Termination Reason) را ببینید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl describe pod &lt;pod-name></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">describe</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;</span><span style="color: #96D0FF">pod-nam</span><span style="color: #ADBAC7">e</span><span style="color: #F47067">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">اگر احتمال می‌دهید پاد به‌دلیل کمبود منابع روی هیچ نودی زمان‌بندی نشده است، Eventهای مربوط به Scheduling را نیز بررسی کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl describe pod frontend | grep -A 9999999999 Events</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">describe</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">frontend</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">grep</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-A</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">9999999999</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Events</span></span></code></pre></div>



<p class="wp-block-paragraph">به این نکته توجه داشته باشید که kubectl top pod فقط مصرف فعلی CPU و Memory را نمایش می‌دهد و به‌تنهایی برای تشخیص CPU Throttling کافی نیست. برای تشخیص این وضعیت باید متریک‌های مربوط به CPU Throttling را در ابزار مانیتورینگ بررسی کنید.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 class="wp-block-heading" id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده، بر بستر ابر اختصاصی یا به صورت On-Premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a href="https://hamravesh.com/managed-kubernetes" type="link" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز مدیریت‌شده</a></p>
</div></div>
</div>



<h2 class="wp-block-heading" id="h-چه-زمانی-cpu-limit-نگذاریم">چه زمانی CPU Limit نگذاریم؟</h2>



<p class="wp-block-paragraph">CPU Limit در کوبرنتیز ممکن است حتی در صورت وجود CPU آزاد روی نود، باعث CPU Throttling و افزایش تاخیر شود. تعریف‌نکردن CPU Limit می‌تواند برای موارد زیر مناسب‌تر باشد:</p>



<ul class="wp-block-list">
<li>سرویس‌های حساس به تاخیر</li>



<li>Workloadهایی که برای مدیریت Burstهای کوتاه‌مدت (افزایش ناگهانی و موقت مصرف CPU) باید بتوانند از CPU آزاد نود استفاده کنند</li>



<li>سرویس‌هایی که CPU Throttling در آن‌ها باعث افزایش تاخیر، تشکیل صف درخواست‌ها، Timeout یا کاهش Throughput می‌شود</li>
</ul>



<p class="wp-block-paragraph">در این شرایط، CPU Request باید براساس مصرف واقعی Workload تنظیم شود. CPU Limit نیز فقط زمانی تعریف شود که Workload واقعاً به یک سقف سخت برای مصرف CPU نیاز داشته باشد.</p>



<h2 class="wp-block-heading" id="h-چه-زمانی-cpu-limit-در-کوبرنتیز-همچنان-مفید-است">چه زمانی CPU Limit در کوبرنتیز همچنان مفید است؟</h2>



<p class="wp-block-paragraph">با اینکه حذف CPU Limit در کوبرنتیز می‌تواند برای بسیاری از سرویس‌های حساس به تأخیر مناسب‌تر باشد، استفاده از آن در برخی سناریوها همچنان قابل دفاع است. CPU Limit باید زمانی تعریف شود که Workload واقعاً به یک سقف سخت برای مصرف CPU نیاز داشته باشد، نه صرفاً به این دلیل که به‌صورت پیش‌فرض در یک الگوی پیکربندی قرار گرفته است. استفاده از CPU Limit در شرایط زیر می‌تواند مناسب باشد:</p>



<ul class="wp-block-list">
<li>کلاسترهای Multi-tenant که چند تیم یا چند سرویس از منابع مشترک استفاده می‌کنند</li>



<li>Workloadهای غیر قابل اعتماد (Untrusted) که باید مصرف CPU آن‌ها به‌طور سخت‌گیرانه کنترل شود</li>



<li>جاب‌های پردازش دسته‌ای (Batch Jobs) که به سقف مشخصی برای مصرف CPU نیاز دارند</li>



<li>محیط‌های Benchmark و Performance Test که تکرارپذیری نتایج اهمیت دارد</li>



<li>سرویس‌هایی که بر اساس پلن‌های ثابت CPU به مشتریان ارائه می‌شوند</li>



<li>سناریوهایی که Strict Cost Control در آن‌ها اهمیت دارد و مصرف CPU باید در یک بودجه مشخص باقی بماند</li>



<li>محیط‌هایی که سیاست‌های پلتفرم، تعریف CPU Limit را الزامی می‌کنند</li>
</ul>



<p class="wp-block-paragraph">در این سناریوها، CPU Limit یک سقف مشخص برای مصرف CPU ایجاد می‌کند؛ هرچند ممکن است امکان استفاده Workload از CPU آزاد نود را در زمان Burst محدود کند. CPU Limit نیز باید فقط زمانی تعریف شود که Workload واقعاً به یک سقف سخت برای مصرف CPU نیاز داشته باشد.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی-nbsp">جمع‌بندی&nbsp;</h2>



<p class="wp-block-paragraph">CPU Limit در کوبرنتیز همیشه به بهبود عملکرد و پایداری سرویس منجر نمی‌شود و حتی ممکن است با وجود CPU آزاد روی نود، باعث Throttling و افزایش تأخیر شود. بنابراین، Request و Limit را براساس رفتار واقعی هر Workload تنظیم کنید و CPU Limit را فقط زمانی به کار ببرید که به سقف سخت مصرف نیاز دارید. بررسی مصرف منابع و متریک‌های CPU Throttling نیز کمک می‌کند این تصمیم براساس داده‌های واقعی گرفته شود، نه تنظیمات پیش‌فرض.<br><br></p>
<p>The post <a href="https://hamravesh.com/blog/how-to-manage-kubernetes-cpu-limits/">راهنمای عملی تنظیم CPU Limit در کوبرنتیز؛ از Request تا Throttling</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/how-to-manage-kubernetes-cpu-limits/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>بازنشستگی Ingress NGINX؛ ریسک‌ها، جایگزین‌ها و مسیر مهاجرت</title>
		<link>https://hamravesh.com/blog/ingress-nginx-retirement/</link>
					<comments>https://hamravesh.com/blog/ingress-nginx-retirement/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 17 Jun 2026 12:30:07 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5247</guid>

					<description><![CDATA[<p>بازنشستگی ingress-nginx یکی از مهم‌ترین تغییرات اخیر در اکوسیستم Kubernetes به شمار می‌آید. این پروژه که سال‌ها یکی از رایج‌ترین Ingress Controllerهای Kubernetes بود، دیگر در مسیر توسعه عادی قرار ندارد و پس از پایان دوره پشتیبانی، به‌روزرسانی امنیتی و اصلاح باگ جدیدی برای آن منتشر نمی‌شود. </p>
<p>The post <a href="https://hamravesh.com/blog/ingress-nginx-retirement/">بازنشستگی Ingress NGINX؛ ریسک‌ها، جایگزین‌ها و مسیر مهاجرت</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">بازنشستگی ingress-nginx یکی از مهم‌ترین تغییرات اخیر در اکوسیستم کوبرنتیز به شمار می‌آید. این پروژه که سال‌ها یکی از رایج‌ترین Ingress Controllerهای کوبرنتیز بود، دیگر در مسیر توسعه عادی قرار ندارد و پس از پایان دوره پشتیبانی، به‌روزرسانی امنیتی و اصلاح باگ جدیدی برای آن منتشر نمی‌شود. این اتفاق باعث شده است که مهاجرت از ingress nginx و بررسی جایگزین به یکی از دغدغه‌های اصلی تیم‌های زیرساخت و DevOps تبدیل شود.</p>



<p class="wp-block-paragraph">در این مقاله بررسی می‌کنیم که ingress-nginx چیست، دقیقاً چه بخشی از این پروژه بازنشسته شده، چرا کوبرنتیز این تصمیم را گرفته است و ادامه استفاده از آن چه ریسک‌هایی دارد. همچنین گزینه‌های موجود برای جایگزین ingress-nginx، نقش Gateway API و مراحل مهاجرت از اینگرس nginx با استفاده از ابزار Ingress2Gateway را به‌صورت عملی آموزش می‌دهیم.</p>



<h2 class="wp-block-heading" id="h-اهمیت-بازنشستگی-ingress-nginx-چرا-کوبرنتیز-درباره-آن-هشدار-می-دهد">اهمیت بازنشستگی ingress-nginx؛ چرا کوبرنتیز درباره آن هشدار می‌دهد؟</h2>



<p class="wp-block-paragraph">بازنشستگی ingress-nginx صرفا پایان عمر یک پروژه متن‌باز نیست، بلکه به پایان چرخه نگهداری یکی از پرکاربردترین Ingress Controllerهای کوبرنتیز اشاره دارد. بر اساس بیانیه رسمی کوبرنتیز، ادامه استفاده از این پروژه پس از پایان دوره پشتیبانی، می‌تواند ریسک‌های امنیتی و عملیاتی جدیدی برای محیط‌های Production ایجاد کند.</p>



<p class="wp-block-paragraph">اهمیت این موضوع زمانی بیشتر مشخص می‌شود که بخش قابل توجهی از کلاسترهای کوبرنتیز همچنان از ingress-nginx برای مدیریت ترافیک HTTP و HTTPS استفاده می‌کنند. هرچند استقرارهای فعلی به کار خود ادامه می‌دهند، اما پس از بازنشستگی، هیچ وصله امنیتی، اصلاح باگ یا نسخه جدیدی برای پروژه منتشر نمی‌شود و آسیب‌پذیری‌های آینده ممکن است بدون راهکار رسمی باقی بمانند.</p>



<p class="wp-block-paragraph">تیم کوبرنتیز اعلام کرده است که این تصمیم نتیجه چالش‌های طولانی‌مدت در نگهداری پروژه، محدود بودن افراد مسئول نگهداری و افزایش پیچیدگی فنی آن بوده است، به همین دلیل، تیم کوبرنتیز به کاربران توصیه می‌کند که از همین حالا برای مهاجرت از ingress-nginx یا انتخاب جایگزین مناسب برنامه‌ریزی کنند.</p>



<h2 class="wp-block-heading" id="h-ingress-nginx-چیست">ingress-nginx چیست؟</h2>



<p class="wp-block-paragraph">ingress-nginx یک Ingress Controller مبتنی بر NGINX برای کوبرنتیز است که منابع Ingress را پایش کرده و بر اساس قوانین تعریف‌شده، پیکربندی NGINX را به‌صورت خودکار ایجاد و به‌روزرسانی می‌کند تا ترافیک HTTP و HTTPS به سرویس‌های مناسب هدایت شود.</p>



<p class="wp-block-paragraph">در کوبرنتیز، منبع Ingress فقط شامل قوانین مسیریابی است و به‌تنهایی درخواست‌ها را پردازش نمی‌کند. برای اعمال این قوانین به یک Ingress Controller نیاز است و ingress-nginx یکی از شناخته‌شده‌ترین پیاده‌سازی‌های این مدل به شمار می‌آید.</p>



<p class="wp-block-paragraph">یکی از دلایل محبوبیت ingress-nginx، متن‌باز بودن و امکان استفاده از آن در انواع محیط‌های کوبرنتیز، چه در سرویس‌های ابری و چه در زیرساخت‌های On-Premise، بود و به همین دلیل در میان تیم‌های DevOps و SRE جایگاه ویژه‌ای پیدا کرد.</p>



<h2 class="wp-block-heading" id="h-دقیقا-چه-چیزی-بازنشسته-شده-است">دقیقاً چه چیزی بازنشسته شده است؟</h2>



<p class="wp-block-paragraph">نکته مهمی که باید بدانید این است که قابلیت Ingress همچنان بخشی از کوبرنتیز  باقی می‌ماند، اما پروژه ingress-nginx پس از پایان دوره پشتیبانی دیگر به‌روزرسانی نمی‌شود. بر اساس اعلام رسمی کوبرنتیز ، پس از پایان نگهداری پروژه:</p>



<ul class="wp-block-list">
<li>نسخه جدیدی از ingress-nginx منتشر نمی‌شود</li>



<li>باگ‌های جدید برطرف نخواهند شد</li>



<li>برای آسیب‌پذیری‌های آینده وصله امنیتی ارائه نمی‌شود</li>



<li>مخازن GitHub پروژه در حالت فقط‌خواندنی (Read-only) قرار می‌گیرند.</li>
</ul>



<p class="wp-block-paragraph">در عین حال، استقرارهای فعلی همچنان به کار خود ادامه می‌دهند و آرتیفکت‌هایی مانند Helm Chartها و Container Imageهای موجود در دسترس هستند. البته با این حال استفاده از نرم‌افزاری که دیگر به‌روزرسانی امنیتی دریافت نمی‌کند، می‌تواند به مرور زمان ریسک‌های عملیاتی و امنیتی را افزایش دهد. اگر می‌خواهید بررسی کنید که آیا کلاستر شما از ingress-nginx استفاده می‌کند یا خیر، می‌توانید دستور زیر را اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">get</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pods</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--all-namespaces</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--selector</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">app.kubernetes.io/name=ingress-nginx</span></span></code></pre></div>



<p class="wp-block-paragraph">اگر این دستور خروجی داشته باشد، کلاستر شما از ingress-nginx استفاده می‌کند و بهتر است وضعیت زیرساخت خود را ارزیابی و برای مهاجرت از ingress nginx یا انتخاب یک جایگزین ingress-nginx مناسب برنامه‌ریزی کنید.</p>



<h2 class="wp-block-heading" id="h-چرا-ingress-nginx-بازنشسته-شد">چرا ingress-nginx بازنشسته شد؟</h2>



<p class="wp-block-paragraph">بازنشستگی ingress-nginx نتیجه مجموعه‌ای از چالش‌های فنی و مدیریتی است که طی سال‌های گذشته شکل گرفته‌اند. تیم کوبرنتیز اعلام کرده است که نگهداری این پروژه برای مدت طولانی بر عهده تعداد محدودی افراد مسئول نگهداری بوده و این مدل برای یکی از پرکاربردترین اجزای اکوسیستم Cloud Native پایداری لازم را نداشته است.</p>



<p class="wp-block-paragraph">عامل مهم دیگر، انباشت بدهی فنی (Technical Debt) است. ingress-nginx در ابتدا به‌عنوان یکی از پیاده‌سازی‌های Ingress API توسعه یافت، اما به مرور زمان قابلیت‌ها و Annotationهای متعددی به آن اضافه شد. این انعطاف‌پذیری برای کاربران مفید بود، اما پیچیدگی نگهداری و مدیریت امنیت پروژه را افزایش داد.</p>



<p class="wp-block-paragraph">از سوی دیگر، جامعه کوبرنتیز در سال‌های اخیر به سمت معماری‌ها و استانداردهای جدیدتر مدیریت ترافیک حرکت کرده است؛ به همین دلیل، به جای توسعه بیشتر ingress-nginx، تمرکز اکوسیستم به سمت راهکارهایی مانند Gateway API و نسل جدید Ingress Controllerها معطوف شده است.</p>



<p class="wp-block-paragraph">در مجموع، بازنشستگی ingress-nginx را می‌توان حاصل سه عامل اصلی محدودیت در نگهداری پروژه، افزایش بدهی فنی و حرکت اکوسیستم کوبرنتیز به سمت مدل‌های جدیدتر مدیریت ترافیک دانست.</p>



<h2 class="wp-block-heading" id="h-اگر-مهاجرت-نکنیم-چه-اتفاقی-می-افتد">اگر مهاجرت نکنیم چه اتفاقی می‌افتد؟</h2>



<p class="wp-block-paragraph">بازنشستگی ingress-nginx باعث توقف ناگهانی سرویس‌های فعلی نمی‌شود و استقرارهای موجود همچنان به کار خود ادامه می‌دهند. با این حال، ادامه استفاده از این پروژه به‌معنای استفاده از نرم‌افزاری است که دیگر توسعه فعال و پشتیبانی امنیتی دریافت نمی‌کند.</p>



<p class="wp-block-paragraph">یکی از مهم‌ترین پیامدهای این وضعیت، افزایش ریسک امنیتی در طول زمان است. هر آسیب‌پذیری جدیدی که پس از پایان دوره پشتیبانی کشف شود، ممکن است بدون وصله امنیتی باقی بماند و سازمان‌ها ناچار باشند ریسک آن را بپذیرند یا راهکارهای موقت خود را پیاده‌سازی کنند.</p>



<p class="wp-block-paragraph">موضوع دیگر، افزایش بدهی فنی است. هرچه وابستگی سرویس‌ها به قابلیت‌های اختصاصی ingress-nginx، تنظیمات ویژه و Annotationها بیشتر شود، فرایند مهاجرت در آینده پیچیده‌تر و پرهزینه‌تر می‌شود. </p>



<p class="wp-block-paragraph">همچنین ممکن است به دلیل عدم به‌روزرسانی پروژه ingress-nginx برای سازگاری با تغییرات، در نسخه‌های آینده کوبرنتیز یا سایر اجزای اکوسیستم، ناسازگاری‌های جدیدی ایجاد شود. توصیه جامعه کوبرنتیز این است که سازمان‌ها پیش از تبدیل شدن این وابستگی به یک چالش عملیاتی، وضعیت کلاسترهای خود را بررسی و برای مهاجرت از ingress nginx یا انتخاب یک جایگزین ingress-nginx مناسب برنامه‌ریزی کنند.</p>



<h2 class="wp-block-heading" id="h-جایگزین-های-ingress-nginx-چیست">جایگزین‌های ingress-nginx چیست؟</h2>



<p class="wp-block-paragraph">بازنشستگی ingress-nginx به این معنا نیست که کوبرنتیز دیگر از مدیریت ترافیک ورودی پشتیبانی نمی‌کند. این اکوسیستم از مدت‌ها قبل گزینه‌های مختلفی برای این منظور در اختیار کاربران قرار داده است و در اطلاعیه‌های رسمی هم به مهاجرت از ingress nginx یا انتخاب یک جایگزین مناسب توصیه شده است.</p>



<p class="wp-block-paragraph">انتخاب بهترین گزینه به عواملی مانند معماری کلاستر، نیازهای عملیاتی و برنامه بلندمدت سازمان بستگی دارد. برخی تیم‌ها فقط به دنبال جایگزینی Ingress Controller فعلی هستند و برخی دیگر ترجیح می‌دهند هم‌زمان به سمت فناوری‌های جدیدتر حرکت کنند. در ادامه برخی از مهم‌ترین جایگزین‌های ingress-nginx را معرفی می‌کنیم.</p>



<p class="wp-block-paragraph" id="h-traefik"><strong>Traefik</strong></p>



<p class="wp-block-paragraph">Traefik یکی از شناخته‌شده‌ترین Ingress Controllerهای کوبرنتیز است که علاوه بر Ingress API، از Gateway API هم پشتیبانی می‌کند. این ویژگی امکان مهاجرت تدریجی را برای بسیاری از تیم‌ها فراهم می‌کند. همچنین راه‌اندازی ساده، یکپارچگی مناسب با کوبرنتیز و پشتیبانی هم‌زمان از مدل‌های مختلف مدیریت ترافیک، از مهم‌ترین دلایل محبوبیت این پروژه است.</p>



<p class="wp-block-paragraph">Traefik معمولاً برای تیم‌هایی مناسب است که به دنبال مهاجرت کم‌دردسر از ingress-nginx هستند و می‌خواهند علاوه بر Ingress API، به‌تدریج از Gateway API نیز استفاده کنند. سادگی راه‌اندازی و مدیریت، این گزینه را برای کلاسترهای کوچک و متوسط جذاب کرده است.</p>



<p class="wp-block-paragraph"><strong>Kong Gateway</strong></p>



<p class="wp-block-paragraph">Kong Gateway یکی دیگر از گزینه‌های شناخته‌شده برای مدیریت ترافیک در Kubernetes است که علاوه بر قابلیت‌های Ingress Controller، امکانات گسترده‌ای در حوزه API Gateway نیز ارائه می‌دهد. این پروژه از Gateway API پشتیبانی می‌کند و برای سازمان‌هایی که علاوه بر مسیریابی ترافیک، به قابلیت‌هایی مانند احراز هویت، Rate Limiting، مدیریت API و سیاست‌های امنیتی پیشرفته نیاز دارند، گزینه مناسبی محسوب می‌شود.</p>



<p class="wp-block-paragraph" id="h-envoy-gateway"><strong>Envoy Gateway</strong></p>



<p class="wp-block-paragraph">Envoy Gateway با تمرکز بر Gateway API توسعه یافته است و بیشتر برای سازمان‌هایی مناسب است که قصد دارند معماری مدیریت ترافیک خود را بر پایه استانداردهای جدید کوبرنتیز طراحی کنند. این پروژه یکی از گزینه‌هایی است که در سال‌های اخیر توانسته توجه بسیاری از تیم‌های Cloud Native را به خود جلب کند.</p>



<p class="wp-block-paragraph">Envoy Gateway بیشتر برای سازمان‌هایی مناسب است که قصد دارند از ابتدا بر پایه Gateway API حرکت کنند یا به قابلیت‌های پیشرفته مدیریت ترافیک در معماری‌های Cloud Native و Microservices نیاز دارند.</p>



<p class="wp-block-paragraph" id="h-nginx-gateway-fabric"><strong>NGINX Gateway Fabric</strong></p>



<p class="wp-block-paragraph">NGINX Gateway Fabric راهکار دیگری است که بر پایه Gateway API توسعه یافته است و توسط اکوسیستم NGINX ارائه می‌شود. این گزینه می‌تواند برای تیم‌هایی که تجربه کار با محصولات NGINX را دارند، مسیر مهاجرت آشناتری ایجاد کند.</p>



<p class="wp-block-paragraph">NGINX Gateway Fabric گزینه مناسبی برای تیم‌هایی است که تجربه کار با NGINX را دارند و می‌خواهند ضمن استفاده از Gateway API، همچنان در اکوسیستم محصولات NGINX باقی بمانند.</p>



<p class="wp-block-paragraph"><strong>نکته مهم:</strong> در اطلاعیه رسمی بازنشستگی ingress-nginx، تیم کوبرنتیز استفاده از Gateway API را به‌عنوان یکی از مسیرهای آینده مدیریت ترافیک معرفی کرده است. البته Gateway API جایگزین مستقیم و یک‌به‌یک Ingress نیست و معمولا مهاجرت به آن به بررسی دقیق معماری فعلی نیاز دارد.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 class="wp-block-heading" id="h-راه-اندازی-سریع-سرور-nginx-در-بازارچه-هم-روش">💡 راه‌اندازی سریع سرور NGINX در بازارچه هم‌روش</h3>



<p class="wp-block-paragraph"><br>✅ پرداخت به میزان استفاده (PAYG)<br>✅ بدون دغدغه نگهداری زیرساخت<br>✅ بکاپ خودکار روزانه</p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="wp-block-paragraph" id="h-"></p>



<p class="btn btn--main btn--wide wp-block-paragraph"><a href="https://console.hamravesh.com/marketplace/explore/oneclick_nginx" target="_blank" rel="noreferrer noopener">راه‌اندازی NGINX</a><a href="#"></a></p>
</div></div>
</div>



<h2 class="wp-block-heading" id="h-gateway-api-چرا-در-آینده-کوبرنتیز-اهمیت-بیشتری-پیدا-می-کند">Gateway API؛ چرا در آینده کوبرنتیز اهمیت بیشتری پیدا می‌کند؟</h2>



<p class="wp-block-paragraph"><a href="https://hamravesh.com/blog/what-is-kubernetes-gateway-api/" id="https://hamravesh.com/blog/what-is-kubernetes-gateway-api/" target="_blank" rel="noreferrer noopener">Gateway API در کوبرنتیز</a> مجموعه‌ای از APIهای جدید برای مدیریت ترافیک در کوبرنتیز است که با هدف ایجاد انعطاف‌پذیری بیشتر و پوشش سناریوهای پیچیده‌تر طراحی شده است. بسیاری از پروژه‌های جدید اکوسیستم کوبرنتیز هم توسعه خود را بر اساس این استاندارد انجام می‌دهند.</p>



<p class="wp-block-paragraph">یکی از دلایل توجه گسترده به Gateway API، رفع برخی محدودیت‌های مدل سنتی Ingress است. در این استاندارد، قابلیت‌هایی که پیش‌تر معمولاً از طریق Annotationهای اختصاصی هر Ingress Controller پیاده‌سازی می‌شدند، به‌صورت استاندارد و قابل حمل تعریف می‌شوند. همچنین تفکیک مسئولیت‌ها بین تیم‌های زیرساخت و توسعه ساده‌تر شده و امکان مدیریت سناریوهای پیچیده‌تر ترافیک فراهم می‌شود.</p>



<p class="wp-block-paragraph">البته این موضوع به معنای حذف Ingress API نیست. در واقع Ingress همچنان بخشی از کوبرنتیز  محسوب می‌شود و بسیاری از کلاسترها به استفاده از آن ادامه می‌دهند. با این حال، جهت‌گیری کلی اکوسیستم به سمت استفاده گسترده‌تر از Gateway API است و به همین دلیل بسیاری از سازمان‌ها هنگام برنامه‌ریزی برای مهاجرت از ingress nginx، این استاندارد را هم در ارزیابی‌های خود در نظر می‌گیرند.</p>



<h2 class="wp-block-heading" id="h-چرا-مهاجرت-از-ingress-nginx-همیشه-ساده-نیست">چرا مهاجرت از ingress-nginx همیشه ساده نیست؟</h2>



<p class="wp-block-paragraph">مهاجرت از ingress-nginx به یک کنترلر دیگر یا Gateway API، پیچیدگی‌های خاص خود را دارد و فراتر از تبدیل چند فایل YAML است. طی سال‌های گذشته، ingress-nginx رفتارها و قابلیت‌های خاصی را از طریق Annotationها و تنظیمات اختصاصی ارائه کرده که بخشی از استاندارد کوبرنتیز نیستند و احتمالا در راهکارهای دیگر باید به شکل متفاوت یا بدون معادل مستقیم پیاده‌سازی شوند. حتی اگر تبدیلات ظاهرا درست انجام شوند، ممکن است رفتار سرویس‌ها تغییر کند یا اختلالی ایجاد شود. بر اساس مستندات رسمی کوبرنتیز، هنگام مهاجرت باید به موارد زیر توجه ویژه داشت:</p>



<ul class="wp-block-list">
<li>پردازش مسیرهای مبتنی بر Regular Expression</li>



<li>تاثیر Annotationهای اختصاصی مانند use-regex</li>



<li>رفتار وابسته به rewrite-target</li>



<li>مدیریت مسیرهای دارای یا فاقد / انتهایی</li>



<li>تفاوت در URL Normalization</li>
</ul>



<p class="wp-block-paragraph">این موارد ممکن است در کنترلر جدید یا پیاده‌سازی‌های Gateway API به شکل متفاوتی عمل کنند، بنابراین قبل از انتقال کامل ترافیک، تنظیمات جدید باید به‌دقت بررسی و آزمایش شوند. جامعه کوبرنتیز ابزارهایی برای ساده‌تر کردن این فرایند توسعه داده است که در بخش بعدی به مهم‌ترین آن‌ها، یعنی Ingress2Gateway، می‌پردازیم.</p>



<h2 class="wp-block-heading" id="h-مهاجرت-واقعی-و-ابزارها-آموزش-عملی-با-ingress2gateway">مهاجرت واقعی و ابزارها؛ آموزش عملی با Ingress2Gateway</h2>



<p class="wp-block-paragraph">تا اینجا دیدیم که مهاجرت از ingress-nginx همیشه یک تبدیل ساده و یک‌به‌یک نیست. در واقع تفاوت در Annotationها، رفتارهای خاص این کنترلر و تفاوت معماری Gateway API باعث می‌شود که انتقال بدون برنامه‌ریزی، ریسک ایجاد اختلال در سرویس را به همراه داشته باشد.</p>



<p class="wp-block-paragraph">تیم SIG Network ابزار رسمی Ingress2Gateway را معرفی کرده است. در مستندات رسمی، این ابزار به‌عنوان یک Migration Assistant یا دستیار مهاجرت معرفی می‌شود&nbsp;که می‌تواند بررسی Ingressهای فعلی را انجام دهد و آن‌ها را تا حد امکان به Gateway API تبدیل کند. همچنین می‌تواند در عین حال، در مورد بخش‌هایی که نیاز به بازبینی دستی دارند به شما هشدار ‌دهد. به طور کلی، Ingress2Gateway سه هدف اصلی زیر را دنبال می‌کند:&nbsp;</p>



<ul class="wp-block-list">
<li><strong>تبدیل پیکربندی: </strong>ترجمه Ingressها و Annotationهای پشتیبانی‌شده به Gateway API</li>



<li><strong>شناسایی مشکلات: </strong>تشخیص تنظیماتی که معادل مستقیمی ندارند</li>



<li><strong>ارائه پیشنهاد: </strong>اعلام هشدارها و پیشنهاد برای اصلاح دستی</li>
</ul>



<h3 class="wp-block-heading" id="h-نسخه-۱-۰-چه-قابلیت-هایی-دارد">نسخه ۱.۰ چه قابلیت‌هایی دارد؟</h3>



<p class="wp-block-paragraph">نسخه ۱.۰ که در مارس ۲۰۲۶ منتشر شد، نسبت به نسخه‌های قبلی پیشرفت قابل توجهی داشته است. مهم‌ترین تغییرات این نسخه عبارت‌اند از:</p>



<ul class="wp-block-list">
<li>پشتیبانی از بیش از ۳۰ Annotation رایج ingress-nginx&nbsp;</li>



<li>پشتیبانی از قابلیت‌هایی مانند CORS ،Backend TLS ،Regex Matching و Path Rewrite&nbsp;</li>



<li>تست‌های یکپارچگی برای اطمینان از یکسان بودن رفتار Ingress-NGINX و Gateway API&nbsp;</li>



<li>سیستم هشدار و گزارش‌دهی برای بخش‌هایی که قابل ترجمه نیستند</li>
</ul>



<h3 class="wp-block-heading" id="h-مرحله-اول-نصب-ingress2gateway">مرحله اول: نصب Ingress2Gateway</h3>



<p class="wp-block-paragraph">برای استفاده از این ابزار، ابتدا باید آن را نصب کنید. اگر روی سیستم خود محیط Go را دارید، می‌توانید با دستور زیر آخرین نسخه پایدار را نصب کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>go install github.com/kubernetes-sigs/ingress2gateway@v1.0.0</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">go</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">github.com/kubernetes-sigs/ingress2gateway@v1.0.0</span></span></code></pre></div>



<p class="wp-block-paragraph">اگر از macOS و Homebrew استفاده می‌کنید، دستور نصب آن ساده‌تر است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew install ingress2gateway</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">brew</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ingress2gateway</span></span></code></pre></div>



<p class="wp-block-paragraph">همچنین امکان دانلود فایل باینری از <a href="https://github.com/kubernetes-sigs/ingress2gateway/releases/tag/v1.0.0" id="https://github.com/kubernetes-sigs/ingress2gateway/releases/tag/v1.0.0">GitHub</a> یا <a href="https://github.com/kubernetes-sigs/ingress2gateway/" id="https://github.com/kubernetes-sigs/ingress2gateway/">کامپایل ابزار از سورس</a> هم وجود دارد.</p>



<h3 class="wp-block-heading" id="h-مرحله-دوم-اجرای-ingress2gateway">مرحله دوم: اجرای Ingress2Gateway</h3>



<p class="wp-block-paragraph">پس از نصب می‌توانید مانیفست‌های Ingress را به Ingress2Gateway ارسال کنید، یا ابزار را مستقیما از کلاستر خود بخوانید.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ارسال به فایل
ingress2gateway print --input-file my-manifest.yaml,my-other-manifest.yaml --providers=ingress-nginx > gwapi.yaml
# استفاده از فضای نام در کلاستر خودتان
ingress2gateway print --namespace my-api --providers=ingress-nginx > gwapi.yaml
# یا برای کل کلاستر
ingress2gateway print --providers=ingress-nginx --all-namespaces > gwapi.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390"># ارسال به فایل</span></span>
<span class="line"><span style="color: #F69D50">ingress2gateway</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">print</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--input-file</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-manifest.yaml,my-other-manifest.yaml</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--providers=ingress-nginx</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gwapi.yaml</span></span>
<span class="line"><span style="color: #768390"># استفاده از فضای نام در کلاستر خودتان</span></span>
<span class="line"><span style="color: #F69D50">ingress2gateway</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">print</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-api</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--providers=ingress-nginx</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gwapi.yaml</span></span>
<span class="line"><span style="color: #768390"># یا برای کل کلاستر</span></span>
<span class="line"><span style="color: #F69D50">ingress2gateway</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">print</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--providers=ingress-nginx</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--all-namespaces</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gwapi.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph">نکته: همچنین می‌توانید <code>--emitter &lt;agentgateway|envoy-gateway|kgateway&gt;</code> را برای خروجی پسوندهای خاص پیاده‌سازی ارسال کنید.</p>



<h3 class="wp-block-heading" id="h-مرحله-سوم-بررسی-خروجی">مرحله سوم: بررسی خروجی</h3>



<p class="wp-block-paragraph">این مهم‌ترین مرحله است. دستورات بخش قبلی یک مانیفست Gateway API را در gwapi.yaml خروجی می‌دهند. همچنین هشدارهایی منتشر می‌کنند که توضیح می‌دهند چه چیزی دقیقا ترجمه نشده است و چه چیزی را باید به صورت دستی مرور کنید.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  annotations:
    gateway.networking.k8s.io/generator: ingress2gateway-dev
  name: nginx
  namespace: my-ns
spec:
  gatewayClassName: nginx
  listeners:
  - hostname: my-host.example.com
    name: my-host-example-com-http
    port: 80
    protocol: HTTP
  - hostname: my-host.example.com
    name: my-host-example-com-https
    port: 443
    protocol: HTTPS
    tls:
      certificateRefs:
      - group: ""
        kind: Secret
        name: my-secret
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  annotations:
    gateway.networking.k8s.io/generator: ingress2gateway-dev
  name: my-ingress-my-host-example-com
  namespace: my-ns
spec:
  hostnames:
  - my-host.example.com
  parentRefs:
  - name: nginx
    port: 443
  rules:
  - backendRefs:
    - name: website-service
      port: 80
    filters:
    - cors:
        allowCredentials: true
        allowHeaders:
        - DNT
        - Keep-Alive
        - User-Agent
        - X-Requested-With
        - If-Modified-Since
        - Cache-Control
        - Content-Type
        - Range
        - Authorization
        allowMethods:
        - GET
        - PUT
        - POST
        - DELETE
        - PATCH
        - OPTIONS
        allowOrigins:
        - '*'
        maxAge: 1728000
      type: CORS
    matches:
    - path:
        type: RegularExpression
        value: (?i)/users/(\d+).*
    name: rule-0
    timeouts:
      request: 10s
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  annotations:
    gateway.networking.k8s.io/generator: ingress2gateway-dev
  name: my-ingress-my-host-example-com-ssl-redirect
  namespace: my-ns
spec:
  hostnames:
  - my-host.example.com
  parentRefs:
  - name: nginx
    port: 80
  rules:
  - filters:
    - requestRedirect:
        scheme: https
        statusCode: 308
      type: RequestRedirect</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">apiVersion:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #F69D50">kind:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Gateway</span></span>
<span class="line"><span style="color: #F69D50">metadata:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">annotations:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">gateway.networking.k8s.io/generator:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ingress2gateway-dev</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">namespace:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ns</span></span>
<span class="line"><span style="color: #F69D50">spec:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">gatewayClassName:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">listeners:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">hostname:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host.example.com</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host-example-com-http</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">80</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">protocol:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">HTTP</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">hostname:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host.example.com</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host-example-com-https</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">443</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">protocol:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">HTTPS</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">tls:</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">certificateRefs:</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">group:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">kind:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Secret</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-secret</span></span>
<span class="line"><span style="color: #F69D50">---</span></span>
<span class="line"><span style="color: #F69D50">apiVersion:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #F69D50">kind:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">HTTPRoute</span></span>
<span class="line"><span style="color: #F69D50">metadata:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">annotations:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">gateway.networking.k8s.io/generator:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ingress2gateway-dev</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ingress-my-host-example-com</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">namespace:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ns</span></span>
<span class="line"><span style="color: #F69D50">spec:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">hostnames:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host.example.com</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">parentRefs:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">443</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">rules:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">backendRefs:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">website-service</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">80</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">filters:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">cors:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowCredentials:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">true</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowHeaders:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">DNT</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Keep-Alive</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">User-Agent</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">X-Requested-With</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">If-Modified-Since</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Cache-Control</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Content-Type</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Range</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Authorization</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowMethods:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">GET</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">PUT</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">POST</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">DELETE</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">PATCH</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">OPTIONS</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowOrigins:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;*&#39;</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">maxAge:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1728000</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #6CB6FF">type</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">CORS</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">matches:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">path:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #6CB6FF">type</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">RegularExpression</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">value:</span><span style="color: #ADBAC7"> (?i)/users/(</span><span style="color: #F69D50">\d+</span><span style="color: #ADBAC7">).</span><span style="color: #F47067">*</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">rule-0</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">timeouts:</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">request:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">10</span><span style="color: #96D0FF">s</span></span>
<span class="line"><span style="color: #F69D50">---</span></span>
<span class="line"><span style="color: #F69D50">apiVersion:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #F69D50">kind:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">HTTPRoute</span></span>
<span class="line"><span style="color: #F69D50">metadata:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">annotations:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">gateway.networking.k8s.io/generator:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ingress2gateway-dev</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ingress-my-host-example-com-ssl-redirect</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">namespace:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ns</span></span>
<span class="line"><span style="color: #F69D50">spec:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">hostnames:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host.example.com</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">parentRefs:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">80</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">rules:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">filters:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">requestRedirect:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">scheme:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">https</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">statusCode:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">308</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #6CB6FF">type</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">RequestRedirect</span></span></code></pre></div>



<p class="wp-block-paragraph">همان‌طور که در بالا مشاهده کردید، Ingress2Gateway با موفقیت برخی annotationها را به معادل‌های Gateway API خود ترجمه کرد. به عنوان مثال، <code>nginx.ingress.kubernetes.io/enable-cors</code> به یک فیلتر CORS ترجمه شد، اما با بررسی دقیق‌تر، annotationهای <code>nginx.ingress.kubernetes.io/proxy-{read,send}-timeout</code> و <code>nginx.ingress.kubernetes.io/proxy-body-size</code> کاملا نگاشت نمی‌شوند. لاگ‌ها دلیل این حذفیات و همچنین استدلال پشت ترجمه را نشان می‌دهند.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Plaintext</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>┌─ WARN  ────────────────────────────────────────
│  Unsupported annotation nginx.ingress.kubernetes.io/configuration-snippet
│  source: INGRESS-NGINX
│  object: Ingress: my-ns/my-ingress
└─
┌─ INFO  ────────────────────────────────────────
│  Using case-insensitive regex path matches. You may want to change this.
│  source: INGRESS-NGINX
│  object: HTTPRoute: my-ns/my-ingress-my-host-example-com
└─
┌─ WARN  ────────────────────────────────────────
│  ingress-nginx only supports TCP-level timeouts; i2gw has made a best-effort translation to Gateway API timeouts.request. Please verify that this meets your needs. See documentation: https://gateway-api.sigs.k8s.io/guides/http-timeouts/
│  source: INGRESS-NGINX
│  object: HTTPRoute: my-ns/my-ingress-my-host-example-com
└─
┌─ WARN  ────────────────────────────────────────
│  Failed to apply my-ns.my-ingress.metadata.annotations."nginx.ingress.kubernetes.io/proxy-body-size" from my-ns/my-ingress: Most Gateway API implementations have reasonable body size and buffering defaults
│  source: STANDARD_EMITTER
│  object: HTTPRoute: my-ns/my-ingress-my-host-example-com
└─
┌─ WARN  ────────────────────────────────────────
│  Gateway API does not support configuring URL normalization (RFC 3986, Section 6). Please check if this matters for your use case and consult implementation-specific details.
│  source: STANDARD_EMITTER
└─</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #adbac7">┌─ WARN  ────────────────────────────────────────</span></span>
<span class="line"><span style="color: #adbac7">│  Unsupported annotation nginx.ingress.kubernetes.io/configuration-snippet</span></span>
<span class="line"><span style="color: #adbac7">│  source: INGRESS-NGINX</span></span>
<span class="line"><span style="color: #adbac7">│  object: Ingress: my-ns/my-ingress</span></span>
<span class="line"><span style="color: #adbac7">└─</span></span>
<span class="line"><span style="color: #adbac7">┌─ INFO  ────────────────────────────────────────</span></span>
<span class="line"><span style="color: #adbac7">│  Using case-insensitive regex path matches. You may want to change this.</span></span>
<span class="line"><span style="color: #adbac7">│  source: INGRESS-NGINX</span></span>
<span class="line"><span style="color: #adbac7">│  object: HTTPRoute: my-ns/my-ingress-my-host-example-com</span></span>
<span class="line"><span style="color: #adbac7">└─</span></span>
<span class="line"><span style="color: #adbac7">┌─ WARN  ────────────────────────────────────────</span></span>
<span class="line"><span style="color: #adbac7">│  ingress-nginx only supports TCP-level timeouts; i2gw has made a best-effort translation to Gateway API timeouts.request. Please verify that this meets your needs. See documentation: https://gateway-api.sigs.k8s.io/guides/http-timeouts/</span></span>
<span class="line"><span style="color: #adbac7">│  source: INGRESS-NGINX</span></span>
<span class="line"><span style="color: #adbac7">│  object: HTTPRoute: my-ns/my-ingress-my-host-example-com</span></span>
<span class="line"><span style="color: #adbac7">└─</span></span>
<span class="line"><span style="color: #adbac7">┌─ WARN  ────────────────────────────────────────</span></span>
<span class="line"><span style="color: #adbac7">│  Failed to apply my-ns.my-ingress.metadata.annotations.&quot;nginx.ingress.kubernetes.io/proxy-body-size&quot; from my-ns/my-ingress: Most Gateway API implementations have reasonable body size and buffering defaults</span></span>
<span class="line"><span style="color: #adbac7">│  source: STANDARD_EMITTER</span></span>
<span class="line"><span style="color: #adbac7">│  object: HTTPRoute: my-ns/my-ingress-my-host-example-com</span></span>
<span class="line"><span style="color: #adbac7">└─</span></span>
<span class="line"><span style="color: #adbac7">┌─ WARN  ────────────────────────────────────────</span></span>
<span class="line"><span style="color: #adbac7">│  Gateway API does not support configuring URL normalization (RFC 3986, Section 6). Please check if this matters for your use case and consult implementation-specific details.</span></span>
<span class="line"><span style="color: #adbac7">│  source: STANDARD_EMITTER</span></span>
<span class="line"><span style="color: #adbac7">└─</span></span></code></pre></div>



<p class="wp-block-paragraph">یک هشدار وجود دارد که Ingress2Gateway از annotation نوع <code>nginx.ingress.kubernetes.io/configuration-snippet</code> پشتیبانی نمی‌کند. برای دیدن اینکه آیا راهی برای دستیابی به رفتار معادل وجود دارد، باید مستندات پیاده‌سازی Gateway API خود را بررسی کنید.</p>



<p class="wp-block-paragraph">این ابزار همچنین به ما اطلاع داد که تطابق‌های ریجکس Ingress-NGINX تطابق‌های پیشوندی غیر حساس به حروف کوچک و بزرگ هستند. به همین دلیل یک الگوی تطابق <code>(?i)/users/(\d+).*</code> وجود دارد. بیشتر سازمان‌ها می‌خواهند این رفتار را با حذف <code>(?i)</code> ابتدایی و <code>.*</code> انتهایی از الگوی مسیر به یک تطابق دقیق و حساس به حروف کوچک و بزرگ تغییر دهند.</p>



<p class="wp-block-paragraph">Ingress2Gateway ترجمه‌ای با بهترین تلاش از annotationهای <code>nginx.ingress.kubernetes.io/proxy-{send,read}-timeout</code> به یک زمان انتظار درخواست ۱۰ ثانیه در مسیر HTTP ما انجام داد. اگر درخواست‌های این سرویس باید بسیار کوتاه‌تر باشد (مثلا ۳ ثانیه)، می‌توانید تغییرات مربوطه را در مانیفست‌های Gateway API خود اعمال کنید.</p>



<p class="wp-block-paragraph">همچنین، <code>nginx.ingress.kubernetes.io/proxy-body-size</code> معادل Gateway API ندارد، بنابراین ترجمه نشده است. البته با این حال، بیشتر پیاده‌سازی‌های Gateway API، پیش‌فرض‌های معقولی برای حداکثر اندازه بدنه و بافرینگ دارند، بنابراین این موضوع، ممکن است در عمل مشکلی ایجاد نکند.</p>



<p class="wp-block-paragraph">علاوه بر این، برخی emitterها ممکن است پشتیبانی از این annotation را از طریق پسوندهای خاص پیاده‌سازی ارائه دهند. به عنوان مثال، افزودن فلگ <code>--emitter agentgateway</code> یا <code>--emitter envoy-gateway</code> یا <code>--emitter kgateway</code> به دستور <code>ingress2gateway print</code> قبلی منجر به پیکربندی خاص پیاده‌سازی اضافی در مانیفست‌های Gateway API تولید شده می‌شد که سعی در ثبت پیکربندی اندازه بدنه (body size) داشت. </p>



<p class="wp-block-paragraph">همچنین یک هشدار در مورد نرمالایز کردن URL می‌بینیم. پیاده‌سازی‌های Gateway API مانند Agentgateway ،Envoy Gateway ،Kgateway و Istio دارای سطحی از عادی‌سازی URL هستند؛ اما رفتار در پیاده‌سازی‌ها متفاوت است و از طریق Gateway API استاندارد قابل تنظیم نیست. شما باید رفتار عادی‌سازی URL پیاده‌سازی Gateway API خود را بررسی و آزمایش کنید تا مطمئن شوید با مورد استفاده شما سازگار است.</p>



<p class="wp-block-paragraph">همچنین برای مطابقت با رفتار پیش‌فرض Ingress-NGINX، ابزار  Ingress2Gateway یک شنونده در پورت ۸۰ و یک فیلتر تغییر مسیر درخواست HTTP برای هدایت ترافیک HTTP به HTTPS اضافه کرد. ممکن است اصلا نخواهید به ترافیک HTTP سرویس بدهید و شنونده پورت ۸۰ و HTTPRoute مربوطه را حذف کنید.</p>



<p class="wp-block-paragraph"><strong>هشدار: </strong>همیشه خروجی و لاگ‌های تولید شده را به طور کامل مرور کنید.</p>



<p class="wp-block-paragraph">پس از اعمال دستی این تغییرات، مانیفست‌های Gateway API ممکن است به شکل زیر باشد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  annotations:
    gateway.networking.k8s.io/generator: ingress2gateway-dev
  name: nginx
  namespace: my-ns
spec:
  gatewayClassName: nginx
  listeners:
  - hostname: my-host.example.com
    name: my-host-example-com-https
    port: 443
    protocol: HTTPS
    tls:
      certificateRefs:
      - group: ""
        kind: Secret
        name: my-secret
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  annotations:
    gateway.networking.k8s.io/generator: ingress2gateway-dev
  name: my-ingress-my-host-example-com
  namespace: my-ns
spec:
  hostnames:
  - my-host.example.com
  parentRefs:
  - name: nginx
    port: 443
  rules:
  - backendRefs:
    - name: website-service
      port: 80
    filters:
    - cors:
        allowCredentials: true
        allowHeaders:
        - DNT
        ...
        allowMethods:
        - GET
        ...
        allowOrigins:
        - '*'
        maxAge: 1728000
      type: CORS
    matches:
    - path:
        type: RegularExpression
        value: /users/(\d+)
    name: rule-0
    timeouts:
      request: 3s</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">---</span></span>
<span class="line"><span style="color: #F69D50">apiVersion:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #F69D50">kind:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Gateway</span></span>
<span class="line"><span style="color: #F69D50">metadata:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">annotations:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">gateway.networking.k8s.io/generator:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ingress2gateway-dev</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">namespace:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ns</span></span>
<span class="line"><span style="color: #F69D50">spec:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">gatewayClassName:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">listeners:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">hostname:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host.example.com</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host-example-com-https</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">443</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">protocol:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">HTTPS</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">tls:</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">certificateRefs:</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">group:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">kind:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">Secret</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-secret</span></span>
<span class="line"><span style="color: #F69D50">---</span></span>
<span class="line"><span style="color: #F69D50">apiVersion:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #F69D50">kind:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">HTTPRoute</span></span>
<span class="line"><span style="color: #F69D50">metadata:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">annotations:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">gateway.networking.k8s.io/generator:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ingress2gateway-dev</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ingress-my-host-example-com</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">namespace:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-ns</span></span>
<span class="line"><span style="color: #F69D50">spec:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">hostnames:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">my-host.example.com</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">parentRefs:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nginx</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">443</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">rules:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">backendRefs:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">website-service</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">port:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">80</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">filters:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">cors:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowCredentials:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">true</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowHeaders:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">DNT</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #6CB6FF">...</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowMethods:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">GET</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #6CB6FF">...</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">allowOrigins:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;*&#39;</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">maxAge:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1728000</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #6CB6FF">type</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">CORS</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">matches:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">-</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">path:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #6CB6FF">type</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">RegularExpression</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #F69D50">value:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/users/</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">\d+</span><span style="color: #ADBAC7">)</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">name:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">rule-0</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #F69D50">timeouts:</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #F69D50">request:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #96D0FF">s</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-مرحله-چهارم-بازبینی-verify">مرحله چهارم: بازبینی (Verify)</h3>



<p class="wp-block-paragraph">اکنون که مانیفست‌های Gateway API را دارید، باید آنها را به طور کامل در یک کلاستر توسعه آزمایش کنید. در این مورد، حداقل باید بررسی کنید که پیش‌فرض‌های حداکثر اندازه بدنه پیاده‌سازی Gateway API برای شما مناسب است و تأیید کنید که زمان انتظار ۳ ثانیه کافی است.</p>



<p class="wp-block-paragraph">پس از تایید رفتار در یک کلاستر توسعه، پیکربندی Gateway API خود را در کنار Ingress موجود خود مستقر کنید. پیشنهاد می‌کنیم که ترافیک را با استفاده از DNS وزن‌دار، لود بالانسر ابری خود یا ویژگی‌های تقسیم ترافیک پلتفرم خود به تدریج تغییر دهید. به این ترتیب، می‌توانید به سرعت، هرگونه پیکربندی اشتباهی را که از تست‌های شما عبور کرده است، بازیابی کنید.</p>



<p class="wp-block-paragraph">در نهایت، پس از انتقال کامل ترافیک به کنترلر Gateway API، ابتدا منابع Ingress را حذف و سپس کنترلر Ingress قدیمی را uninstall کنید.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p class="wp-block-paragraph">مهم‌ترین نکته این است که مهاجرت از ingress-nginx را نباید به زمانی موکول کرد که یک آسیب‌پذیری یا ناسازگاری عملیاتی شما را مجبور به تغییر کند. هرچه وابستگی به ingress-nginx بیشتر شود، هزینه و پیچیدگی مهاجرت نیز افزایش خواهد یافت.</p>



<p class="wp-block-paragraph">گزینه‌های جایگزین شامل Traefik ،Envoy Gateway ،Kong Gateway و NGINX Gateway Fabric هستند و مسیر آینده اکوسیستم، Gateway API است. با برنامه‌ریزی درست، بررسی زیرساخت، اصلاح مانیفست‌ها و تست در محیط توسعه، می‌توانید مهاجرت تدریجی و امن را انجام دهید و بدون اختلال سرویس‌ها، به معماری مدرن کوبرنتیز برسید.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/ingress-nginx-retirement/">بازنشستگی Ingress NGINX؛ ریسک‌ها، جایگزین‌ها و مسیر مهاجرت</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/ingress-nginx-retirement/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>RBAC در کوبرنتیز چیست؟ آشنایی با اجزا و روش‌های پیاده‌سازی</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-rbac/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-rbac/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 27 May 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5199</guid>

					<description><![CDATA[<p>RBAC در کوبرنتیز یکی از اصلی‌ترین مکانیزم‌های کنترل دسترسی در کوبرنتیز است که تعیین می‌کند هر کاربر، سرویس یا برنامه چه عملیاتی را روی منابع کلاستر می‌تواند انجام دهد. این سیستم با تکیه بر نقش‌ها (Role و ClusterRole) و اتصال آن‌ها به هویت‌ها (RoleBinding و ClusterRoleBinding)، لایه Authorization در API Server را مدیریت می‌کند و [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-rbac/">RBAC در کوبرنتیز چیست؟ آشنایی با اجزا و روش‌های پیاده‌سازی</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">RBAC در کوبرنتیز یکی از اصلی‌ترین مکانیزم‌های کنترل دسترسی در کوبرنتیز است که تعیین می‌کند هر کاربر، سرویس یا برنامه چه عملیاتی را روی منابع کلاستر می‌تواند انجام دهد. این سیستم با تکیه بر نقش‌ها (Role و ClusterRole) و اتصال آن‌ها به هویت‌ها (RoleBinding و ClusterRoleBinding)، لایه Authorization در API Server را مدیریت می‌کند و نقش کلیدی در پیاده‌سازی اصل حداقل سطح دسترسی دارد. در این مقاله، ساختار، نحوه عملکرد، اجزای اصلی، مثال عملی پیاده‌سازی و محدودیت‌های RBAC کوبرنتیز را به‌صورت دقیق بررسی می‌کنیم.</p>



<h2 class="wp-block-heading" id="h-rbac-در-کوبرنتیز-چیست">RBAC در کوبرنتیز چیست؟</h2>



<p class="wp-block-paragraph">RBAC مخفف Role-Based Access Control یا «کنترل دسترسی مبتنی بر نقش» است. این مکانیزم امنیتی در کوبرنتیز مشخص می‌کند که هر کاربر، سرویس یا برنامه چه عملیاتی را روی کدام منابع کلاستر می‌تواند انجام دهد.</p>



<p class="wp-block-paragraph">در کوبرنتیز، تمام درخواست‌ها از طریق API Server پردازش می‌شوند و سیستم RBAC کوبرنتیز وظیفه دارد سطح دسترسی این درخواست‌ها را کنترل کند. به‌کمک این مکانیزم می‌توان تعیین کرد که یک هویت مشخص چه منابعی را مشاهده کند، چه عملیاتی انجام دهد و این دسترسی در کدام Namespace یا در سطح کل کلاستر معتبر باشد. برای مثال، با استفاده از RBAC در کوبرنتیز می‌توان به یک توسعه‌دهنده فقط اجازه مشاهده Podها در Namespace توسعه (Dev) را داد؛ بدون اینکه به منابع محیط Production دسترسی داشته باشد.</p>



<p class="wp-block-paragraph">سیستم RBAC کوبرنتیز فقط برای کاربران انسانی استفاده نمی‌شود و برنامه‌ها و Podهای داخل کلاستر نیز از طریق Service Accountها با همین مکانیزم احراز دسترسی می‌شوند.</p>



<p class="wp-block-paragraph">به‌طور کلی، RBAC استانداردترین روش مدیریت دسترسی کاربران در کوبرنتیز است و نقش مهمی در پیاده‌سازی اصل Least Privilege یا «حداقل سطح دسترسی» دارد.</p>



<h2 class="wp-block-heading" id="h-تفاوت-authentication-و-authorization-در-kubernetes"><a></a>تفاوت Authentication و Authorization در Kubernetes</h2>



<p class="wp-block-paragraph">برای درک جایگاه RBAC در کوبرنتیز، ابتدا باید تفاوت Authentication (احراز هویت) و Authorization (تعیین سطح دسترسی) را بدانید. هر درخواستی که به API Server کلاستر ارسال می‌شود، ابتدا هویت فرستنده را بررسی می‌کند و سپس سطح دسترسی او را می‌سنجد.</p>



<p class="wp-block-paragraph"><strong>مرحله اول، Authentication: </strong>کوبرنتیز مشخص می‌کند درخواست از طرف چه کاربری، سرویس یا برنامه‌ای ارسال شده است. این فرایند معمولاً با استفاده از توکن‌ها، Client Certificateها یا سرویس‌های هویت خارجی انجام می‌شود. اگر هویت فرستنده تأیید نشود، درخواست با خطای HTTP 401 Unauthorized رد خواهد شد.</p>



<p class="wp-block-paragraph"><strong>مرحله دوم، Authorization: </strong>پس از تأیید هویت، مرحله Authorization یا آغاز می‌شود. در این مرحله، کوبرنتیز بررسی می‌کند که آیا این هویت، اجازه انجام عملیات موردنظر را دارد یا خیر. اینجاست که RBAC کوبرنتیز وارد عمل می‌شود و بر اساس Roleها و Bindingهای تعریف‌شده، مجوز دسترسی را صادر یا رد می‌کند. در صورت نداشتن مجوز کافی، درخواست با خطای HTTP 403 Forbidden مواجه می‌شود.</p>



<p class="wp-block-paragraph">برای درک بهتر تفاوت این دو لایه امنیتی، جدول زیر را ببینید:<br></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>ویژگی</strong><strong></strong></td><td><strong>Authentication</strong><strong> (احراز هویت)</strong><strong></strong></td><td><strong>Authorization</strong><strong> (تعیین سطح دسترسی)</strong><strong></strong></td></tr><tr><td>سؤال اصلی</td><td>شما چه کسی هستید؟ (تشخیص هویت)</td><td>مجاز به انجام دادن چه کاری هستید؟ (بررسی مجوز)</td></tr><tr><td>زمان اجرا</td><td>مرحله ۱: قبل از بررسی دسترسی‌ها</td><td>مرحله ۲: پس از تأیید هویت</td></tr><tr><td>وظیفه اصلی</td><td>شناسایی هویت کاربر یا سرویس</td><td>بررسی مجوز عملیات</td></tr><tr><td>کد وضعیت HTTP در صورت شکست</td><td>401 Unauthorized</td><td>403 Forbidden</td></tr><tr><td>ورودی‌های سیستم</td><td>هدرهای HTTP، گواهی کلاینت، توکن‌ها</td><td>نام کاربر، نوع عملیات (Action)، منبع مورد نظر (Object)</td></tr><tr><td>خروجی فرایند</td><td>استخراج نام کاربری (Username) یا شناسه گروه</td><td>صدور اجازه دسترسی (Allow) یا رد آن (Deny)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading" id="h-اجزای-اصلی-rbac-در-کوبرنتیز">اجزای اصلی RBAC در کوبرنتیز</h2>



<p class="wp-block-paragraph">سیستم RBAC در کوبرنتیز از چند جزء اصلی تشکیل شده است که در کنار هم مشخص می‌کنند چه هویتی چه عملیاتی را روی کدام منابع می‌تواند انجام دهد. این اجزا عبارت‌اند از:</p>



<h3 class="wp-block-heading">Role</h3>



<p class="wp-block-paragraph">Role مجموعه‌ای از مجوزهاست که دسترسی به منابع را در یک <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/" type="link" id="https://hamravesh.com/blog/what-is-kubernetes-namespace/" target="_blank" rel="noreferrer noopener">Namespace در کوبرنتیز</a> تعریف می‌کند. با استفاده از Role می‌توان مشخص کرد که یک کاربر یا Service Account چه عملیاتی را روی منابع کوبرنتیز انجام دهد.</p>



<h3 class="wp-block-heading">ClusterRole</h3>



<p class="wp-block-paragraph">ClusterRole نیز مجموعه‌ای از مجوزها را تعریف می‌کند، اما در سطح کل کلاستر قابل استفاده است و محدود به یک Namespace مشخص نیست.</p>



<h3 class="wp-block-heading">RoleBinding</h3>



<p class="wp-block-paragraph">RoleBinding یک Role را به یک کاربر، گروه یا Service Account متصل می‌کند. این اتصال فقط در همان Namespace معتبر است و مشخص می‌کند چه هویتی از مجوزهای تعریف‌شده در Role استفاده کند.</p>



<h3 class="wp-block-heading">ClusterRoleBinding</h3>



<p class="wp-block-paragraph">ClusterRoleBinding یک ClusterRole را در سطح کل کلاستر به کاربران، گروه‌ها یا Service Accountها متصل می‌کند. این نوع Binding معمولاً برای دسترسی‌های سراسری استفاده می‌شود.</p>



<h3 class="wp-block-heading">Subjects</h3>



<p class="wp-block-paragraph">Subjects همان هویت‌هایی هستند که مجوزها به آن‌ها اختصاص داده می‌شود. این هویت‌ها می‌توانند کاربران، گروه‌ها یا Service Accountهای داخل کلاستر باشند.</p>



<p class="wp-block-paragraph">در تنظیمات RBAC کوبرنتیز، هر Role یا ClusterRole معمولاً شامل فیلدهایی برای تعیین منابع و نوع دسترسی است. برای مثال، فیلد <code>verbs</code> مشخص می‌کند یک هویت چه عملیاتی مانند <code>get</code> ،<code>list</code> ،<code>create</code> یا <code>delete</code> را می‌تواند انجام دهد.</p>



<p class="wp-block-paragraph">همچنین فیلد <code>apiGroups</code> برای تعیین گروه API مربوط به هر منبع استفاده می‌شود. در منابع اصلی کوبرنتیز مانند Pod و Service معمولاً مقدار آن به‌صورت رشته خالی <code>""</code> نوشته می‌شود، اما برای منابعی مانند <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment/" type="link" id="https://hamravesh.com/blog/what-is-kubernetes-deployment/" target="_blank" rel="noreferrer noopener">Deployment در کوبرنتیز</a> از گروه‌هایی مانند <code>apps</code> استفاده می‌شود.</p>



<h2 class="wp-block-heading" id="h-تفاوت-role-و-clusterrole-مرز-میان-namespace-و-کلاستر">تفاوت Role و ClusterRole؛ مرز میان Namespace و کلاستر</h2>



<p class="wp-block-paragraph">اصلی‌ترین تفاوت Role و ClusterRole در Kubernetes، محدوده دسترسی یا Scope آن‌هاست. Role فقط در یک Namespace مشخص معتبر است و مجوزهای تعریف‌شده در آن خارج از همان Namespace اعمال نمی‌شوند. برای مثال، اگر کاربری در Namespace مربوط به محیط توسعه (dev) اجازه مشاهده پادها را داشته باشد، این دسترسی در Namespace محیط Production معتبر نخواهد بود.</p>



<p class="wp-block-paragraph">در مقابل، ClusterRole در سطح کل کلاستر عمل می‌کند و به یک Namespace محدود نیست. این نوع Role معمولاً برای منابعی استفاده می‌شود که وابسته به Namespace نیستند؛ مانند نودها یا PersistentVolumeها. همچنین می‌توان از ClusterRole برای تعریف دسترسی‌های یکسان در چند Namespace مختلف استفاده کرد.</p>



<p class="wp-block-paragraph">در عمل، Role و RoleBinding بیشتر برای مدیریت دسترسی‌های محدود در یک Namespace استفاده می‌شوند، درحالی‌که ClusterRole و ClusterRoleBinding برای دسترسی‌های سراسری در سطح کلاستر کاربرد دارند.</p>



<h2 class="wp-block-heading" id="h-نحوه-عملکرد-rbac-در-kubernetes"><a></a>نحوه عملکرد RBAC در Kubernetes</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="741" src="https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-rbac02-1024x741.webp" alt="نحوه عملکرد RBAC در Kubernetes" class="wp-image-5201" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-rbac02-1024x741.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-rbac02-300x217.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-rbac02-768x556.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-rbac02-150x108.webp 150w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-rbac02-120x87.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-rbac02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">یک کاربر یا Service Account از طریق Role یا ClusterRole و اتصال آن با RoleBinding یا ClusterRoleBinding، مجوز دسترسی به منابع API در سطح Namespace یا کل کلاستر را دریافت می‌کند.</figcaption></figure>



<p class="wp-block-paragraph">سیستم RBAC در کوبرنتیز برای بررسی دسترسی‌ها، هر درخواست را به‌صورت مرحله‌به‌مرحله ارزیابی می‌کند. زمانی که یک کاربر، Service Account یا برنامه درخواستی را به API Server ارسال می‌کند، کوبرنتیز مراحل زیر را برای تصمیم‌گیری طی می‌کند:</p>



<p class="wp-block-paragraph"><strong>گام ۱: شناسایی هویت درخواست‌کننده</strong></p>



<p class="wp-block-paragraph">در ابتدا کوبرنتیز مشخص می‌کند درخواست از طرف چه هویتی ارسال شده است. این هویت می‌تواند یک کاربر، گروه یا Service Account باشد.</p>



<p class="wp-block-paragraph" id="h-گام-۲-بررسی-rol-eها-و-clusterroleها"><strong>گام ۲: بررسی Rol‍eها و ClusterRoleها</strong></p>



<p class="wp-block-paragraph">پس از شناسایی هویت، کوبرنتیز Roleها و ClusterRoleهای تعریف‌شده را بررسی می‌کند تا مشخص شود چه مجوزهایی برای آن هویت وجود دارد.</p>



<p class="wp-block-paragraph"><strong>گام ۳: بررسی Bindingها</strong></p>



<p class="wp-block-paragraph">در ادامه، کوبرنتیز بررسی می‌کند که آیا Role یا ClusterRole موردنظر از طریق RoleBinding یا ClusterRoleBinding به آن کاربر یا Service Account متصل شده است یا خیر.</p>



<p class="wp-block-paragraph"><strong>گام ۴: تطبیق درخواست با مجوزها</strong></p>



<p class="wp-block-paragraph">در این مرحله، کوبرنتیز نوع عملیات درخواستی (مانند <code>get</code> ،<code>list</code> یا <code>delete</code>) و منبع هدف (مانند Pod یا Service) را با قوانین تعریف‌شده در RBAC تطبیق می‌دهد.</p>



<p class="wp-block-paragraph"><strong>گام ۵: صدور نتیجه نهایی</strong></p>



<p class="wp-block-paragraph">اگر مجوز لازم وجود داشته باشد، درخواست تأیید می‌شود و کاربر به منبع موردنظر دسترسی پیدا می‌کند. در غیر این صورت، کوبرنتیز درخواست را با خطای <code>403 Forbidden</code> رد می‌کند.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 class="wp-block-heading" id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده، بر بستر ابر اختصاصی یا به صورت On-premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a href="https://hamravesh.com/managed-kubernetes" type="link" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز مدیریت‌شده</a></p>
</div></div>
</div>



<h2 class="wp-block-heading" id="h-آموزش-عملی-پیاده-سازی-rbac-در-کوبرنتیز-به-همراه-کد"><a></a>آموزش عملی پیاده‌سازی RBAC در کوبرنتیز (به همراه کد)</h2>



<p class="wp-block-paragraph">در این مثال، یک Service Account ایجاد می‌کنیم که فقط اجازه مشاهده Serviceها و ConfigMapها را در یک Namespace مشخص داشته باشد.</p>



<p class="wp-block-paragraph" id="h-گام-۱-ایجاد-namespace-و-service-account"><strong>گام ۱: ایجاد Namespace و Service Account</strong></p>



<p class="wp-block-paragraph">ابتدا یک Namespace و سپس یک Service Account اختصاصی ایجاد می‌کنیم:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create namespace random-numbers
kubectl create sa random-numbers-sa -n random-numbers</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">create</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">random-numbers</span></span>
<span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">create</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">sa</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">random-numbers-sa</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-n</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">random-numbers</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>گام ۲: تعریف Role</strong></p>



<p class="wp-block-paragraph">در این مرحله، یک Role در فایلی به نام فایل به نام role.yaml می‌سازیم که فقط دسترسی <code>get</code> و <code>list</code> را روی Serviceها و ConfigMapها داشته باشد.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: random-numbers
  name: client-access-role
rules:
- apiGroups: &#91;""&#93;
  resources:
    - configmaps
    - services
  verbs:
    - get
    - list</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">rbac.authorization.k8s.io/v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Role</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">namespace</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">random-numbers</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">client-access-role</span></span>
<span class="line"><span style="color: #8DDB8C">rules</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">- </span><span style="color: #8DDB8C">apiGroups</span><span style="color: #ADBAC7">: &#91;</span><span style="color: #96D0FF">&quot;&quot;</span><span style="color: #ADBAC7">&#93;</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">resources</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #96D0FF">configmaps</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #96D0FF">services</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">verbs</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #96D0FF">get</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #96D0FF">list</span></span></code></pre></div>



<p class="wp-block-paragraph">برای اعمال این Role روی کلاستر، دستور زیر را اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl apply -f role.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">apply</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-f</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">role.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>گام ۳: ایجاد RoleBinding</strong></p>



<p class="wp-block-paragraph">اکنون باید Role تعریف‌شده را به Service Account متصل کنیم. فایل yaml زیر با نام <code>rolebinding.yaml</code> را ایجاد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: client-access-role-binding
  namespace: random-numbers
subjects:
- kind: ServiceAccount
  name: random-numbers-sa
  namespace: random-numbers
roleRef:
  kind: Role
  name: client-access-role
  apiGroup: rbac.authorization.k8s.io</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">rbac.authorization.k8s.io/v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">RoleBinding</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">client-access-role-binding</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">namespace</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">random-numbers</span></span>
<span class="line"><span style="color: #8DDB8C">subjects</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">- </span><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">ServiceAccount</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">random-numbers-sa</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">namespace</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">random-numbers</span></span>
<span class="line"><span style="color: #8DDB8C">roleRef</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Role</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">client-access-role</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">apiGroup</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">rbac.authorization.k8s.io</span></span></code></pre></div>



<p class="wp-block-paragraph">برای اعمال RoleBinding دستور زیر را اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl apply -f rolebinding.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">apply</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-f</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">rolebinding.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph" id="h-گام-۴-راه-اندازی-پاد-تست-با-سرویس-اکانت-اختصاصی"><strong>گام ۴: راه‌اندازی پاد تست با سرویس‌اکانت اختصاصی</strong></p>



<p class="wp-block-paragraph">در ادامه یک پاد می‌سازیم تا بتوانیم درخواست‌های امنیتی را از داخل کلاستر تست کنیم. برای انجام این کار فایلی به نام pod-test.yaml بسازید و کد زیر را در آن قرار دهید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: v1
kind: Pod
metadata:
  name: curlo
  namespace: random-numbers
spec:
  serviceAccountName: random-numbers-sa
  containers:
  - name: curlo
    image: curlimages/curl
    command: &#91;"sleep","999999"&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Pod</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">curlo</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">namespace</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">random-numbers</span></span>
<span class="line"><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">serviceAccountName</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">random-numbers-sa</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">containers</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">curlo</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">image</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">curlimages/curl</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">command</span><span style="color: #ADBAC7">: &#91;</span><span style="color: #96D0FF">&quot;sleep&quot;</span><span style="color: #ADBAC7">,</span><span style="color: #96D0FF">&quot;999999&quot;</span><span style="color: #ADBAC7">&#93;</span></span></code></pre></div>



<p class="wp-block-paragraph">پاد را اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl apply -f pod-test.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">apply</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-f</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pod-test.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>گام ۵: بررسی سطح دسترسی</strong></p>



<p class="wp-block-paragraph">ابتدا وارد Pod شوید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl exec -it curlo -n random-numbers -- /bin/sh</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">exec</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-it</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">curlo</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-n</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">random-numbers</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/bin/sh</span></span></code></pre></div>



<p class="wp-block-paragraph">سپس توکن Service Account را برای ارسال درخواست به API Server تنظیم کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">export</span><span style="color: #ADBAC7"> TOKEN</span><span style="color: #F47067">=</span><span style="color: #96D0FF">$(</span><span style="color: #F69D50">cat</span><span style="color: #96D0FF"> /var/run/secrets/kubernetes.io/serviceaccount/token)</span></span>
<span class="line"><span style="color: #F47067">export</span><span style="color: #ADBAC7"> CURL_CA_BUNDLE</span><span style="color: #F47067">=</span><span style="color: #96D0FF">/var/run/secrets/kubernetes.io/serviceaccount/ca.crt</span></span></code></pre></div>



<p class="wp-block-paragraph" id="h-آزمایش-اول-بررسی-دسترسی-مجاز-مشاهده-سرویس-ها"><strong>آزمایش اول: بررسی دسترسی مجاز (مشاهده سرویس‌ها)</strong></p>



<p class="wp-block-paragraph">یک درخواست به آدرس API سرویس‌های این Namespace می‌فرستیم:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -k --header "Authorization: Bearer $TOKEN" \
https://kubernetes.default.svc/api/v1/namespaces/random-numbers/services</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">curl</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-k</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--header</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;Authorization: Bearer </span><span style="color: #ADBAC7">$TOKEN</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">\</span></span>
<span class="line"><span style="color: #ADBAC7">https://kubernetes.default.svc/api/v1/namespaces/random-numbers/services</span></span></code></pre></div>



<p class="wp-block-paragraph">در صورت موفقیت، Kubernetes اطلاعات Serviceها را با پاسخ <code>200 OK</code> برمی‌گرداند.</p>



<p class="wp-block-paragraph" id="h-آزمایش-دوم-بررسی-دسترسی-غیرمجاز"><strong>آزمایش دوم: بررسی دسترسی غیرمجاز</strong></p>



<p class="wp-block-paragraph">اکنون درخواست مشاهده Podها را ارسال می‌کنیم:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>curl -k --header "Authorization: Bearer $TOKEN" \
https://kubernetes.default.svc/api/v1/namespaces/random-numbers/pods</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">curl</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-k</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--header</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;Authorization: Bearer </span><span style="color: #ADBAC7">$TOKEN</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">\</span></span>
<span class="line"><span style="color: #ADBAC7">https://kubernetes.default.svc/api/v1/namespaces/random-numbers/pods</span></span></code></pre></div>



<p class="wp-block-paragraph">چون در Role تعریف‌شده مجوز دسترسی به Podها وجود ندارد، Kubernetes پاسخ <code>403 Forbidden</code> را برمی‌گرداند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">JSON</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{
  "status": "Failure",
  "message": "pods is forbidden: User \"system:serviceaccount:random-numbers:random-numbers-sa\" cannot list resource \"pods\" in the namespace \"random-numbers\"",
  "reason": "Forbidden",
  "code": 403
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #ADBAC7">{</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">&quot;status&quot;</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;Failure&quot;</span><span style="color: #ADBAC7">,</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">&quot;message&quot;</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;pods is forbidden: User </span><span style="color: #F47067">\&quot;</span><span style="color: #96D0FF">system:serviceaccount:random-numbers:random-numbers-sa</span><span style="color: #F47067">\&quot;</span><span style="color: #96D0FF"> cannot list resource </span><span style="color: #F47067">\&quot;</span><span style="color: #96D0FF">pods</span><span style="color: #F47067">\&quot;</span><span style="color: #96D0FF"> in the namespace </span><span style="color: #F47067">\&quot;</span><span style="color: #96D0FF">random-numbers</span><span style="color: #F47067">\&quot;</span><span style="color: #96D0FF">&quot;</span><span style="color: #ADBAC7">,</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">&quot;reason&quot;</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;Forbidden&quot;</span><span style="color: #ADBAC7">,</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">&quot;code&quot;</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">403</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-بهترین-روش-ها-best-practices-برای-پیاده-سازی-rbac"><a></a>بهترین روش‌ها (Best Practices) برای پیاده‌سازی RBAC</h2>



<p class="wp-block-paragraph">پیاده‌سازی صحیح RBAC در کوبرنتیز نقش مهمی در کاهش ریسک‌های امنیتی و کنترل دسترسی کاربران دارد. مهم‌ترین راهکارهای این حوزه عبارت‌اند از:</p>



<p class="wp-block-paragraph"><strong>اصل حداقل دسترسی (Least Privilege)</strong></p>



<p class="wp-block-paragraph">دسترسی‌ها باید فقط بر اساس نیاز واقعی کاربران و سرویس‌ها تعریف شوند. بهتر است از اعطای مجوزهای گسترده یا استفاده از وایلدکارد <code>*</code> در بخش منابع و عملیات‌ها خودداری شود.</p>



<p class="wp-block-paragraph"><strong>استفاده از Role و RoleBinding در سطح Namespace</strong></p>



<p class="wp-block-paragraph">در بیشتر سناریوها، بهتر است دسترسی‌ها در سطح Namespace مدیریت شوند. استفاده از Role و RoleBinding باعث می‌شود دامنه دسترسی محدود بماند و ایزوله‌سازی بین محیط‌هایی مانند <code>dev</code> و <code>prod</code> حفظ شود.</p>



<p class="wp-block-paragraph"><strong>محدود کردن استفاده از ClusterRole و ClusterRoleBinding</strong></p>



<p class="wp-block-paragraph">ClusterRole و ClusterRoleBinding فقط باید برای دسترسی‌های سراسری یا منابع cluster-scoped استفاده شوند. استفاده غیرضروری از آن‌ها می‌تواند سطح دسترسی کاربران را بیش از حد افزایش دهد.</p>



<p class="wp-block-paragraph"><strong>استفاده از Service Account اختصاصی</strong></p>



<p class="wp-block-paragraph">بهتر است هر Pod یا برنامه از Service Account اختصاصی خود استفاده کند و به Service Account پیش‌فرض Namespace وابسته نباشد. این کار باعث می‌شود دسترسی سرویس‌ها از یکدیگر جدا شود.</p>



<p class="wp-block-paragraph">همچنین در صورت عدم نیاز، می‌توان قابلیت mount خودکار توکن Service Account را با تنظیم <code>automountServiceAccountToken: false</code> غیرفعال کرد.</p>



<p class="wp-block-paragraph"><strong>بازبینی و حساب‌رسی دوره‌ای</strong></p>



<p class="wp-block-paragraph">تنظیمات RBAC باید به‌صورت دوره‌ای بررسی شوند تا دسترسی‌های قدیمی، RoleBindingهای بلااستفاده یا مجوزهای غیرضروری حذف شوند. همچنین دسترسی‌های حساس، به‌ویژه اعضای گروه <code>system:masters</code>، باید به‌صورت مستمر کنترل شوند.</p>



<h2 class="wp-block-heading" id="h-اشتباهات-رایج-در-مدیریت-rbac-کوبرنتیز"><a></a>اشتباهات رایج در مدیریت RBAC کوبرنتیز</h2>



<p class="wp-block-paragraph">در پیاده‌سازی RBAC، بسیاری از مشکلات امنیتی نه به دلیل ضعف ابزار، بلکه به خاطر تنظیمات نادرست رخ می‌دهند. مهم‌ترین اشتباهات رایج عبارت‌اند از:</p>



<p class="wp-block-paragraph"><strong>استفاده از ClusterRoleBinding به‌جای RoleBinding</strong></p>



<p class="wp-block-paragraph">یکی از خطاهای رایج، استفاده بی‌دلیل از ClusterRoleBinding است. این کار می‌تواند باعث شود کاربری که باید فقط در یک Namespace محدود باشد، به منابع سایر Namespaceها نیز دسترسی پیدا کند.</p>



<p class="wp-block-paragraph"><strong>استفاده از وایلدکارد در دسترسی‌ها</strong></p>



<p class="wp-block-paragraph">دادن دسترسی <code>*</code> در منابع یا عملیات‌ها عملاً تمام محدودیت‌های RBAC را از بین می‌برد و باعث ایجاد دسترسی‌های غیرقابل‌کنترل می‌شود.</p>



<p class="wp-block-paragraph"><strong>استفاده از حساب cluster-admin برای کارهای روزمره</strong></p>



<p class="wp-block-paragraph">حساب cluster-admin دسترسی کامل به کل کلاستر دارد. استفاده روزمره از آن ریسک خطای انسانی را به‌شدت افزایش می‌دهد و می‌تواند منجر به تغییرات مخرب در کل سیستم شود.</p>



<p class="wp-block-paragraph"><strong>اضافه کردن کاربران به گروه system:masters</strong></p>



<p class="wp-block-paragraph">عضویت در این گروه باعث دور زدن کامل RBAC می‌شود. این سطح دسترسی عملاً معادل دسترسی روت در کل کلاستر است و باید به‌شدت محدود شود.</p>



<p class="wp-block-paragraph"><strong>استفاده از Service Account پیش‌فرض</strong></p>



<p class="wp-block-paragraph">استفاده از Service Account پیش‌فرض یک Namespace برای همه پادها باعث می‌شود سرویس‌های مختلف، یک سطح دسترسی مشترک داشته باشند. این موضوع ریسک نفوذ را افزایش می‌دهد.</p>



<p class="wp-block-paragraph"><strong>فعال‌سازی تنظیمات ناامن در API Server</strong></p>



<p class="wp-block-paragraph">فعال کردن گزینه‌هایی مانند <code>--insecure-port</code> یا <code>--anonymous-auth</code> می‌تواند لایه احراز هویت و کنترل دسترسی را عملاً بی‌اثر کند.</p>



<p class="wp-block-paragraph"><strong>عدم بازبینی دوره‌ای دسترسی‌ها</strong></p>



<p class="wp-block-paragraph">اگر Roleها و RoleBindingها به‌صورت دوره‌ای بررسی نشوند، دسترسی‌های قدیمی و غیرضروری باقی می‌مانند و به مرور زمان سطح حمله (Attack Surface) را افزایش می‌دهند.</p>



<p class="wp-block-paragraph"><strong>نادیده گرفتن تغییرات سازمانی</strong></p>



<p class="wp-block-paragraph">تغییر نقش افراد در سازمان یا خروج آن‌ها باید بلافاصله در RBAC اعمال شود. عدم به‌روزرسانی دسترسی‌ها می‌تواند باعث انباشت مجوزهای اضافی شود.</p>



<h2 class="wp-block-heading" id="h-محدودیت-های-سیستم-rbac-در-کوبرنتیز">محدودیت‌های سیستم RBAC در کوبرنتیز</h2>



<p class="wp-block-paragraph">سیستم RBAC در کوبرنتیز ابزار اصلی کنترل دسترسی است، اما به‌تنهایی برای پوشش تمام سناریوهای امنیتی کافی نیست و محدودیت‌های مشخصی دارد:</p>



<p class="wp-block-paragraph"><strong>۱. عدم کنترل روی محتوای منابع</strong></p>



<p class="wp-block-paragraph">RBAC فقط مشخص می‌کند چه کسی به یک resource دسترسی دارد، اما روی محتوای آن کنترل ندارد. برای مثال، اگر کاربری اجازه دسترسی به Secrets را داشته باشد، می‌تواند به محتوای رمزگذاری‌شده آن‌ها دسترسی پیدا کند، بدون اینکه RBAC بتواند سطح جزئی‌تری از محدودیت اعمال کند.</p>



<p class="wp-block-paragraph"><strong>۲. عدم جلوگیری از Privilege Escalation در سطح Pod</strong></p>



<p class="wp-block-paragraph">در صورتی که کاربر اجازه ایجاد پاد داشته باشد، می‌تواند از طریق اتصال Service Accountهای دارای سطح دسترسی بالاتر، به مجوزهای بیشتری دست پیدا کند. RBAC به‌تنهایی جلوی این نوع ارتقا سطح دسترسی را نمی‌گیرد.</p>



<p class="wp-block-paragraph"><strong>۳. محدودیت در کنترل منابع زیرساختی</strong></p>



<p class="wp-block-paragraph">RBAC فقط دسترسی به ایجاد یا مدیریت منابع را کنترل می‌کند، اما نمی‌تواند نوع یا رفتار دقیق برخی منابع را محدود کند. برای مثال، کاربر می‌تواند در صورت داشتن مجوز، نوع PersistentVolume را به شکلی انتخاب کند که ریسک امنیتی ایجاد کند.</p>



<p class="wp-block-paragraph"><strong>۴. عدم کنترل روی عملیات‌های حساس خاص</strong></p>



<p class="wp-block-paragraph">برخی عملیات مانند <code>impersonate</code> ،<code>bind</code> و <code>escalate</code> می‌توانند منجر به دور زدن سیاست‌های دسترسی شوند. RBAC این عملیات‌ها را در سطح منطقی کنترل می‌کند، اما سوءاستفاده از آن‌ها در صورت داشتن مجوز، همچنان امکان‌پذیر است.</p>



<p class="wp-block-paragraph"><strong>۵. محدودیت در برابر حملات سطح کلاستر</strong></p>



<p class="wp-block-paragraph">RBAC توانایی محدود کردن رفتارهایی مانند ایجاد حجم بالای resource و مصرف بیش از حد etcd یا CPU را ندارد. برای این موارد باید از مکانیزم‌های مکمل مانند ResourceQuota و LimitRange استفاده شود.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی"><a></a>جمع‌بندی</h2>



<p class="wp-block-paragraph">RBAC در کوبرنتیز یکی از مهم‌ترین لایه‌های امنیتی برای مدیریت دسترسی کاربران و سرویس‌ها در کلاستر است. این مکانیزم بر پایه تعریف نقش‌ها (Role و ClusterRole)، اتصال آن‌ها به هویت‌ها (RoleBinding و ClusterRoleBinding) و اعمال سیاست‌های دسترسی در سطح API Server عمل می‌کند.</p>



<p class="wp-block-paragraph">در سطح عملی، RBAC به شما اجازه می‌دهد دسترسی‌ها را به‌صورت دقیق و محدود در سطح Namespace یا کل کلاستر کنترل کنید و اصل Least Privilege را پیاده‌سازی کنید. با این حال، این سیستم به‌تنهایی کافی نیست و باید در کنار سایر مکانیزم‌های امنیتی مانند ResourceQuota، LimitRange و سیاست‌های امنیتی تکمیلی استفاده شود.</p>



<p class="wp-block-paragraph">همچنین بیشترین خطاها در پیاده‌سازی RBAC معمولاً ناشی از استفاده بیش از حد از دسترسی‌های سراسری، بی‌توجهی به Service Accountها و عدم بازبینی دوره‌ای مجوزهاست. در نهایت، RBAC یک ابزار پایه و ضروری برای امنیت Kubernetes است، اما ارزش واقعی آن زمانی مشخص می‌شود که به‌درستی طراحی، محدود و در کنار سایر لایه‌های امنیتی استفاده شود.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-rbac/">RBAC در کوبرنتیز چیست؟ آشنایی با اجزا و روش‌های پیاده‌سازی</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-rbac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با Gateway API در کوبرنتیز؛ بررسی معماری و مقایسه با Ingress</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-gateway-api/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-gateway-api/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 13 May 2026 12:30:28 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3024</guid>

					<description><![CDATA[<p>Gateway API در کوبرنتیز به‌عنوان نسل جدید مدیریت ترافیک شبکه معرفی شد تا محدودیت‌های مدل Ingress را در محیط‌های cloud-native برطرف کند؛ مدلی که سال‌ها برای مدیریت ترافیک در کوبرنتیز استفاده می‌شد. Gateway API در کوبرنتیز فقط یک ارتقاء در قابلیت‌ها نیست، بلکه تغییری در مدل طراحی، تفکیک مسئولیت‌ها و نحوه مدیریت ترافیک در سطح [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-gateway-api/">آشنایی با Gateway API در کوبرنتیز؛ بررسی معماری و مقایسه با Ingress</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Gateway API در کوبرنتیز به‌عنوان نسل جدید مدیریت ترافیک شبکه معرفی شد تا محدودیت‌های مدل Ingress را در محیط‌های cloud-native برطرف کند؛ مدلی که سال‌ها برای مدیریت ترافیک در کوبرنتیز استفاده می‌شد. Gateway API در کوبرنتیز فقط یک ارتقاء در قابلیت‌ها نیست، بلکه تغییری در مدل طراحی، تفکیک مسئولیت‌ها و نحوه مدیریت ترافیک در سطح کلاستر محسوب می‌شود. در این مطلب بررسی می‌کنیم که Gateway API چیست، چه تفاوتی با Ingress دارد و با چه مزایایی و چالش‌هایی همراه است.</p>



<h2 class="wp-block-heading" id="h-gateway-api-چیست">Gateway API چیست؟</h2>



<p class="wp-block-paragraph" id="h-gateway-api-در-کوبرنتیز-چیست">Gateway API در کوبرنتیز مجموعه‌ای از resourceها و APIهای استاندارد برای مدیریت ترافیک شبکه در کوبرنتیز است. این API با هدف رفع محدودیت‌های Ingress طراحی شد و امکان مدیریت پیشرفته‌تر ترافیک HTTP ،HTTPS ،TCP ،TLS و gRPC را فراهم می‌کند.</p>



<p class="wp-block-paragraph">Gateway API در کوبرنتیز از چند مؤلفه اصلی تشکیل شده است که هرکدام نقش مشخصی در مدیریت ترافیک دارند:</p>



<ul class="wp-block-list">
<li>GatewayClass مشخص می‌کند که کدام کنترلر مسئول پیاده‌سازی Gateway است.</li>



<li>Gateway نقطه ورود ترافیک به کلاستر را تعریف می‌کند.</li>



<li>Routeها مانند HTTPRoute قوانین مسیریابی درخواست‌ها را مشخص می‌کنند.</li>
</ul>



<p class="wp-block-paragraph">یکی از ویژگی‌های اصلی Gateway API در کوبرنتیز مدل نقش‌محور آن است. در این مدل، مسئولیت‌ها بین نقش‌های مختلف مانند تیم زیرساخت، امنیت و توسعه تفکیک می‌شود تا هر تیم بتواند بخش مربوط به خود را مستقل مدیریت کند.</p>



<p class="wp-block-paragraph">در Gateway API کوبرنتیز، Resorceهای مختلف از یکدیگر جدا شده‌اند و هر بخش مسئولیت مشخصی دارد. این ساختار باعث می‌شود مدیریت networking در کوبرنتیز انعطاف‌پذیرتر و قابل کنترل‌تر باشد.</p>



<p class="wp-block-paragraph" id="h-gateway-api-در-کوبرنتیز-چیست">امروزه پروژه‌هایی مانند Envoy Gateway ،Istio ،Kong و NGINX Gateway Fabric از Gateway API پشتیبانی می‌کنند و این API به یکی از بخش‌های مهم اکوسیستم networking در کوبرنتیز تبدیل شده است.<br></p>



<h2 class="wp-block-heading">چرا Ingress دیگر کافی نیست؟</h2>



<p class="wp-block-paragraph">Ingress سال‌ها روش استاندارد مدیریت ترافیک HTTP و HTTPS در کوبرنتیز بود، اما با پیچیده‌تر شدن معماری‌های <a href="https://hamravesh.com/blog/what-is-cloud-native/" type="link" id="https://hamravesh.com/blog/what-is-cloud-native/">cloud-native</a> دیگر پاسخگوی نیازهای جدید نبود.</p>



<p class="wp-block-paragraph">Ingress در ابتدا برای سناریوهای ساده routing طراحی شده بود و بسیاری از قابلیت‌های پیشرفته networking را به‌صورت استاندارد ارائه نمی‌داد. به همین دلیل، Ingress Controllerها برای افزودن قابلیت‌های بیشتر به annotationهای اختصاصی وابسته شدند. annotationها نوعی متادیتا هستند که به منابع کوبرنتیز اضافه می‌شوند تا تنظیمات یا رفتارهای اضافی را برای کنترلرها تعریف کنند.</p>



<p class="wp-block-paragraph">یکی دیگر از محدودیت‌های Ingress، مدل مدیریت و مالکیت آن بود. در بسیاری از سازمان‌ها، تیم‌های مختلف مسئول بخش‌های متفاوت شبکه هستند، اما Ingress جداسازی مشخصی برای این مسئولیت‌ها ارائه نمی‌کرد و مدیریت سطح دسترسی‌ها در محیط‌هایی که چند تیم روی یک کلاستر کار می‌کردند دشوارتر می‌شد.</p>



<p class="wp-block-paragraph">مجموعه این محدودیت‌ها باعث شد Ingress به‌مرور برای بسیاری از سناریوهای جدید cloud-native کافی نباشد؛ مخصوصاً در معماری‌های بزرگ، محیط‌های چندتیمی و زیرساخت‌هایی که به مدیریت پیشرفته‌تر ترافیک نیاز داشتند. به همین دلیل جامعه توسعه‌دهندگان کوبرنتیز به‌سمت طراحی API جدیدی حرکت کرد که بتواند مدیریت ترافیک شبکه را انعطاف‌پذیرتر، استانداردتر و قابل گسترش‌تر کند. نتیجه این تلاش، Gateway API بود.</p>



<h2 class="wp-block-heading" id="h-تفاوت-ingress-و-gateway-api">تفاوت Ingress و Gateway API</h2>



<p class="wp-block-paragraph">تفاوت اصلی Ingress و Gateway API در کوبرنتیز در مدل طراحی و سطح انتزاع (abstraction level) آن‌ها است. Ingress یک API ساده و متمرکز برای مدیریت ترافیک HTTP/HTTPS است، در حالی که Gateway API یک مدل نقش‌محور و چندلایه برای مدیریت پیشرفته‌تر ترافیک در کوبرنتیز ارائه می‌دهد.</p>



<p class="wp-block-paragraph">در Ingress، تمام منطق مسیریابی در یک resource واحد تعریف می‌شود که باعث سادگی، اما محدودیت در سناریوهای پیچیده می‌شود. در مقابل، Gateway API این مسئولیت‌ها را بین چند resource مستقل تقسیم می‌کند تا مدیریت شبکه قابل توسعه‌تر و منعطف‌تر شود.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="638" src="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-1024x638.webp" alt="مقایسه Ingress با Gateway API در کوبرنتیز" class="wp-image-5109" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-1024x638.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-300x187.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-768x478.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-120x75.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">از نظر مدل مدیریت، تفاوت مهم دیگر در نحوه تقسیم مسئولیت‌ها بین تیم‌ها است. در Ingress معمولاً یک تیم باید هم زیرساخت و هم قوانین routing را مدیریت کند. اما در Gateway API این مسئولیت‌ها قابل تفکیک هستند و هر تیم می‌تواند بخش مشخصی از شبکه را مدیریت کند.</p>



<p class="wp-block-paragraph">از نظر قابلیت‌ها نیز تفاوت قابل توجهی وجود دارد. Ingress عمدتاً برای HTTP و HTTPS طراحی شده است، در حالی که Gateway API از پروتکل‌های بیشتری از جمله موارد زیر پشتیبانی می‌کند:</p>



<ul class="wp-block-list">
<li>HTTP و HTTPS</li>



<li>TCP</li>



<li>TLS</li>



<li>gRPC</li>
</ul>



<p class="wp-block-paragraph">همچنین Gateway API در کوبرنتیز امکان تعریف قابلیت‌های پیشرفته‌تری را به‌صورت استاندارد و قابل توسعه فراهم می‌کند؛ از جمله مسیریابی مبتنی بر هدر، تقسیم ترافیک بین سرویس‌ها و مسیریابی بین چند <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/" type="link" id="https://hamravesh.com/blog/what-is-kubernetes-namespace/">فضای نام کوبرنتیز</a> مختلف (Namespaceها). در حالی که در Ingress این نوع قابلیت‌ها معمولاً وابسته به پیاده‌سازی هر <a href="https://hamravesh.com/blog/what-is-kubernetes-controller">کنترلر کوبرنتیز</a> هستند و استاندارد واحدی برای آن‌ها وجود ندارد.</p>



<p class="wp-block-paragraph">در نتیجه، تفاوت اصلی این دو مدل در این است که Ingress یک راهکار ساده و محدود برای سناریوهای پایه است، در حالی که Gateway API یک چارچوب استاندارد و قابل توسعه برای مدیریت پیچیده‌تر ترافیک در کوبرنتیز محسوب می‌شود.</p>



<h2 class="wp-block-heading" id="h-معماری-و-اجزای-اصلی-gateway-api">معماری و اجزای اصلی Gateway API</h2>



<p class="wp-block-paragraph" id="h-معماری-و-اجزای-اصلی-gateway-api-در-کوبرنتیز">Gateway API در کوبرنتیز بر پایه یک مدل معماری نقش‌محور طراحی شده است که در آن مسئولیت مدیریت ترافیک بین چند resource مستقل تقسیم می‌شود. این طراحی برای کاهش پیچیدگی Ingress و ایجاد ساختاری قابل توسعه در سناریوهای پیشرفته شبکه شکل گرفته است.</p>



<p class="wp-block-paragraph" id="h-معماری-و-اجزای-اصلی-gateway-api-در-کوبرنتیز">در این معماری، به‌جای اینکه تمام منطق routing و پیکربندی شبکه در یک resource واحد متمرکز شود، اجزای مختلفی تعریف شده‌اند که هرکدام نقش مشخصی دارند و در کنار هم سیستم مدیریت ترافیک را تشکیل می‌دهند. در معماری Gateway API، سه مؤلفه اصلی نقش کلیدی دارند.</p>



<p class="wp-block-paragraph"><strong>GatewayClass</strong></p>



<p class="wp-block-paragraph">GatewayClass مشخص می‌کند که کدام کنترلر مسئول پیاده‌سازی و مدیریت Gatewayها در کلاستر است. این بخش در واقع نقش template یا کلاس رفتاری برای Gatewayها را دارد و تعیین می‌کند که کل سیستم از چه نوع پیاده‌سازی networking استفاده کند.</p>



<p class="wp-block-paragraph"><strong>Gateway</strong></p>



<p class="wp-block-paragraph">Gateway نقطه ورود ترافیک به کلاستر است. این resource مشخص می‌کند که ترافیک از چه مسیرهایی وارد می‌شود و چه listenerهایی برای دریافت درخواست‌ها فعال هستند. به عبارت دیگر Gateway نقطه اتصال بین دنیای بیرونی و سرویس‌های داخل کوبرنتیز است.</p>



<p class="wp-block-paragraph"><strong>Routeها</strong></p>



<p class="wp-block-paragraph">Routeها مسئول تعریف قوانین مسیریابی در Gateway API هستند. این resourceها مشخص می‌کنند درخواست‌ها بر اساس چه معیارهایی به سرویس‌های داخلی هدایت شوند. این معیارها می‌توانند شامل مسیر URL، هدرها یا سایر ویژگی‌های درخواست باشند.</p>



<p class="wp-block-paragraph">HTTPRoute یکی از مهم‌ترین انواع Route است که امکان مسیریابی بر اساس ویژگی‌های HTTP مانند مسیر درخواست، هدرها و سایر مشخصه‌ها را فراهم می‌کند. علاوه بر آن، Routeهای دیگری نیز برای پروتکل‌هایی مانند TCP ،TLS و gRPC وجود دارند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="755" src="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-1024x755.webp" alt="معماری نقش محور GatewayAPI در کوبرنتیز" class="wp-image-5152" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-1024x755.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-300x221.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-768x566.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-120x88.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">این تصویر معماری مبتنی بر نقش (Role-Oriented Architecture) در Gateway API را نشان می‌دهد. برخلاف Ingress که تمام تنظیمات شبکه و مسیریابی را در یک Resource متمرکز می‌کرد، Gateway API مسئولیت‌ها را بین نقش‌های مختلف مانند تیم زیرساخت، ادمین کلاستر و توسعه‌دهندگان اپلیکیشن تفکیک می‌کند. در این مدل، هر بخش فقط لایه مربوط به خود را مدیریت می‌کند؛ از تعریف نوع Gateway گرفته تا تنظیم قوانین مسیریابی ترافیک.</figcaption></figure>



<p class="wp-block-paragraph">یکی از نکات مهم در معماری Gateway API در کوبرنتیز این است که این سه بخش به‌صورت مستقل از هم طراحی شده‌اند. این جداسازی باعث می‌شود مدیریت شبکه در کوبرنتیز انعطاف‌پذیرتر شود و امکان تقسیم مسئولیت بین تیم‌های مختلف فراهم شود. در این مدل، تیم زیرساخت معمولاً GatewayClass و Gateway را مدیریت می‌کند، در حالی که تیم‌های توسعه می‌توانند Routeهای مربوط به سرویس‌های خود را به‌صورت مستقل تعریف و کنترل کنند.</p>



<h2 class="wp-block-heading" id="h-یک-مثال-ساده">یک مثال ساده</h2>



<p class="wp-block-paragraph" id="h-یک-مثال-ساده-از-کار-با-gateway-api-در-کوبرنتیز">مثال زیر یک Gateway ساده را نشان می‌دهد که ترافیک HTTP را روی پورت ۸۰ دریافت می‌کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: example-gateway
spec:
  gatewayClassName: example-gateway-class
  listeners:
    - name: http
      protocol: HTTP
      port: 80</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Gateway</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-gateway</span></span>
<span class="line"><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">gatewayClassName</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-gateway-class</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">listeners</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">http</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">protocol</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">HTTP</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">port</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">80</span></span></code></pre></div>



<p class="wp-block-paragraph" id="h-یک-مثال-ساده-از-کار-با-gateway-api-در-کوبرنتیز">در این تعریف:</p>



<ul class="wp-block-list">
<li>Gateway به یک GatewayClass متصل است که تعیین می‌کند کدام کنترلر آن را مدیریت کند</li>



<li>یک نقطه ورود ترافیک روی پورت ۸۰ ایجاد شده است</li>



<li>پروتکل HTTP برای دریافت درخواست‌ها مشخص شده است</li>
</ul>



<p class="wp-block-paragraph">در مثال زیر برای تشریح HTTPRoute (تعریف قوانین مسیریابی)، مشخص شده که درخواست‌ها باید به کدام سرویس داخلی ارسال شوند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: example-route
spec:
  parentRefs:
    - name: example-gateway
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: example-service
          port: 8080</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">HTTPRoute</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-route</span></span>
<span class="line"><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">parentRefs</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-gateway</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">rules</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #8DDB8C">matches</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">        - </span><span style="color: #8DDB8C">path</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">type</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">PathPrefix</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">value</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">/</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">backendRefs</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">        - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-service</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">port</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">8080</span></span></code></pre></div>



<p class="wp-block-paragraph">در اینجا:</p>



<ul class="wp-block-list">
<li>این Route به Gateway قبلی متصل شده است</li>



<li>تمام درخواست‌های شروع شده با مسیر <code>/</code> تطبیق داده می‌شوند.</li>



<li>ترافیک به سرویس <code>example-service</code> روی پورت ۸۰۸۰ هدایت می‌شود</li>
</ul>



<h2 class="wp-block-heading" id="h-مزایای-gateway-api">مزایای Gateway API</h2>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">Gateway API در کوبرنتیز در سناریوهای واقعی چند مزیت کلیدی نسبت به مدل Ingress دارد:</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>تفکیک مسئولیت‌ها در معماری شبکه</strong></p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">در Gateway API، وظایف مربوط به زیرساخت، نقطه ورود ترافیک و قوانین مسیریابی از هم جدا شده‌اند و هر بخش می‌تواند به‌صورت مستقل مدیریت شود.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>کاهش وابستگی به annotationهای اختصاصی</strong></p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">بسیاری از قابلیت‌هایی که در Ingress وابسته به پیاده‌سازی کنترلر بودند، در Gateway API به‌صورت استاندارد و قابل پیش‌بینی تعریف می‌شوند.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>مقیاس‌پذیری بهتر در معماری‌های بزرگ</strong><br>در محیط‌های مبتنی بر مایکروسرویس، مدیریت تعداد زیاد مسیرها و سرویس‌ها ساده‌تر می‌شود و پیچیدگی پیکربندی‌ها کاهش پیدا می‌کند.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>یکپارچگی بیشتر بین پیاده‌سازی‌های مختلف</strong><br>رفتار سیستم در کنترلرهای مختلف قابل پیش‌بینی‌تر است و وابستگی به هر پیاده‌سازی خاص کاهش پیدا می‌کند.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>پشتیبانی گسترده‌تر از پروتکل‌ها</strong><br>Gateway API در کوبرنتیز علاوه بر HTTP و HTTPS، از پروتکل‌هایی مانند TCP ،TLS و gRPC به‌صورت استاندارد پشتیبانی می‌کند.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 class="wp-block-heading has-medium-font-size" id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده هم‌روش، بر بستر ابر اختصاصی یا به صورت On-premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a href="#">کوبرنتیز مدیریت شده</a></p>
</div></div>
</div></div>
</div>



<h2 class="wp-block-heading" id="h-چالش-ها-و-محدودیت-های-gateway-api">چالش‌ها و محدودیت‌های Gateway API</h2>



<p class="wp-block-paragraph">با وجود مزایای معماری Gateway API، این مدل هنوز بدون چالش نیست و در بسیاری از سناریوهای عملی محدودیت‌هایی دارد:</p>



<p class="wp-block-paragraph"><strong>ناهمگونی در پیاده‌سازی کنترلرها</strong><br>همه کنترلرها هنوز سطح یکسانی از پشتیبانی از Gateway API ندارند و برخی قابلیت‌ها ممکن است در همه پیاده‌سازی‌ها در دسترس نباشند.</p>



<p class="wp-block-paragraph"><strong>پیچیدگی بیشتر نسبت به Ingress</strong><br>مدل Gateway API در کوبرنتیز به‌جای یک resource واحد، از چند resource جدا استفاده می‌کند. این موضوع اگرچه از نظر معماری مزیت است، اما در عمل باعث افزایش پیچیدگی مفهومی و یادگیری می‌شود.</p>



<p class="wp-block-paragraph"><strong>پیچیدگی مهاجرت از Ingress</strong><br>بسیاری از تنظیمات Ingress به‌خصوص مواردی که با annotationهای اختصاصی تعریف شده‌اند، معادل مستقیم در Gateway API ندارند و باید مجدد طراحی شوند.</p>



<p class="wp-block-paragraph"><strong>بلوغ ناقص در برخی سناریوها</strong><br>با وجود استاندارد بودن API، هنوز برخی ویژگی‌ها در سطح اکوسیستم به‌صورت کامل و یکپارچه در همه پروژه‌ها پیاده‌سازی نشده‌اند.</p>



<p class="wp-block-paragraph"><strong>هم‌زیستی با Ingress در بسیاری از محیط‌ها</strong><br>در عمل، بسیاری از سازمان‌ها هنوز به‌طور کامل به Gateway API مهاجرت نکرده‌اند و استفاده هم‌زمان از Ingress و Gateway API در یک کلاستر رایج است.</p>



<h2 class="wp-block-heading" id="h-مهاجرت-از-ingress-به-gateway-api-در-کوبرنتیز">مهاجرت از Ingress به Gateway API در کوبرنتیز</h2>



<p class="wp-block-paragraph">مهاجرت از Ingress به Gateway API یک تغییر تدریجی در معماری شبکه است، نه یک جایگزینی ساده. چون این دو مدل ساختار متفاوتی دارند، مهاجرت معمولاً نیازمند بازطراحی بخشی از منابع شبکه در کلاستر است.</p>



<p class="wp-block-paragraph">در مدل Ingress، تمام تنظیمات routing در یک resource واحد تعریف می‌شود. اما در Gateway API این مسئولیت بین چند resource جدا مانند GatewayClass ،Gateway و Routeها تقسیم شده است. به همین دلیل، اولین گام در مهاجرت، درک و بازنویسی این تفکیک مسئولیت‌ها است.</p>



<p class="wp-block-paragraph">در فرایند مهاجرت، معمولاً ابتدا یک Gateway جدید در کنار Ingressهای موجود ایجاد می‌شود. این Gateway به یک کنترلر سازگار متصل می‌شود و به‌صورت تدریجی بخشی از ترافیک را از Ingress به سمت Routeهای جدید هدایت می‌کند.</p>



<p class="wp-block-paragraph">در این مرحله، یکی از چالش‌های اصلی، بازنویسی تنظیمات Ingress است. بسیاری از قابلیت‌هایی که قبلاً از طریق annotationها تعریف می‌شدند، باید در قالب resourceهای استاندارد Gateway API بازتعریف شوند. این موضوع نیازمند بررسی دقیق رفتار Ingressهای موجود و تبدیل آن‌ها به معادل‌های Gateway API است.</p>



<p class="wp-block-paragraph">همچنین در مهاجرت باید توجه شود که همه قابلیت‌های Ingress ممکن است معادل مستقیم در Gateway API نداشته باشند یا پیاده‌سازی آن‌ها وابسته به کنترلر انتخاب‌شده باشد. بنابراین انتخاب کنترلر سازگار با نیازهای پروژه نقش مهمی در موفقیت مهاجرت دارد.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">در نهایت، مهاجرت معمولاً به‌صورت مرحله‌ای انجام می‌شود؛ به‌طوری که Ingress و Gateway API برای مدتی در کنار هم در کلاستر وجود دارند تا انتقال ترافیک بدون اختلال انجام شود.</p>



<h2 class="wp-block-heading" id="h-سخن-پایانی">سخن پایانی</h2>



<p class="wp-block-paragraph">Gateway API یک مسیر جدید در تکامل networking در کوبرنتیز است که برای رفع محدودیت‌های مدل Ingress طراحی شده است. Ingress همچنان در بسیاری از محیط‌ها استفاده می‌شود، اما برای نیازهای جدید و سناریوهای پیچیده‌تر، تمرکز اصلی توسعه در اکوسیستم کوبرنتیز به سمت Gateway API حرکت کرده است. در نتیجه، Gateway API در کوبرنتیز بیشتر به‌عنوان مسیر پیشنهادی آینده برای طراحی شبکه در کوبرنتیز دیده می‌شود، در حالی که Ingress هنوز در بسیاری از سیستم‌های موجود نقش کاربردی خود را حفظ کرده است.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-gateway-api/">آشنایی با Gateway API در کوبرنتیز؛ بررسی معماری و مقایسه با Ingress</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-gateway-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با مفهوم Namespace در کوبرنتیز؛ آموزش نحوه ساخت</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-namespace/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-namespace/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 06 May 2026 12:30:07 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=1796</guid>

					<description><![CDATA[<p>فضای نام یا Namespace یکی از کلیدی‌ترین امکانات در دنیای کوبرنتیز است که به مدیریت بهتر پروژه و ایجاد فضاهای ایزوله از همدیگر کمک می‌کند</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/">آشنایی با مفهوم Namespace در کوبرنتیز؛ آموزش نحوه ساخت</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Namespace در کوبرنتیز یکی از اجزای پایه‌ای در معماری کلاستر است که برای مدیریت بهتر منابع در محیط‌های چندتیمی و چندپروژه‌ای استفاده می‌شود. این قابلیت امکان ایجاد محدوده‌های منطقی برای منابع را فراهم می‌کند تا بتوان سرویس‌ها، محیط‌ها و اپلیکیشن‌های مختلف را در یک کلاستر مشترک اما به‌صورت جداگانه مدیریت کرد. در این مقاله، مفهوم Namespace، ساختار آن، فضاهای نام پیش‌فرض، نحوه استفاده و اشتباهات رایج در پیاده‌سازی آن را بررسی می‌کنیم.</p>



<h2 class="wp-block-heading" id="h-namespace-در-کوبرنتیز-چیست">Namespace در کوبرنتیز چیست؟</h2>



<p class="wp-block-paragraph">Namespace در کوبرنتیز یک مکانیزم برای تقسیم‌بندی منطقی منابع داخل یک کلاستر است که برای کاهش پیچیدگی مدیریت منابع در محیط‌های چندکاربره و چندپروژه‌ای طراحی شده است. این قابلیت اجازه می‌دهد منابعی مانند Pod ،Service و Deployment در محدوده‌های جداگانه سازمان‌دهی شوند، بدون اینکه نیاز به ایجاد چند کلاستر مستقل باشد.</p>



<p class="wp-block-paragraph">در یک کلاستر کوبرنتیز، زمانی که چند تیم، پروژه یا محیط (مانند dev ،staging و production) به‌صورت همزمان کار می‌کنند، قرار گرفتن همه منابع در یک فضای مشترک می‌تواند باعث پیچیدگی در مدیریت، افزایش احتمال خطا در دسترسی‌ها و دشواری در تفکیک منابع شود. Namespace این مشکل را با ایجاد محدوده‌های منطقی برای منابع حل می‌کند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="818" src="https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-1024x818.webp" alt="Namespace در کوبرنتیز" class="wp-image-5054" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-1024x818.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-300x240.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-768x613.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-120x96.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">با استفاده از Namespace، هر مجموعه از منابع می‌تواند در یک محدوده مستقل قرار گیرد و مدیریت آن‌ها به‌صورت جداگانه انجام شود. این ساختار امکان اعمال سیاست‌های دسترسی و کنترل مصرف منابع را در سطح هر محدوده فراهم می‌کند.</p>



<p class="wp-block-paragraph">نکته مهم این است که Namespaceها یک مرز فیزیکی یا امنیتی در سطح زیرساخت ایجاد نمی‌کنند، بلکه تنها یک جداسازی منطقی در سطح API هستند و منابع همچنان روی یک کلاستر و زیرساخت مشترک اجرا می‌شوند.</p>



<h2 class="wp-block-heading" id="h-namespaceهای-پیش-فرض-در-کوبرنتیز">Namespaceهای پیش‌فرض در کوبرنتیز</h2>



<p class="wp-block-paragraph" id="h-namespaceهای-پیش-فرض-در-کوبرنتیز-در-کوبرنتیز-هنگام-ایجاد-یک-کلاستر-چند-namespace-به-صورت-پیش-فرض-ساخته-می-شوند-که-هر-کدام-نقش-مشخصی-در-ساختار-و-عملکرد-کلاستر-دارند">در کوبرنتیز، هنگام ایجاد یک کلاستر، چند Namespace به‌صورت پیش‌فرض ساخته می‌شوند که هر کدام نقش مشخصی در ساختار و عملکرد کلاستر دارند.</p>



<p class="wp-block-paragraph" id="h-default-این-namespace-اگر-هنگام-ایجاد-منابع-namespace-مشخصی-تعیین-نشده-باشد-منابع-به-صورت-خودکار-در-این-فضا-قرار-می-گیرند"><strong>default:</strong> اگر هنگام ایجاد منابع، Namespace مشخصی تعیین نشده باشد. منابع به‌صورت خودکار در این فضا قرار می‌گیرند.</p>



<p class="wp-block-paragraph" id="h-kube-system-این-namespace-شامل-منابع-و-اجزای-داخلی-کوبرنتیز-است-کامپوننت-هایی-که-برای-عملکرد-کلاستر-ضروری-هستند-مانند-برخی-سرویس-های-سیستمی-از-جمله-kube-dns-kube-proxy-و-در-این-بخش-قرار-دارند"><strong>kube-system</strong>: شامل منابع و اجزای داخلی کوبرنتیز است. کامپوننت‌هایی که برای عملکرد کلاستر ضروری هستند (مانند برخی سرویس‌های سیستمی از جمله kube-dns ،kube-proxy و &#8230;)، در این بخش قرار دارند.</p>



<p class="wp-block-paragraph" id="h-kube-public-namespace-با-نام-kube-public-به-گونه-ای-تنظیم-شده-است-که-به-صورت-عمومی-قابل-خواندن-باشد-این-فضا-برای-منابعی-استفاده-می-شود-که-نیاز-به-دسترسی-عمومی-دارند"><strong>kube-public</strong>: به‌گونه‌ای تنظیم شده است که به‌صورت عمومی قابل خواندن باشد. این فضا برای منابعی استفاده می‌شود که نیاز به دسترسی عمومی دارند.</p>



<p class="wp-block-paragraph" id="h-kube-node-lease-namespace-با-نام-kube-node-lease-برای-نگهداری-آبجکت-های-مربوط-به-lease-نودها-استفاده-می-شود-و-به-مدیریت-وضعیت-نودها-در-کلاستر-کمک-می-کند"><strong>kube-node-lease</strong>: این فضای نام کوبرنتیز به مدیریت وضعیت نودها در کلاستر کمک می‌کند و کوبرنتیز به کمک آن می‌تواند بدون ایجاد بار بیش از حد روی سیستم، از زنده‌بودن نودها مطمئن شود.</p>



<h2 class="wp-block-heading" id="h-namespace-و-rbac-در-کوبرنتیز">Namespace و RBAC در کوبرنتیز</h2>



<p class="wp-block-paragraph">در کوبرنتیز، کنترل دسترسی به منابع از طریق مکانیزم <strong>RBAC (مخفف <strong>Role-Based Access Control</strong>)</strong> انجام می‌شود. این سیستم امکان تعریف سطح دسترسی کاربران و سرویس‌ها را فراهم می‌کند.</p>



<p class="wp-block-paragraph">در RBAC، دو مفهوم اصلی وجود دارد:</p>



<ul class="wp-block-list">
<li><strong>Role</strong>: مجموعه‌ای از مجوزها را تعریف می‌کند. Roleها در کوبرنتیز معمولاً به یک Namespace خاص محدود هستند. این یعنی یک Role فقط روی منابع داخل همان Namespace اعمال می‌شود و به سایر Namespaceها گسترش پیدا نمی‌کند.</li>



<li><strong>RoleBinding</strong>: مجوزهای تعریف شده تحت Role را به یک کاربر، گروه یا سرویس‌اکانت نسبت می‌دهد. RoleBinding نیز می‌تواند یک Role را به موجودیت‌های مختلف در همان Namespace متصل کند. </li>
</ul>



<p class="wp-block-paragraph">برای اعمال دسترسی در سطح کل کلاستر، از ClusterRole و ClusterRoleBinding استفاده می‌شود که خارج از محدوده Namespace عمل می‌کنند.</p>



<p class="wp-block-paragraph">به این ترتیب، Namespace نقش مهمی در محدود کردن دامنه دسترسی‌ها در ساختار RBAC دارد و امکان جداسازی سطح دسترسی بین تیم‌ها و پروژه‌ها را فراهم می‌کند.</p>



<h2 class="wp-block-heading" id="h-namespace-و-مدیریت-منابع-resourcequota-و-limitrange">Namespace و مدیریت منابع (ResourceQuota و LimitRange)</h2>



<p class="wp-block-paragraph">در کوبرنتیز، Namespace فقط برای سازمان‌دهی منابع استفاده نمی‌شود، بلکه می‌تواند برای اعمال محدودیت مصرف منابع نیز کاربرد داشته باشد. </p>



<p class="wp-block-paragraph">با استفاده از مکانیزم <strong>ResourceQuota</strong> می‌توان میزان کل منابع قابل استفاده در یک Namespace را محدود کرد. این محدودیت می‌تواند شامل CPU، حافظه، تعداد پادها و سایر منابع قابل شمارش باشد. این مکانیزم باعث می‌شود مصرف منابع در یک Namespace از حد مشخصی فراتر نرود.</p>



<p class="wp-block-paragraph">در کنار آن، <strong>LimitRange</strong> برای تعریف محدودیت‌های پیش‌فرض یا حداقل و حداکثر مصرف منابع برای هر کانتینر در یک Namespace استفاده می‌شود. این امکان موجب می‌شود که هر پاد یا کانتینر، بدون نیاز به تعریف دستی در هر بار ایجاد، دارای محدودیت‌های مشخصی باشد.</p>



<p class="wp-block-paragraph">این دو مکانیزم در کنار Namespace باعث می‌شوند که مدیریت مصرف منابع در سطح هر Namespace به‌صورت مستقل انجام شود و بتوان برای هر تیم یا پروژه سقف مصرف مشخصی تعریف کرد.</p>



<h2 class="wp-block-heading" id="h-نحوه-ارتباط-بین-namespaceها">نحوه ارتباط بین Namespaceها</h2>



<p class="wp-block-paragraph">در کوبرنتیز، Namespaceها در سطح نام‌گذاری و سازمان‌دهی منابع از هم جدا هستند، اما این جداسازی به‌تنهایی به معنای جداسازی شبکه‌ای نیست.</p>



<p class="wp-block-paragraph">در حالت پیش‌فرض، پادها می‌توانند با استفاده از آدرس‌های شبکه‌ای با یکدیگر ارتباط برقرار کنند؛ حتی اگر در Namespaceهای متفاوت قرار داشته باشند. این ارتباط محدود به Namespace نیست و در صورت عدم وجود محدودیت‌های شبکه‌ای، بین Namespaceها نیز برقرار است. برای مدیریت ارتباط بین پادها در سطح شبکه، از Network Policy استفاده می‌شود. این مکانیزم امکان تعریف قوانین مشخص برای اجازه دادن یا مسدود کردن ترافیک بین پادها را فراهم می‌کند و می‌تواند ارتباط بین Namespaceها را محدود کند.</p>



<p class="wp-block-paragraph">در زمینه DNS، کوبرنتیز برای سرویس‌ها در هر Namespace یک نام دامنه داخلی ایجاد می‌کند. ساختار نام‌گذاری سرویس‌ها به‌گونه‌ای است که شامل نام سرویس و Namespace آن می‌شود و از طریق DNS داخلی کلاستر قابل دسترسی است.</p>



<p class="wp-block-paragraph">به این ترتیب، ارتباط بین Namespaceها هم از طریق شبکه و هم از طریق DNS امکان‌پذیر است، مگر اینکه به‌صورت مشخص با سیاست‌های شبکه محدود شده باشد.</p>



<h2 class="wp-block-heading" id="h-چگونه-در-کوبرنتیز-namespace-جدید-ایجاد-کنیم">چگونه در کوبرنتیز Namespace جدید ایجاد کنیم؟</h2>



<p class="wp-block-paragraph">اگر با مفاهیمی مانند <a href="https://hamravesh.com/blog/what-is-kubernetes-pod/" target="_blank" rel="noreferrer noopener">پاد کوبرنتیز</a> و <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment/" type="link" id="https://hamravesh.com/blog/what-is-kubernetes-deployment/" target="_blank" rel="noreferrer noopener">دیپلویمنت در کوبرنتیز</a> آشنایی داشته باشید، فرایند ساخت یک فضای نام برای‌تان ساده و واضح خواهد بود. برای تعریف Namespace می‌توانید به دو روش اقدام کنید:</p>



<h3 class="wp-block-heading" id="h-روش-اول-ایجاد-namespace-از-طریق-فایل-yaml">روش اول: ایجاد Namespace از طریق فایل YAML</h3>



<p class="wp-block-paragraph">در مرحله اول نیاز است که یک فایل YAML ایجاد کنید. نام آن را <code>my-namespace.yaml</code> قرار داده و اطلاعات زیر را در آن قرار دهید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: v1
kind: Namespace
metadata:
  name: namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Namespace</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<p class="wp-block-paragraph">یکی از بخش‌های مهم فایل مقدار kind است که آن را Namespace قرار داده‌ایم. </p>



<p class="wp-block-paragraph">همچنین نام Namespace جدید را namespace1 قرار داده‌ایم. برای نام‌گذاری مطمئن شوید که در کلاستر مورد نظر، قبلا فضای نام دیگری را با این عنوان ندارید.</p>



<p class="wp-block-paragraph">در قدم بعدی با استفاده از دستور زیر namespace مورد نظر را ایجاد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create -f ./my-namespace.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">create</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-f</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">./my-namespace.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph">برای مشاهده Namespace ساخته شده می‌توانید دستور زیر را وارد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get namespace namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">get</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<p class="wp-block-paragraph">همچنین برای مشاهده جزئیات بیشتر Namespace ساخته شده، دستور زیر را وارد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl describe namespace namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">describe</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-روش-دوم-ایجاد-namespace-بدون-فایل-yaml">روش دوم: ایجاد Namespace بدون فایل YAML</h3>



<p class="wp-block-paragraph">یک روش بسیار ساده‌تر برای ایجاد فضای نام کوبرنتیز استفاده از دستور زیر است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create namespace namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">create</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-اشتباهات-رایج-در-استفاده-از-namespace-کوبرنتیز">اشتباهات رایج در استفاده از Namespace کوبرنتیز</h2>



<p class="wp-block-paragraph">Namespace در کوبرنتیز یک ابزار سازمان‌دهی و جداسازی منطقی منابع است، اما استفاده نادرست از آن می‌تواند باعث پیچیدگی در مدیریت کلاستر و کاهش بهره‌وری شود.</p>



<p class="wp-block-paragraph">یکی از اشتباهات رایج این است که از Namespace به‌عنوان مرز کامل امنیتی استفاده می‌شود. در حالی که Namespace به‌تنهایی تضمین‌کننده ایزوله‌سازی کامل نیست و برای کنترل امنیت باید از مکانیزم‌هایی مانند Network Policy و RBAC استفاده شود.</p>



<p class="wp-block-paragraph">اشتباه رایج دیگر، ایجاد تعداد زیاد Namespace برای هر سرویس یا هر جزء کوچک سیستم است. این کار باعث افزایش پیچیدگی در مدیریت منابع، سیاست‌ها و مانیتورینگ می‌شود و معمولاً (به استثنا سناریو‌های خاص) توصیه نمی‌شود.</p>



<p class="wp-block-paragraph">از دیگر خطاهای متداول، عدم تعریف سیاست‌های منابع در سطح Namespace است. در چنین حالتی ممکن است یک تیم یا سرویس، مصرف منابع را بدون محدودیت افزایش دهد و روی سایر بخش‌های کلاستر تأثیر بگذارد.</p>



<p class="wp-block-paragraph">همچنین استفاده نکردن از استاندارد مشخص برای نام‌گذاری Namespaceها باعث سردرگمی در محیط‌های چند تیمی و چند پروژه‌ای می‌شود.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p class="wp-block-paragraph">Namespace در کوبرنتیز یک مکانیزم برای سازمان‌دهی منابع داخل یک کلاستر است که امکان تفکیک منطقی بین تیم‌ها، پروژه‌ها و محیط‌های مختلف را فراهم می‌کند. این قابلیت کمک می‌کند منابعی مانند Pod ،Service و Deployment در محدوده‌های جداگانه مدیریت شوند؛ بدون اینکه نیاز به ایجاد چند کلاستر مستقل باشد.</p>



<p class="wp-block-paragraph">Namespaceها همچنین نقش مهمی در کنترل دسترسی و مدیریت سیاست‌ها دارند. با استفاده از آن‌ها می‌توان محدوده اعمال RBAC را مشخص کرد و همچنین از طریق ResourceQuota و LimitRange مصرف منابع را در هر محدوده کنترل کرد.</p>



<p class="wp-block-paragraph">با وجود این قابلیت‌ها، Namespace به‌تنهایی یک مرز امنیتی کامل محسوب نمی‌شود و برای ایزوله‌سازی شبکه یا اعمال محدودیت‌های امنیتی دقیق‌تر باید از ابزارهای تکمیلی مانند Network Policy استفاده شود. در نتیجه، Namespace بیشتر از این‌که یک مکانیزم برای ایزوله‌سازی در سطح زیرساخت باشد، یک ابزار برای ساختاردهی، مدیریت و کنترل منابع در سطح منطقی است.</p>



<p class="wp-block-paragraph">در برخی پلتفرم‌های مبتنی بر کوبرنتیز، امکان استفاده از Namespace به‌صورت یکپارچه فراهم شده تا تیم‌ها بتوانند منابع، دسترسی‌ها و محیط‌های مختلف را ساده‌تر مدیریت کنند. به‌عنوان مثال، <a href="https://hamravesh.com/darkube" type="link" id="https://hamravesh.com/darkube" target="_blank" rel="noreferrer noopener">سرویس دارکوب</a> هم‌روش این قابلیت را در اختیار شما قرار می‌دهند تا بدون درگیر شدن با پیچیدگی‌های زیرساخت، از مزایای Namespace در مدیریت پروژه‌های خود استفاده کنید.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/">آشنایی با مفهوم Namespace در کوبرنتیز؛ آموزش نحوه ساخت</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-namespace/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با Workload در کوبرنتیز؛ انواع و کاربردها</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-workloads/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-workloads/#respond</comments>
		
		<dc:creator><![CDATA[ارسطو عباسی]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3104</guid>

					<description><![CDATA[<p>Workload در کوبرنتیز به مجموعه‌ای از کانتینرها اطلاق می‌شود که یک برنامه یا سرویس را اجرا می‌کنند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-workloads/">آشنایی با Workload در کوبرنتیز؛ انواع و کاربردها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Workload در کوبرنتیز یکی از مفاهیم کلیدی برای اجرای برنامه‌ها در محیط‌های ابری و مقیاس‌پذیر است. وقتی صحبت از اجرای یک برنامه در کوبرنتیز می‌شود، فقط اجرای چند کانتینر مطرح نیست، بلکه نحوه مدیریت، مقیاس‌دهی و نگهداری آن برنامه نیز اهمیت پیدا می‌کند. در چنین شرایطی، شناخت Workloadها و تفاوت بین انواع آن‌ها به شما کمک می‌کند تصمیم بگیرید که هر برنامه را چگونه اجرا و مدیریت کنید. در این مقاله، به‌صورت ساده و کاربردی به بررسی مفهوم Workload در کوبرنتیز و انواع آن می‌پردازیم.</p>



<h2 class="wp-block-heading" id="h-workload-در-کوبرنتیز-چیست">Workload در کوبرنتیز چیست؟</h2>



<p class="wp-block-paragraph">Workload در <a href="https://hamravesh.com/blog/what-is-kubernetes" type="link" id="https://hamravesh.com/blog/what-is-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز </a>برنامه یا سرویسی است که روی کلاستر اجرا می‌شود و نحوه استقرار، اجرا و مقیاس‌دهی آن بر اساس وضعیت مورد انتظار (desired state) مشخص می‌شود. کوبرنتیز این وضعیت را دریافت کرده و با استفاده از مکانیزم‌های خود، اجرای برنامه را مدیریت می‌کند تا وضعیت واقعی (actual state) با وضعیت مورد انتظار مطابقت داشته باشد.</p>



<p class="wp-block-paragraph">Workloadها معمولاً در قالب مجموعه‌ای از پادها اجرا می‌شوند (هر پاد شامل یک یا چند کانتینر است). به‌جای اینکه کاربر مستقیماً پادها را مدیریت کند، کوبرنتیز از منابعی مانند Deployment ،StatefulSet و Job استفاده می‌کند تا این وضعیت را به‌صورت خودکار اعمال و کنترل کند.</p>



<h2 class="wp-block-heading">انواع Workload در کوبرنتیز</h2>



<p class="wp-block-paragraph" id="h-در-kubernetes-انواع-مختلفی-از-workload-وجود-دارد-که-هرکدام-برای-نیازهای-خاصی-طراحی-شده-اند-این-workloadها-رفتار-اجرای-برنامه-ها-مقیاس-دهی-و-نحوه-مدیریت-وضعیت-آن-ها-را-کنترل-می-کنند-در-ادامه-مهم-ترین-انواع-workload-و-کاربرد-هر-یک-را-بررسی-می-کنیم">در کوبرنتیز انواع مختلفی از Workload وجود دارد که هرکدام برای نیازهای خاصی طراحی شده‌اند. این Workloadها رفتار اجرای برنامه‌ها، مقیاس‌دهی و نحوه مدیریت وضعیت آن‌ها را کنترل می‌کنند. در ادامه، مهم‌ترین انواع Workload و کاربرد هر یک را بررسی می‌کنیم.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="587" src="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-workload2-1024x587.webp" alt="انواع Workload در کوبرنتیز" class="wp-image-5021" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-workload2-1024x587.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-workload2-300x172.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-workload2-768x440.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-workload2-120x69.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-workload2.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading" id="h-pod">Pod</h3>



<p class="wp-block-paragraph"><a href="https://hamravesh.com/blog/what-is-kubernetes-pod" target="_blank" rel="noreferrer noopener">پاد در کوبرنتیز</a> کوچک‌ترین واحد اجرایی است که یک یا چند کانتینر را در خود جای می‌دهد. کانتینرهای داخل یک پاد منابع شبکه و ذخیره‌سازی مشترک دارند و به‌صورت یک واحد منطقی مدیریت می‌شوند. هر پاد یک آدرس IP یکتا دارد و کانتینرهای درون آن می‌توانند به‌راحتی با یکدیگر ارتباط برقرار کنند.</p>



<p class="wp-block-paragraph"><strong>کاربردهای Pod</strong></p>



<ul class="wp-block-list">
<li>اجرای چند کانتینر که باید با هم و همزمان کار کنند، مانند یک وب‌سرور و یک کانتینر لاگ‌گیری مرتبط</li>



<li>اجرای یک کانتینر ساده که نیازی به مقیاس‌پذیری ندارد</li>
</ul>



<h3 class="wp-block-heading" id="h-deployment">Deployment</h3>



<p class="wp-block-paragraph"><a href="https://hamravesh.com/blog/what-is-kubernetes-deployment" target="_blank" rel="noreferrer noopener">دیپلویمنت در کوبرنتیز</a> یکی از کنترلرهای اصلی است که برای مدیریت اجرای پادهای مشابه و به‌روزرسانی آن‌ها به‌صورت خودکار استفاده می‌شود. با Deployment می‌توان برنامه‌ها را مستقر، مقیاس‌دهی و نسخه‌های آن‌ها را به‌روزرسانی کرد یا در صورت نیاز به حالت قبلی بازگرداند.</p>



<p class="wp-block-paragraph"><strong>کاربردهای Deployment</strong></p>



<ul class="wp-block-list">
<li>اجرای برنامه‌هایی که نیاز به مقیاس‌پذیری دارند</li>



<li>مدیریت به‌روزرسانی تدریجی نسخه‌ها (Rolling Update) و امکان بازگشت (Rollback)</li>



<li>توزیع بار کاری بین چندین پاد مشابه برای افزایش دسترس‌پذیری</li>
</ul>



<h3 class="wp-block-heading" id="h-statefulset">StatefulSet</h3>



<p class="wp-block-paragraph">StatefulSet برای مدیریت برنامه‌هایی طراحی شده است که نیاز به حالت پایدار و هویت یکتا برای هر Pod دارند. برخلاف دیپلویمنت، StatefulSet تضمین می‌کند که هر پاد یک شناسه منحصربه‌فرد داشته باشد و ترتیب ایجاد یا حذف آن‌ها حفظ شود.</p>



<p class="wp-block-paragraph"><strong><strong>کاربردهای </strong>StatefulSet</strong></p>



<ul class="wp-block-list">
<li>اجرای برنامه‌های stateful مانند پایگاه‌های داده (مثلاً MySQL یا PostgreSQL)</li>



<li>سرویس‌هایی که نیاز به شناسه و ترتیب خاص برای پادها دارند، مانند Zookeeper یا Cassandra</li>



<li>هنگامی که نیاز است داده‌های هر Pod پس از حذف یا بازسازی حفظ شود</li>
</ul>



<h3 class="wp-block-heading" id="h-daemonset">DaemonSet</h3>



<p class="wp-block-paragraph"><strong>DaemonSet</strong> نوعی Workload در کوبرنتیز است که تضمین می‌کند یک Pod روی همه یا گروه خاصی از نودها اجرا شود. این نوع ورک لود معمولاً برای وظایف سیستمی یا پس‌زمینه که باید روی تمام نودها فعال باشند، استفاده می‌شود.</p>



<p class="wp-block-paragraph" id="h-موارد-کاربرد-daemonset"><strong>کاربردهای DaemonSet</strong></p>



<ul class="wp-block-list">
<li>جمع‌آوری لاگ‌ها و متریک‌ها از تمام نودها</li>



<li>اجرای ابزارهای مانیتورینگ یا امنیتی روی همه نودها</li>



<li>نصب و مدیریت نرم‌افزارهایی که باید در تمام نودها اجرا شوند</li>
</ul>



<h3 class="wp-block-heading">Job</h3>



<p class="wp-block-paragraph">Job نوعی Workload در کوبرنتیز است که برای اجرای وظایف موقت و تک‌مرحله‌ای کاربرد دارد. Job تضمین می‌کند که Pod مربوطه تا تکمیل موفقیت‌آمیز کار، اجرا شود.</p>



<p class="wp-block-paragraph" id="h-کاربردهای-معمول-job"><strong>کاربردهای Job</strong></p>



<ul class="wp-block-list">
<li>پردازش دسته‌ای داده‌ها (batch processing)</li>



<li>اجرای اسکریپت یا فرایندهای موقتی مثل بکاپ‌گیری</li>



<li>عملیات‌هایی که فقط یک‌بار و تا تکمیل شدن لازم است اجرا شوند</li>
</ul>



<h3 class="wp-block-heading">CronJob</h3>



<p class="wp-block-paragraph"><a href="https://hamravesh.com/blog/cronjob-kubernetes" target="_blank" rel="noreferrer noopener">CronJob در کوبرنتیز</a> نسخه زمان‌بندی‌شده Job است که مشابه cron در لینوکس امکان اجرای وظایف به صورت دوره‌ای و با زمان‌بندی قبلی را فراهم می‌کند. CronJob زمانی کاربرد دارد که نیاز باشد یک وظیفه به صورت منظم و خودکار تکرار شود.</p>



<p class="wp-block-paragraph" id="h-کاربردهای-معمول-cronjob"><strong>کاربردهای CronJob</strong></p>



<ul class="wp-block-list">
<li>اجرای وظایف دوره‌ای مانند ارسال گزارش‌های ایمیل</li>



<li>پاکسازی دوره‌ای داده‌ها یا maintenanceهای زمان‌بندی شده</li>



<li>هر وظیفه‌ای که باید در فواصل زمانی مشخص تکرار شود</li>
</ul>



<h2 class="wp-block-heading">کاربردهای Workload در کوبرنتیز</h2>



<p class="wp-block-paragraph">Workloadها نقش کلیدی در اجرای برنامه‌ها و سرویس‌ها روی کوبرنتیز دارند و به مدیریت مؤثر برنامه‌ها در یک محیط مقیاس‌پذیر کمک می‌کنند. برخی از کاربردهای اصلی ورک لود عبارت‌اند از:</p>



<ol class="wp-block-list">
<li><strong>اجرای برنامه‌های وب و سرویس‌ها</strong><br>با استفاده از Deployment و ReplicaSet می‌توان برنامه‌های وب و سرویس‌ها را به‌صورت مداوم و مقیاس‌پذیر اجرا کرد. این Workloadها همچنین به‌روزرسانی نسخه‌ها و مقیاس‌دهی پویا را تسهیل می‌کنند.</li>



<li><strong>مدیریت وظایف موقت و یک‌باره</strong><br>Job برای اجرای وظایف موقت و تک‌مرحله‌ای مناسب است و CronJob همان وظایف را به صورت زمان‌بندی‌شده اجرا می‌کند. برای مثال، می‌توان از Job برای پردازش داده‌ها و از CronJob برای پاکسازی یا بکاپ‌گیری دوره‌ای استفاده کرد.</li>



<li><strong>اجرای برنامه‌های Stateful</strong><br>StatefulSet برای برنامه‌هایی مانند پایگاه‌های داده و سیستم‌های ذخیره‌سازی کاربرد دارد؛ زیرا ترتیب و هویت یکتا برای هر پاد را حفظ می‌کند.</li>



<li><strong>اجرای وظایف سیستمی و سرویس‌های پس‌زمینه</strong><br>DaemonSet برای اجرای ابزارهای مانیتورینگ، جمع‌آوری لاگ‌ها و وظایف امنیتی روی هر نود استفاده می‌شود و تضمین می‌کند که این پادها روی تمام نودهای هدف اجرا شوند.</li>



<li><strong>مدیریت بار کاری توزیع‌شده</strong><br>کوبرنتیز می‌تواند با استفاده از مقیاس‌دهی خودکار (Auto-Scaling) تعداد پادها را بر اساس میزان بار کاری و معیارهای تعریف‌شده افزایش یا کاهش دهد. این ویژگی بهره‌وری منابع را بهبود می‌بخشد و هزینه‌ها را کاهش می‌دهد.</li>



<li><strong>اجرای برنامه‌های مایکروسرویس و پشتیبانی از CI/CD</strong><br>با ترکیب Deployment برای مدیریت نسخه‌ها و مقیاس‌دهی، Service برای دسترسی و load balancing داخلی و Gateway یا Ingress برای مدیریت ترافیک ورودی، می‌توان برنامه‌های مایکروسرویس را به صورت مقیاس‌پذیر و قابل مدیریت اجرا کرد. کوبرنتیز همچنین با ابزارهای <a href="https://hamravesh.com/blog/what-is-ci-cd" type="link" id="https://hamravesh.com/blog/what-is-ci-cd" target="_blank" rel="noreferrer noopener">CI/CD</a> یکپارچه می‌شود تا فرایند توسعه، تست و انتشار نرم‌افزار به‌صورت خودکار انجام شود.</li>



<li><strong>بهبود دسترس‌پذیری و تاب‌آوری</strong><br>با توزیع بارکاری بین نودهای مختلف و استفاده از مکانیزم‌های بازسازی خودکار، کوبرنتیز به افزایش دسترس‌پذیری و تاب‌آوری برنامه‌ها کمک می‌کند.</li>
</ol>



<h2 class="wp-block-heading" id="h-مقایسه-کلی-انواع-workload-در-کوبرنتیز">مقایسه کلی انواع Workload در کوبرنتیز</h2>



<p class="wp-block-paragraph">کوبرنتیز انواع مختلفی از Workloadها را ارائه می‌دهد که هرکدام برای سناریوهای خاص طراحی شده‌اند. در ادامه، ویژگی‌های کلیدی، کاربرد و نوع اجرای هر Workload خلاصه شده است:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Workload</strong></th><th><strong>هدف اصلی</strong></th><th><strong>تعداد Podها</strong></th><th><strong>حالت داده / هویت</strong></th><th><strong>مقیاس‌دهی</strong></th><th><strong>مثال‌های رایج</strong></th></tr></thead><tbody><tr><td><strong>Pod</strong></td><td>کوچک‌ترین واحد اجرایی</td><td>یک</td><td>وابسته به نوع پاد</td><td>دستی</td><td>اجرای یک کانتینر ساده</td></tr><tr><td><strong>Deployment</strong></td><td>مدیریت نسخه‌ها و مقیاس‌دهی</td><td>چند رپلیکا</td><td>Stateless</td><td>خودکار / دستی</td><td>برنامه‌های وب و سرویس‌های مقیاس‌پذیر</td></tr><tr><td><strong>StatefulSet</strong></td><td>مدیریت برنامه‌های Stateful</td><td>چند رپلیکا</td><td>Stateful</td><td>عمدتا دستی</td><td>دیتابیس‌ها، Zookeeper ،Cassandra</td></tr><tr><td><strong>DaemonSet</strong></td><td>هر نود یک پاد</td><td>هر نود هدف</td><td>وابسته به Workload</td><td>خودکار</td><td>مانیتورینگ و جمع‌آوری لاگ</td></tr><tr><td><strong>Job</strong></td><td>اجرای موقت تا پایان</td><td>۱ یا چند (موازی)</td><td>Stateless</td><td>خودکار</td><td>پردازش دسته‌ای و بکاپ‌گیری</td></tr><tr><td><strong>CronJob</strong></td><td>اجرای زمان‌بندی شده Job</td><td>۱ یا چند (موازی)</td><td>Stateless</td><td>خودکار</td><td>وظایف دوره‌ای و پاکسازی داده</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-سخن-پایانی">سخن پایانی</h2>



<p class="wp-block-paragraph">Workload در کوبرنتیز هسته اصلی اجرای برنامه‌ها روی کلاستر است و تعیین می‌کند که هر برنامه چگونه اجرا، مقیاس‌دهی و مدیریت شود. همان‌طور که دیدیم، انواع مختلفی از Workloadها وجود دارند که هرکدام برای سناریوهای مشخصی طراحی شده‌اند. انتخاب درست Workload تأثیر مستقیمی بر عملکرد، پایداری و مقیاس‌پذیری برنامه دارد. برای مثال، Deployment برای برنامه‌های Stateless و StatefulSet برای برنامه‌های دارای داده پایدار و Job یا CronJob برای وظایف موقت و زمان‌بندی‌شده مناسب هستند. در نهایت، درک دقیق مفهوم Workload در کوبرنتیز و شناخت تفاوت بین انواع آن، به شما کمک می‌کند تصمیم‌های بهتری در طراحی و اجرای برنامه‌ها بگیرید و از امکانات Kubernetes به‌صورت مؤثرتر استفاده کنید.</p>



<p class="wp-block-paragraph">اگر قصد دارید از این مفاهیم در عمل استفاده کنید، پلتفرم‌‌‌های ابری می‌توانند این مسیر را ساده‌تر کنند. برای مثال <a href="https://hamravesh.com/darkube" target="_blank" rel="noreferrer noopener">پلتفرم ابری دارکوب</a> هم‌روش این امکان را فراهم می‌کند که تنها با یک داکرفایل، برنامه خود را بر بستر کوبرنتیز اجرا کنید. علاوه بر این <a href="https://hamravesh.com/managed-kubernetes" type="link" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز مدیریت‌شده</a> هم‌روش به صورت اختصاصی (کلاستر ابری یا on-premises) به سازمان‌ها ارائه می‌شود. </p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-workloads/">آشنایی با Workload در کوبرنتیز؛ انواع و کاربردها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-workloads/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>خود ترمیمی کوبرنتیز چیست؟ بررسی مکانیزم Self-Healing در کوبرنتیز</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-self-healing/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-self-healing/#respond</comments>
		
		<dc:creator><![CDATA[ارسطو عباسی]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 12:30:10 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=4110</guid>

					<description><![CDATA[<p>خود ترمیمی کوبرنتیز یا Self-Healing یکی از قابلیت‌های حیاتی این پلتفرم برای مدیریت کانتینرها است که به سرویس‌ها کمک می‌کند حتی در شرایط غیرمنتظره، پایدار و قابل اعتماد باقی بمانند. این ویژگی ترکیبی از هوشمندی و اتوماسیون است و بهبود کیفیت و دسترس‌پذیری سرویس‌ها و کاهش بار کاری تیم‌ها را به همراه دارد. در این [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-self-healing/">خود ترمیمی کوبرنتیز چیست؟ بررسی مکانیزم Self-Healing در کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">خود ترمیمی کوبرنتیز یا Self-Healing یکی از قابلیت‌های حیاتی این پلتفرم برای مدیریت کانتینرها است که به سرویس‌ها کمک می‌کند حتی در شرایط غیرمنتظره، پایدار و قابل اعتماد باقی بمانند. این ویژگی ترکیبی از هوشمندی و اتوماسیون است و بهبود کیفیت و دسترس‌پذیری سرویس‌ها و کاهش بار کاری تیم‌ها را به همراه دارد. در این مطلب نحوه عملکرد Self-Healing کوبرنتیز،‌ ابزارهای آن و مزایا و معایب را بررسی می‌کنیم.</p>



<h2 class="wp-block-heading" id="h-خود-ترمیمی-یا-self-healing-در-کوبرنتیز-چیست">خود ترمیمی یا Self-healing در کوبرنتیز چیست؟</h2>



<p class="wp-block-paragraph">قابلیت خود ترمیمی در کوبرنتیز فرایندی است که به‌طور خودکار مشکلات پادها و کانتینرها را شناسایی و برطرف می‌کند و در صورت بروز مشکل در نود، پادها را روی نودهای سالم مجدداً اجرا می‌کند. این ویژگی باعث کاهش نیاز به مداخله انسانی و افزایش دسترس‌پذیری سرویس‌ها می‌شود. خودترمیمی در کوبرنتیز در سطح پاد اعمال می‌شود، اما با استفاده از مکانیزم‌هایی در سطح کانتینر (مانند راه‌اندازی مجدد کانتینر) و سطح نود (مانند زمان‌بندی مجدد پادها روی نودهای سالم) تکمیل می‌شود.</p>



<p class="wp-block-paragraph"><strong>عملکرد خود ترمیمی در سطوح مختلفی انجام می‌شود:</strong></p>



<ul class="wp-block-list">
<li><strong>سطح پاد:</strong>
<ul class="wp-block-list">
<li>در صورت پیکربندی Liveness Probe، وضعیت کانتینرها به‌صورت دوره‌ای بررسی می‌شود.</li>



<li>اگر کانتینر از کار بیفتد یا پاسخ ندهد، کوبرنتیز آن را دوباره راه‌اندازی می‌کند.</li>



<li>این مکانیزم اطمینان می‌دهد که <a href="https://hamravesh.com/blog/what-is-kubernetes-pod" target="_blank" rel="noreferrer noopener">پاد در کوبرنتیز</a> همیشه در وضعیت سالم باقی بماند.</li>
</ul>
</li>



<li><strong>سطح نود:</strong>
<ul class="wp-block-list">
<li>اگر یک نود از دسترس خارج شود، کنترلر نود، پادهای آن نود را روی نودهای سالم مجدداً زمان‌بندی (reschedule) و اجرا می‌کند.</li>



<li>این فرایند وضعیت مطلوب (Desired State) را برای کل کلاستر حفظ می‌کند.</li>
</ul>
</li>



<li><strong>سطح StatefulSet:</strong>
<ul class="wp-block-list">
<li>پادها با حفظ هویت و اتصال به داده‌های ماندگار (Persistent Storage) مجدداً اجرا می‌شوند.</li>



<li>این امکان را می‌دهد که سرویس‌ها حتی پس از کرش کردن یا ری‌استارت پادها، به حالت پایدار خود بازگردند.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading" id="h-خود-ترمیمی-کوبرنتیز-چگونه-کار-می-کند">خود ترمیمی کوبرنتیز چگونه کار می‌کند؟</h2>



<p class="wp-block-paragraph">قابلیت خود ترمیمی در کوبرنتیز با استفاده از <a href="https://hamravesh.com/blog/what-is-kubernetes-controller" target="_blank" rel="noreferrer noopener">کنترلرهای کوبرنتیز</a> و نظارت مداوم بر وضعیت پادها و نودها، سلامت سیستم را حفظ می‌کند. این ویژگی وضعیت فعلی سیستم را با وضعیت مطلوب تعریف‌شده مقایسه می‌کند و در صورت مشاهده ناهنجاری، اقدامات اصلاحی را به‌طور خودکار اجرا می‌کند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="570" src="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-self-healing-2-1024x570.webp" alt="خودترمیمی کوبرنتیز چگونه کار می‌کند؟" class="wp-image-4968" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-self-healing-2-1024x570.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-self-healing-2-300x167.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-self-healing-2-768x427.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-self-healing-2-120x67.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-self-healing-2.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">فرایند خود ترمیمی کوبرنتیز به صورت مرحله‌ای اجرا می‌شود:</p>



<ul class="wp-block-list">
<li><strong>شناسایی مشکل:</strong> کنترلرها وضعیت پادها و نودها را بررسی می‌کنند تا مشکلات یا عدم تطابق با وضعیت مطلوب را تشخیص دهند.</li>



<li><strong>تصمیم‌گیری بر اساس وضعیت مطلوب:</strong> سیستم مشخص می‌کند چه اقداماتی برای بازگرداندن وضعیت پایدار لازم است.</li>



<li><strong>اجرای اقدامات اصلاحی:</strong> پادها یا نودهای مشکل‌دار راه‌اندازی مجدد یا جایگزین می‌شوند تا سرویس‌ها در وضعیت پایدار باقی بمانند.</li>
</ul>



<h2 class="wp-block-heading" id="h-ابزارهای-اصلی-خود-ترمیمی">ابزارهای اصلی خود ترمیمی</h2>



<p class="wp-block-paragraph">برای اجرای قابلیت خود ترمیمی، کوبرنتیز از ابزارها و مکانیزم‌های مختلفی استفاده می‌کند که هر کدام نقش مشخصی در حفظ سلامت پادها و نودها دارند. مهم‌ترین ابزارهای خود ترمیمی عبارتند از:</p>



<ul class="wp-block-list">
<li><strong>Liveness Probe:</strong> بررسی وضعیت زنده بودن کانتینر و راه‌اندازی مجدد خودکار در صورت از کار افتادن</li>



<li><strong>Readiness Probe:</strong> تشخیص آماده بودن پاد برای دریافت ترافیک و حذف پادهای غیرفعال از مسیرهای ترافیک</li>



<li><strong>کنترلرها (Controllers):</strong> مدیریت وضعیت فعلی پادها و نودها و اجرای اقدامات اصلاحی خودکار بر اساس وضعیت مطلوب. به عنوان مثال، کنترلرها با استفاده از ReplicaSets تعداد مشخصی از پادها را حفظ و در صورت نیاز پادهای جدید ایجاد می‌کنند.</li>
</ul>



<h2 class="wp-block-heading" id="h-مزایای-خود-ترمیمی-در-کوبرنتیز">مزایای خود ترمیمی در کوبرنتیز</h2>



<p class="wp-block-paragraph">قابلیت خود ترمیمی، مدیریت برنامه‌های کانتینری را قابل اعتمادتر و کارآمدتر می‌کند و مزایای زیر را به همراه دارد:</p>



<ul class="wp-block-list">
<li><strong>افزایش دسترس‌پذیری و پایداری:</strong> مشکلات پادها و کانتینرها به‌طور خودکار شناسایی و رفع می‌شوند، بنابراین برنامه‌ها با کمترین downtime در دسترس باقی می‌مانند.</li>



<li><strong>کاهش نیاز به دخالت انسانی:</strong> با خود ترمیمی، تیم‌های عملیات و مهندسی، کمتر درگیر رفع مشکلات جزئی یا پیش‌بینی‌نشده می‌شوند و در نتیجه می‌توانند تمرکز خود را روی توسعه و بهینه‌سازی نرم‌افزار بگذارند.</li>



<li><strong>سرعت بالا در رفع مشکلات:</strong> اقدامات اصلاحی به‌صورت خودکار و بلادرنگ انجام می‌شوند.</li>



<li><strong>مدیریت بهتر محیط‌های گذرا (Ephemeral Environments):</strong> محیط‌های کانتینری ماهیت موقتی دارند و ممکن است کانتینرها بارها و بارها حذف یا راه‌اندازی مجدد شوند. خودترمیمی کوبرنتیز تضمین می‌کند که حتی در صورت حذف یا راه‌اندازی مجدد مکرر پادها، پایداری سرویس حفظ شود.</li>
</ul>



<h2 class="wp-block-heading" id="h-معایب-خود-ترمیمی-در-کوبرنتیز">معایب خود ترمیمی در کوبرنتیز</h2>



<p class="wp-block-paragraph">خود ترمیمی کوبرنتیز هم مانند هر فناوری دیگری، محدودیت‌هایی دارد که باید در نظر گرفته شوند:</p>



<ul class="wp-block-list">
<li><strong>نیاز به تعریف وضعیت مطلوب:</strong> خود ترمیمی بر اساس وضعیت مطلوب (Desired State) عمل می‌کند که باید توسط تیم مدیریت کوبرنتیز تعریف شود.</li>



<li><strong>محدودیت در لایه اپلیکیشن:</strong> خود ترمیمی عمدتاً در سطح پاد و کانتینر عمل می‌کند و شناسایی و رفع مشکلات زیرساختی یا سخت‌افزاری (مانند خرابی سرور یا شبکه) نیاز به ابزارهای اضافی دارند.</li>



<li><strong>نیاز به نظارت مداوم:</strong> تیم‌ها باید همچنان سیستم را زیر نظر داشته باشند تا از عملکرد صحیح خود ترمیمی اطمینان حاصل شود.</li>



<li><strong>پیچیدگی پیکربندی:</strong> تنظیم دقیق Liveness Probe ،Readiness Probe و ReplicaSet می‌تواند چالش‌برانگیز باشد و خطا در آن‌ها منجر به راه‌اندازی مجدد غیرضروری یا تشخیص اشتباه شود.</li>



<li><strong>ابزارهای مکمل برای زیرساخت:</strong> برای مدیریت خطاهای نود یا سخت‌افزار، نیازمند استفاده از ابزارهای نظارتی اضافی شامل پرومتئوس و گرافانا است.</li>
</ul>



<h2 class="wp-block-heading" id="h-سخن-پایانی">سخن پایانی</h2>



<p class="wp-block-paragraph">قابلیت خود ترمیمی در کوبرنتیز یکی از ابزارهای کلیدی برای افزایش پایداری و دسترس‌پذیری برنامه‌ها است. با شناسایی خودکار مشکلات، مقایسه وضعیت فعلی با وضعیت مطلوب و اجرای اقدامات اصلاحی، سیستم می‌تواند بدون دخالت مستقیم انسان، پادها و کانتینرها را در حالت عملیاتی حفظ کند.</p>



<p class="wp-block-paragraph">این ویژگی به تیم‌های فنی امکان می‌دهد زمان کمتری را صرف رفع مشکلات پیش‌بینی‌نشده کنند و تمرکز بیشتری روی توسعه و بهینه‌سازی نرم‌افزار داشته باشند. با این حال، استفاده مؤثر از خود ترمیمی نیازمند تعریف دقیق وضعیت مطلوب، پیکربندی صحیح ابزارها و نظارت مستمر است. همچنین، این قابلیت به تنهایی نمی‌تواند مشکلات زیرساختی را پوشش دهد و ممکن است نیاز به ابزارهای مکمل برای مدیریت نودها، شبکه و منابع سخت‌افزاری باشد.</p>



<p class="wp-block-paragraph">در چنین شرایطی، استفاده از یک پلتفرم مدیریت کوبرنتیز می‌تواند پیچیدگی‌های مرتبط با پیاده‌سازی و نظارت بر Self-Healing را کاهش دهد. برای مثال، <a href="https://hamravesh.com/darkube" target="_blank" rel="noreferrer noopener">پلتفرم ابری دارکوب</a> تجربه زیرساخت مبتنی بر کوبرنتیز را به ساده‌ترین شکل ممکن فراهم می‌کند و به تیم‌ها امکان می‌دهد برنامه‌های خود را بر بستر کوبرنتیز اجرا کرده و اپلیکیشن‌های پرکاربرد را با تنظیمات دلخواه بسازند.</p>



<p class="wp-block-paragraph">در نهایت، خودترمیمی یک گام مهم در خودکارسازی مدیریت زیرساخت و افزایش اعتمادپذیری سرویس‌ها است؛ به شرطی که مزایا و محدودیت‌های آن به‌درستی در نظر گرفته شوند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-self-healing/">خود ترمیمی کوبرنتیز چیست؟ بررسی مکانیزم Self-Healing در کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-self-healing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با کنترلر کوبرنتیز؛ مقایسه با اپراتور کوبرنتیز</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-controller/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-controller/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2935</guid>

					<description><![CDATA[<p>کنترلرها حلقه‌های بی‌پایانی از بررسی کلاستر کوبرنتیز هستند که در صورت مشاهده مشکلی، آن را حل می‌کنند. در این مطلب قصد داریم با انواع کنترلرها در کوبرنتیز آشنا شویم.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-controller/">آشنایی با کنترلر کوبرنتیز؛ مقایسه با اپراتور کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">کنترلر کوبرنتیز یکی از مفاهیم کلیدی در مدیریت کلاسترهاست که به شما کمک می‌کند وضعیت منابع و پادها همواره پایدار و مطابق با وضعیت مطلوب (Desired State) باقی بماند. با استفاده از کنترلرها، بسیاری از وظایف تکراری و مدیریتی به‌صورت خودکار انجام می‌شود و نیاز به دخالت دستی کاهش می‌یابد. علاوه بر کنترلرها، اپراتور کوبرنتیز لایه‌ای پیشرفته‌تر فراهم می‌کند تا مدیریت اپلیکیشن‌های پیچیده و stateful را نیز خودکار کرده و فرایندهایی مانند نصب، به‌روزرسانی، مقیاس‌دهی و بازیابی را بهبود بخشد. در این مطلب بررسی می‌‌کنیم که کنترلر کوبرنتیز چیست، چگونه کار می‌کند و چه تفاوتی با اپراتور کوبرنتیز دارد. </p>



<h2 class="wp-block-heading">کنترلر کوبرنتیز چیست؟</h2>



<p class="wp-block-paragraph">کنترلرها اجزای بنیادی کوبرنتیز هستند که برای مدیریت و نگهداری وضعیت منابع طراحی شده‌اند. این اجزا با بررسی مداوم وضعیت فعلی منابع و مقایسه آن با وضعیت مطلوب (Desired State)، اطمینان حاصل می‌کنند که کلاستر همیشه در شرایط پایدار باقی بماند. به عبارت دیگر، کنترلرها به صورت حلقه‌های کنترلی (Control Loops) عمل می‌کنند تا به صورت خودکار وضعیت منابع را اصلاح و هماهنگ کنند.</p>



<h2 class="wp-block-heading">کنترلر کوبرنتیز چگونه کار می‌کنند؟</h2>



<p class="wp-block-paragraph">عملکرد کنترلرها را می‌توان با مثال یک ترموستات ساده توضیح داد. فرض کنید ترموستات برای حفظ دمای اتاق روی یک مقدار مشخص تنظیم شده است. در این حالت دمای تنظیم‌شده همان وضعیت مطلوب و دمای فعلی اتاق همان وضعیت فعلی است. ترموستات به‌صورت مداوم دما را بررسی می‌کند و اگر دما از مقدار مطلوب کمتر باشد، سیستم گرمایشی را روشن و در صورت بیشتر بودن خاموش می‌کند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="669" src="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-1024x669.webp" alt="کنترلر کوبرنتیز چگونه کار می‌‌کند؟ ارتباط کنترلر کوبرنتیز با آبجکت‌ها و منابع" class="wp-image-4752" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-1024x669.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-300x196.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-768x502.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-120x78.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">کنترلرهای کوبرنتیز نیز دقیقاً به همین شکل عمل می‌کنند؛ آن‌ها وضعیت منابع را از طریق Kubernetes API پایش کرده و هرگونه اختلاف با وضعیت مطلوب را اصلاح می‌کنند. این حلقه کنترلی به صورت پیوسته اجرا می‌شود تا منابع و پادها همیشه در وضعیت پایدار باقی بمانند.</p>



<h2 class="wp-block-heading">کنترلر کوبرنتیز چه منابعی را مدیریت می‌کند؟</h2>



<p class="wp-block-paragraph">در کوبرنتیز، هر کنترلر مسئول مدیریت یک نوع مشخص از منابع است. این منابع به‌صورت آبجکت‌هایی در Kubernetes API تعریف می‌شوند و کنترلرها وضعیت آن‌ها را به‌صورت مداوم بررسی و اصلاح می‌کنند.</p>



<p class="wp-block-paragraph">برای مثال، برخی کنترلرها مانند ReplicaSet مسئول حفظ تعداد مشخصی <a href="https://hamravesh.com/blog/what-is-kubernetes-pod" target="_blank" rel="noreferrer noopener">پاد در کوبرنتیز</a> هستند، در حالی که کنترلرهایی مانند Job وظیفه اجرای تسک‌های مشخص را برعهده دارند. هر کنترلر تنها روی مجموعه‌ای از منابع مشخص تمرکز دارد و تلاش می‌کند وضعیت آن‌ها را با وضعیت مطلوب تعریف‌شده توسط کاربر همگام نگه دارد.</p>



<p class="wp-block-paragraph">نکته مهم این است که در کوبرنتیز، این منابع از طریق API تعریف و ذخیره می‌شوند و کنترلرها نیز از همین طریق وضعیت آن‌ها را مشاهده کرده (Watch) و در صورت نیاز تغییرات لازم را اعمال می‌کنند (Update). به همین دلیل، تعامل بین کنترلر کوبرنتیز و Kubernetes API نقش کلیدی در مدیریت کلاستر دارد.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="573" data-id="4753" src="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-1024x573.webp" alt="انواع کنترلرهای کوبرنتیز شامل ReplicaSet و Deployment و StatefulSet و Job و CronJob و DaemonSet" class="wp-image-4753" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-1024x573.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-300x168.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-768x430.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-120x67.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<h2 class="wp-block-heading" id="h-انواع-کنترلر-کوبرنتیز">انواع کنترلر کوبرنتیز</h2>



<p class="wp-block-paragraph">در <a href="https://hamravesh.com/blog/what-is-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز</a>، کنترلرهای مختلفی برای مدیریت سناریوهای متفاوت وجود دارند. هر یک از این کنترلرها برای مدیریت نوع خاصی از workload طراحی شده‌اند. نکته مهم این است که این کنترلرها معمولاً به‌صورت مستقل از یکدیگر عمل نمی‌کنند، بلکه در بسیاری از موارد به‌صورت زنجیره‌ای با هم در ارتباط هستند. برای مثال، زمانی که یک Deployment ایجاد می‌شود، این کنترلر به‌طور مستقیم پادها را مدیریت نمی‌کند، بلکه یک ReplicaSet ایجاد می‌کند و این ReplicaSet است که مسئول ایجاد و نگهداری پادها است. این ارتباط بین کنترلرها باعث می‌شود مدیریت وضعیت مطلوب سیستم به‌صورت دقیق‌تر و قابل‌کنترل‌تری انجام شود.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">در ادامه با مهم‌ترین انواع کنترلر کوبرنتیز آشنا می‌شویم.</p>



<h3 class="wp-block-heading">ReplicaSet</h3>



<p class="wp-block-paragraph">کنترلر ReplicaSet مسئول اطمینان از اجرای تعداد مشخصی از پادهای یکسان در هر لحظه است و نقش مهمی در حفظ پایداری اپلیکیشن‌ها در کوبرنتیز دارد. این کنترلر به‌صورت مداوم وضعیت پادها را بررسی می‌کند و اگر تعداد پادهای در حال اجرا کمتر از مقدار تعریف‌شده باشد، پادهای جدیدی ایجاد می‌کند. در مقابل، اگر تعداد پادها بیشتر از مقدار موردنظر باشد، برخی از آن‌ها را حذف می‌کند.</p>



<h3 class="wp-block-heading">Deployment</h3>



<p class="wp-block-paragraph">کنترلر <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment" target="_blank" rel="noreferrer noopener">دیپلویمنت در کوبرنتیز</a> یکی از رایج‌ترین راهکارها برای استقرار اپلیکیشن‌ها در کوبرنتیز است. این کنترلر مدیریت ReplicaSetها را برعهده دارد و امکان به‌روزرسانی تدریجی (rolling update) و بازگشت به نسخه‌های قبلی (rollback) را فراهم می‌کند. به بیان دیگر، Deployment یک لایه بالاتر از ReplicaSet است و فرایند به‌روزرسانی و مدیریت نسخه‌های مختلف اپلیکیشن را ساده‌تر می‌کند.</p>



<h3 class="wp-block-heading">StatefulSet</h3>



<p class="wp-block-paragraph">کنترلر StatefulSet برای مدیریت اپلیکیشن‌هایی استفاده می‌شود که به هویت پایدار و ذخیره‌سازی دائمی نیاز دارند (برای مثال سرویس‌های داده‌های احراز هویت کاربران). در این نوع از workloadها، هر پاد دارای یک شناسه منحصربه‌فرد است و این شناسه حتی در صورت جابه‌جایی یا راه‌اندازی مجدد پاد نیز حفظ می‌شود. برخلاف سایر workloadها، این پادها قابل جایگزینی ساده با یکدیگر نیستند و هر کدام هویت مستقل خود را دارند. این ویژگی باعث می‌شود StatefulSet گزینه مناسبی برای اجرای سیستم‌هایی باشد که به ذخیره‌سازی پایدار وابسته هستند.</p>



<p class="wp-block-paragraph">زمانی که از دیتابیس‌های PostgreSQL ،MySQL ،MongoDB ،Cassandra و به‌صورت کلی از هر حالت Persistent Storage استفاده می‌شود، StatefulSets راهکار مناسبی است.</p>



<h3 class="wp-block-heading">Job</h3>



<p class="wp-block-paragraph">کنترلر Job برای اجرای تسک‌های کوتاه‌مدت طراحی شده است. این کنترلر یک یا چند پاد ایجاد می‌کند و تا زمانی که این پادها با موفقیت کار خود را به پایان برسانند، آن‌ها را مدیریت می‌کند. پس از تکمیل موفقیت‌آمیز تسک، Job، دیگر پاد جدیدی ایجاد نمی‌کند.</p>



<h3 class="wp-block-heading">CronJob</h3>



<p class="wp-block-paragraph">کنترلر <a href="https://hamravesh.com/blog/cronjob-kubernetes/" target="_blank" rel="noreferrer noopener">CronJob</a> برای اجرای Jobها در زمان‌بندی‌های مشخص استفاده می‌شود. کاربران می‌توانند با استفاده از الگوی زمان‌بندی (cron)، مشخص کنند که یک Job در چه زمان‌هایی اجرا شود و CronJob به‌صورت خودکار در همان زمان‌ها Jobهای موردنظر را ایجاد می‌کند.</p>



<h3 class="wp-block-heading">DaemonSet</h3>



<p class="wp-block-paragraph">کنترلر DaemonSet اطمینان حاصل می‌کند که یک نسخه از یک پاد مشخص روی همه (یا برخی) از نودهای کلاستر اجرا شود. با اضافه شدن نودهای جدید به کلاستر، پادهای مربوط به DaemonSet نیز به‌صورت خودکار روی آن‌ها اجرا می‌شوند و در صورت حذف نود، این پادها نیز حذف می‌شوند.</p>



<h2 class="wp-block-heading">تفاوت کنترلر کوبرنتیز و اپراتور کوبرنتیز</h2>



<p class="wp-block-paragraph">در کوبرنتیز، کنترلرها و اپراتورها هر دو مسئول مدیریت وضعیت منابع هستند، اما از نظر دامنه و سطح پیچیدگی تفاوت دارند.</p>



<ul class="wp-block-list">
<li><strong>کنترلر کوبرنتیز</strong>: وظیفه اصلی آن حفظ وضعیت مطلوب (Desired State) برای یک یا چند نوع مشخص از منابع است. این کنترلرها معمولاً برای workloadهای استاندارد و عمومی مثل پادها، ReplicaSetها، Deploymentها و Jobها استفاده می‌شوند. همان‌طور که در بخش قبل توضیح دادیم، کنترلرها از حلقه‌های کنترلی (Control Loops) استفاده می‌کنند تا وضعیت فعلی را با وضعیت مطلوب مقایسه کرده و در صورت نیاز اصلاح کنند.</li>



<li><strong>اپراتور کوبرنتیز</strong>: اپراتورها لایه‌ای بالاتر از کنترلرها هستند و برای مدیریت <a href="https://hamravesh.com/blog/stateful-vs-stateless" target="_blank" rel="noreferrer noopener">اپلیکیشن‌های stateful</a> یا پیچیده طراحی شده‌اند. یک اپراتور علاوه بر حفظ وضعیت مطلوب منابع، می‌تواند منطق اختصاصی برنامه را نیز پیاده‌سازی کند؛ مثلاً مدیریت نصب، پیکربندی، به‌روزرسانی، بکاپ و بازیابی یک دیتابیس. به‌عبارتی اپراتورها کنترلرهایی هستند که با دانش برنامه (application-specific logic) ترکیب شده‌اند تا مدیریت خودکار اپلیکیشن‌های پیچیده را ممکن سازند.</li>
</ul>



<p class="wp-block-paragraph">به طور خلاصه کنترلرها برای منابع استاندارد و عمومی هستند و فقط وضعیت کلاستر را پایش و اصلاح می‌کنند. اپراتورها از کنترلرها استفاده می‌کنند اما شامل منطق اختصاصی اپلیکیشن هم هستند و قادرند عملیات پیچیده و خودکار اپلیکیشن را مدیریت کنند.</p>



<h3 class="wp-block-heading" id="h-مزایای-کنترلر-کوبرنتیز">مزایای کنترلر کوبرنتیز</h3>



<p class="wp-block-paragraph">کنترلرهای کوبرنتیز از مزایای زیر برخوردارند:</p>



<ul class="wp-block-list">
<li><strong>پایداری وضعیت منابع:</strong> کنترلرها تضمین می‌کنند که وضعیت فعلی منابع همواره با وضعیت مطلوب (Desired State) هماهنگ باشد.</li>



<li><strong>خودکارسازی وظایف ساده و تکراری:</strong> کنترلرها وظایف مدیریت تعداد پادها، راه‌اندازی مجدد آنها و نگهداری وضعیت را بدون دخالت دستی انجام می‌دهند.</li>



<li><strong>حلقه کنترل مستمر:</strong> کنترلرها به صورت مداوم منابع را پایش می‌کنند و در صورت اختلاف با وضعیت مطلوب، تغییرات لازم را اعمال می‌کنند.</li>
</ul>



<h3 class="wp-block-heading" id="h-مزایای-اپراتور-کوبرنتیز">مزایای اپراتور کوبرنتیز</h3>



<p class="wp-block-paragraph" id="h-مزایای-اپراتور-کوبرنتیز-شامل-موارد-زیر-است">مزایای اپراتور کوبرنتیز شامل موارد زیر است:</p>



<ul class="wp-block-list">
<li><strong>مدیریت خودکار اپلیکیشن‌های پیچیده:</strong> اپراتورها قادرند علاوه بر حفظ وضعیت مطلوب منابع، منطق اختصاصی برنامه‌ها را نیز مدیریت کنند.</li>



<li><strong>خودکارسازی عملیات پیشرفته:</strong> نصب، به‌روزرسانی، مقیاس‌دهی، پشتیبان‌گیری و بازیابی اپلیکیشن‌ها توسط اپراتور کوبرنتیز به صورت خودکار انجام می‌شود.</li>



<li>پ<strong>شتیبانی از اپلیکیشن‌های stateful:</strong> اپراتورها برای اپلیکیشن‌هایی که به ذخیره‌سازی پایدار و هویت ثابت نیاز دارند، گزینه مناسب هستند.</li>
</ul>



<h2 class="wp-block-heading" id="h-در-پایان">در پایان</h2>



<p class="wp-block-paragraph">کنترلرها بخش اصلی کوبرنتیز هستند که به‌صورت مداوم وضعیت منابع را پایش می‌کنند و با اعمال تغییرات لازم، آن‌ها را با وضعیت مطلوب هماهنگ نگه می‌دارند. این کار باعث پایداری پادها و کاهش دخالت دستی می‌شود. اپراتورها لایه‌ای بالاتر هستند و علاوه بر مدیریت منابع، منطق اپلیکیشن‌های پیچیده و stateful را خودکار می‌کنند؛ مانند فرایندهای نصب، مقیاس‌دهی و بازیابی. درک کنترلرها و نقش اپراتورها برای مدیریت مؤثر کلاستر و استفاده بهینه از منابع ضروری است. </p>



<p class="wp-block-paragraph"><a href="https://hamravesh.com/darkube" target="_blank" rel="noreferrer noopener">پلتفرم ابری دارکوب</a> هم‌روش تجربه زیرساختی مبتنی بر کوبرنتیز را به ساده‌ترین شکل ممکن در اختیارتان قرار می‌دهد. با کمک دارکوب می‌توانید به سرعت برنامه‌های خود را بر بستر کوبرنتیز اجرا کنید و اپلیکیشن‌های پرکاربرد را با تنظیمانت دلخواه بسازید.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-controller/">آشنایی با کنترلر کوبرنتیز؛ مقایسه با اپراتور کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-controller/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با Deployment در کوبرنتیز؛ ابزار مدیریت پادها و ReplicaSetها</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-deployment/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-deployment/#respond</comments>
		
		<dc:creator><![CDATA[ارسطو عباسی]]></dc:creator>
		<pubDate>Wed, 01 Apr 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=1681</guid>

					<description><![CDATA[<p>دیپلویمنت در کوبرنتیز ابزاری است که مدیریت کانتینرها و پادها را ساده و خودکار می‌کند. با استفاده از آن، اجرای پایدار و مقیاس‌پذیر اپلیکیشن‌های کانتینرسازی‌شده امکان‌پذیر می‌شود، تغییرات بدون توقف سرویس اعمال شده و منابع کلاستر به شکل بهینه مورد استفاده قرار می‌گیرند. در این مقاله با کاربردها، مزایا و مراحل عملیاتی Kubernetes Deployment آشنا [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment/">آشنایی با Deployment در کوبرنتیز؛ ابزار مدیریت پادها و ReplicaSetها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">دیپلویمنت در کوبرنتیز ابزاری است که مدیریت کانتینرها و پادها را ساده و خودکار می‌کند. با استفاده از آن، اجرای پایدار و مقیاس‌پذیر اپلیکیشن‌های کانتینرسازی‌شده امکان‌پذیر می‌شود، تغییرات بدون توقف سرویس اعمال شده و منابع کلاستر به شکل بهینه مورد استفاده قرار می‌گیرند. در این مقاله با کاربردها، مزایا و مراحل عملیاتی Kubernetes Deployment آشنا می‌شوید تا مدیریت اپلیکیشن‌ها در کلاستر کوبرنتیز به شکلی مطمئن و کارآمد انجام شود.</p>



<h2 class="wp-block-heading" id="h-kubernetes-deployment-چیست">Kubernetes Deployment چیست؟</h2>



<p class="wp-block-paragraph">Kubernetes Deployment یکی از ابزارهای مدیریتی در کوبرنتیز است که فرآیند ایجاد و مدیریت ReplicaSetها را بر عهده دارد. ReplicaSetها نیز مسئول ایجاد و نگهداری پادها هستند. به این ترتیب Deployment به صورت غیرمستقیم وضعیت پادها را کنترل کرده و تضمین می‌کند اپلیکیشن‌ها همیشه در وضعیت مطلوب اجرا شوند. با کمک Deployment می‌توان تغییرات را به آرامی و بدون اختلال در سرویس اعمال کرد، پادهای خراب یا قدیمی را جایگزین کرد و در صورت نیاز به سرعت به آخرین نسخه پایدار بازگشت. این قابلیت باعث افزایش پایداری، دسترس‌پذیری و مقیاس‌پذیری سیستم می‌شود و نیاز به اجرای فرایندهای دستی را کاهش می‌دهد.</p>



<h2 class="wp-block-heading" id="h-چرا-به-دیپلویمنت-در-کوبرنتیز-نیاز-داریم">چرا به دیپلویمنت در کوبرنتیز نیاز داریم؟</h2>



<p class="wp-block-paragraph">یکی از اهداف اصلی استفاده از Deployment، مدیریت Rolloutها است؛ فرایندی که در آن تغییرات کلاستر بدون توقف سرویس اعمال می‌شوند و پادهای قدیمی به‌صورت مرحله‌ای جایگزین می‌شوند. این روش باعث افزایش مقیاس‌پذیری و دسترس‌پذیری اپلیکیشن‌ها می‌شود.</p>



<p class="wp-block-paragraph">Deployment در چند سناریوی کلیدی کاربرد دارد:</p>



<ul class="wp-block-list">
<li><strong>ایجاد خودکار پادها و ReplicaSetها:</strong> با استفاده از فایل‌های YAML که پیکربندی وضعیت مطلوب را مشخص می‌کنند، کوبرنتیز می‌تواند پادها و ReplicaSetهای جدید ایجاد کند.</li>



<li><strong>تعیین وضعیت مطلوب پادها:</strong> فایل YAML به شما اجازه می‌دهد تعریف کاملی از وضعیت ایده‌آل برای پادها و ReplicaSetها داشته باشید تا کوبرنتیز بر اساس آن عمل کند.</li>



<li><strong>بازگشت سریع به نسخه پایدار (Rollback):</strong> اگر وضعیت کلاستر ناپایدار شود، Deployment تاریخچه‌ای از نسخه‌های قبلی را نگه می‌دارد تا بتوان به راحتی به آخرین وضعیت پایدار بازگشت.</li>



<li><strong>مقیاس‌گذاری پادها (Scaling):</strong> زمانی که اپلیکیشن به منابع بیشتری نیاز داشته باشد، می‌توان تعداد پادهای تعریف‌شده در Deployment را افزایش داد. Deployment با به‌روزرسانی مقدار replicas، از طریق ReplicaSet، پادهای جدید ایجاد می‌کند تا تعداد پادهای در حال اجرا، با وضعیت مطلوب تعریف‌شده هماهنگ باقی بماند. این فرایند می‌تواند به صورت دستی انجام شود یا با استفاده از ابزارهایی مانند Horizontal Pod Autoscaler (به اختصار HPA) به شکل خودکار مدیریت شود.</li>
</ul>



<h2 class="wp-block-heading" id="h-اجزا-و-کامپوننت-های-دیپلویمنت-در-کوبرنتیز">اجزا و کامپوننت‌های دیپلویمنت در کوبرنتیز</h2>



<p class="wp-block-paragraph">قبل از ایجاد یک Deployment، شناخت اجزا و کامپوننت‌های آن ضروری است. هر جزء نقش مشخصی در مدیریت پادها، ReplicaSetها و وضعیت کلاستر دارد و همکاری این اجزا تضمین می‌کند که اپلیکیشن‌ها همیشه در وضعیت مطلوب اجرا شوند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="673" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-02-1024x673.webp" alt="دیپلویمنت در کوبرنتیز" class="wp-image-4693" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-02-1024x673.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-02-300x197.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-02-768x505.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-02-120x79.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">اجزای اصلی Kubernetes Deployment شامل موارد زیر هستند:</p>



<ul class="wp-block-list">
<li><strong>فایل YAML:</strong> فایل YAML فرمت متداول برای تعریف منابع در کوبرنتیز است و در آن می‌توان پیکربندی Deployment، تعداد پادها، مشخصات کانتینرها و سایر تنظیمات اجرای اپلیکیشن را مشخص کرد.</li>



<li><strong>پاد (Pod):</strong> کوچک‌ترین واحد اجرایی در کوبرنتیز است که شامل یک یا چند کانتینر، پیکربندی‌ها و محیط‌های اجرای اپلیکیشن می‌شود. پادها پایه‌ای‌ترین بخش اجرای Deployment هستند و مدیریت صحیح آن‌ها برای عملکرد مطلوب سیستم ضروری است. برای مطالعه بیشتر در مورد پاد می‌توانید مقاله «<a href="https://hamravesh.com/blog/what-is-kubernetes-pod/" target="_blank" rel="noreferrer noopener"><strong>پاد در کوبرنتیز</strong></a>» را مطالعه کنید.</li>



<li><strong>ReplicaSet:</strong> گروهی از پادهای همسان است که تضمین می‌کند تعداد پادهای در حال اجرا مطابق با تعریف فایل YAML باشد. اگر یک پاد با مشکل مواجه شود، ReplicaSet مسئول ایجاد پاد جایگزین است.</li>



<li><strong>kube-scheduler:</strong> این کامپوننت بخشی از Control Plane است و تصمیم می‌گیرد که پادها و ReplicaSetها روی کدام نودهای کارگر (Worker Nodes) اجرا شوند.</li>



<li><strong>kube-controller-manager:</strong> مجموعه‌ای از کنترلرهای مختلف را اجرا می‌کند که وظیفه آن‌ها تطبیق وضعیت فعلی کلاستر با وضعیت مطلوب تعریف شده در YAML است. این کنترلرها ایجاد، حذف یا به‌روزرسانی منابعی مانند ReplicaSetها و پادها را مدیریت می‌کنند.</li>
</ul>



<h2 class="wp-block-heading" id="h-مزایا-استفاده-از-دیپلویمنت-در-کوبرنتیز">مزایا استفاده از دیپلویمنت در کوبرنتیز</h2>



<p class="wp-block-paragraph">با استفاده از کوبرنتیز دیپلویمنت، می‌توانید پایداری (Stability) و نرخ در دسترس بودن (Availability) کانتینرها را افزایش دهید. برای مثال، اگر یک نود در کلاستر با مشکل مواجه شود، Deployment با کمک اجزای کنترلر و ReplicaSet به‌طور خودکار یک پاد جایگزین ایجاد می‌کند. این فرایند تماماً خودکار انجام می‌شود و نیاز به مداخله دستی را حذف می‌کند.</p>



<p class="wp-block-paragraph">اگر پادها بدون استفاده از کنترلرهایی مانند Deployment ،ReplicaSet یا StatefulSet ایجاد شوند، به آن‌ها Naked Pod گفته می‌شود. در این حالت اگر پاد با مشکل مواجه شود، کوبرنتیز به صورت خودکار نمونه جایگزین ایجاد نمی‌کند.</p>



<p class="wp-block-paragraph">اصلی‌ترین مزایای دیپلویمنت در کوبرنتیز عبارتند از:</p>



<ul class="wp-block-list">
<li><strong>خودکارسازی دیپلوی، بروزرسانی و مقیاس‌دهی:</strong> Deployment فرایند ایجاد و مدیریت پادها و ReplicaSetها را به صورت خودکار انجام می‌دهد.</li>



<li><strong>افزایش پایداری و کاهش خطاها:</strong> مدیریت خودکار پادها باعث کاهش خطاهای انسانی و حفظ عملکرد مطلوب سیستم می‌شود.</li>



<li><strong>کاهش نرخ Downtime:</strong> با جایگزینی مرحله‌ای پادها و Rollout هوشمند، اپلیکیشن‌ها همیشه در دسترس باقی می‌مانند.</li>



<li><strong>استفاده بهینه از منابع:</strong> Kubernetes Deployment منابع کلاستر را به شکل هوشمند مدیریت می‌کند و از اضافه‌کاری یا کمبود منابع جلوگیری می‌کند.</li>
</ul>



<h2 class="wp-block-heading" id="h-استراتژی-های-مختلف-دیپلویمنت-در-کوبرنتیز">استراتژی‌های مختلف دیپلویمنت در کوبرنتیز</h2>



<p class="wp-block-paragraph">کوبرنتیز دیپلویمنت چند استراتژی پیاده‌سازی دارد که هر کدام برای شرایط و اهداف خاصی طراحی شده‌اند. انتخاب مناسب‌ترین استراتژی بستگی به نیازمندی‌های کسب‌وکار، اهداف اپلیکیشن و محدودیت‌های منابع دارد. با آشنایی کامل با این استراتژی‌ها، می‌توانید تغییرات در کلاستر را به شکل بهینه، امن و بدون اختلال در سرویس اعمال کنید.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="668" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-03-1024x668.webp" alt="استراتژی‌های دیپلویمنت در کوبرنتیز - مقایسه Rolling Update  و Recreate" class="wp-image-4694" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-03-1024x668.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-03-300x196.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-03-768x501.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-03-120x78.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/Hamravesh-what-is-kubernetes-deployment-03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">دو استراتژی اصلی برای دیپلویمنت در کوبرنتیز وجود دارد.</p>



<p class="wp-block-paragraph"><strong>Rolling Update:</strong> در این استراتژی، پادهای جدید به‌صورت تدریجی ایجاد شده و به‌مرور جایگزین پادهای قدیمی می‌شوند. به این ترتیب نسخه جدید اپلیکیشن بدون توقف کامل سرویس منتشر می‌شود و همواره تعدادی از پادهای سالم در حال اجرا باقی می‌مانند. Rolling Update رایج‌ترین استراتژی برای محیط‌های Production است.</p>



<p class="wp-block-paragraph"><strong>Recreate:</strong> در این روش، ابتدا تمام پادهای نسخه قبلی حذف می‌شوند و سپس پادهای مربوط به نسخه جدید ایجاد می‌شوند. این کار باعث ایجاد Downtime می‌شود، به همین دلیل معمولاً برای محیط‌های Production توصیه نمی‌شود و بیشتر در محیط‌های توسعه یا زمانی استفاده می‌شود که امکان اجرای همزمان دو نسخه از اپلیکیشن وجود نداشته باشد.</p>



<p class="wp-block-paragraph">علاوه بر استراتژی‌های رسمی Deployment، روش‌های پیشرفته‌ای مانند <strong>Canary ،A/B Testing و Blue/Green</strong> وجود دارند که برای کنترل دقیق انتشار نسخه جدید در محیط‌های حساس یا با حجم بالای کاربران استفاده می‌شوند. این روش‌ها معمولاً با کمک Service، Ingress یا Service Mesh پیاده‌سازی می‌شوند و فراتر از قابلیت‌های داخلی Deployment هستند.</p>



<h2 class="wp-block-heading" id="h-ایجاد-و-پیاده-سازی-دیپلویمنت-در-کوبرنتیز-با-yaml-و-kubectl"><strong>ایجاد و پیاده‌سازی دیپلویمنت در کوبرنتیز با YAML و kubectl</strong></h2>



<p class="wp-block-paragraph">در این بخش قصد داریم با شیوه ایجاد Kubernetes Deployment آشنا شویم. برای انجام اینکار از دستور <code>kubectl</code> در محیط CLI استفاده می‌کنیم. البته برای انجام این‌ کار نیاز است که ابتدا از نصب بودن <code>Kubectl</code> و <code>minikube</code> روی سیستم‌عامل‌تان مطمئن باشید.</p>



<h3 class="wp-block-heading" id="h-۱-ایجاد-دایرکتوری-و-فایل-yaml"><strong>۱- ایجاد دایرکتوری و فایل YAML</strong></h3>



<p class="wp-block-paragraph">یک دایرکتوری جدید بسازید و فایل YAML خود را ایجاد کنید. برای مثال: nginx-deployment.yaml. این فایل شامل پیکربندی‌های اولیه مانند تعداد پادها، کانتینرها، ایمیج‌‌هاو پورت‌ها است:</p>



<pre class="wp-block-code"><code>apiVersion: apps/v1
kind: Deployment

metadata:
  name: nginx-deployment
  labels:
    app: nginx

spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest # name of image deployed to DockerHub
        ports:
        - containerPort: 80</code></pre>



<p class="wp-block-paragraph">این فایل حاوی پیکربندی‌های اولیه دیپلویمنت در کوبرنتیز بوده و به عنوان اصلی‌ترین فایل دیپلویمنت شما به حساب می‌آید. برای آشنایی بیشتر در ادامه تمام موارد ذکر شده در این فایل را بررسی می‌کنیم:</p>



<ul class="wp-block-list">
<li><strong>apiVersion</strong>: نسخه API مربوط به این منبع در کوبرنتیز را مشخص می‌کند.</li>



<li><strong>kind</strong>: برای مشخص کردن نوع فایل که در این مثال Deployment است.</li>



<li><strong>metadata</strong>: اطلاعات مربوط به دیپلویمنت، از جمله نام آن.</li>



<li>«روش‌های پیشرفته‌ای مثل Canary و A/B نیز برای انتشار کنترل‌شده نسخه‌ها وجود دارد که معمولاً در محیط‌های Production بزرگ یا با ابزارهای Service Mesh استفاده می‌شوند.»: شامل مواردی که پیکربندی‌های دیپلویمنت و Replicaها را تعریف می‌کند.</li>
</ul>



<h3 class="wp-block-heading" id="h-۲-اعمال-فایل-yaml-با-kubectl">۲- اعمال فایل YAML با kubectl</h3>



<p class="wp-block-paragraph">برای ایجاد دیپلویمنت مورد نظر، دستور زیر را اجرا کنید:</p>



<pre class="wp-block-code"><code>kubectl apply -f nginx-deployment.yaml</code></pre>



<p class="wp-block-paragraph">در صورت موفقیت، خروجی مشابه زیر را مشاهده خواهید کرد.</p>



<pre class="wp-block-code"><code>deployment.apps/nginx-deployment created</code></pre>



<h3 class="wp-block-heading" id="h-۳-بررسی-وضعیت-deployment"><strong>۳- بررسی وضعیت Deployment</strong></h3>



<p class="wp-block-paragraph">برای مشاهده وضعیت Deployment، از دستور زیر استفاده کنید.</p>



<pre class="wp-block-code"><code>kubectl get deployments</code></pre>



<p class="wp-block-paragraph">بعد از اینکار انتظار می‌رود که خروجی زیر را دریافت کنید.</p>



<pre class="wp-block-code"><code>NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   4/4     4            4           6s</code></pre>



<h3 class="wp-block-heading" id="h-۴-بررسی-پادهای-در-حال-اجرا">۴- بررسی پادهای در حال اجرا</h3>



<p class="wp-block-paragraph">برای مشاهده پادهای فعال، دستور زیر را اجرا کنید:</p>



<pre class="wp-block-code"><code>kubectl get pods</code></pre>



<p class="wp-block-paragraph">این دستور لیستی از پادهای در حال اجرا را همراه با وضعیت و تعداد ریستارت‌ها نشان می‌دهد.</p>



<pre class="wp-block-code" style="font-size:10px"><code>NAME                                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-deployment-9456bbbf9-fr8mc         1/1     Running   0          20s   app=nginx,pod-template-hash=75675f5897
nginx-deployment-9456bbbf9-lpn89         1/1     Running   0          20s   app=nginx,pod-template-hash=75675f5897
nginx-deployment-9456bbbf9-wq76m         1/1     Running   0          20s   app=nginx,pod-template-hash=75675f5897
nginx-deployment-9456bbbf9-xxczh         1/1     Running   0          20s   app=nginx,pod-template-hash=75675f5897</code></pre>



<p class="wp-block-paragraph">با انجام این مراحل، دیپلویمنت شما ایجاد و فعال شده و کوبرنتیز به‌صورت خودکار وضعیت مطلوب پادها و ReplicaSetها را حفظ می‌کند. این روش نه تنها مدیریت اپلیکیشن را ساده می‌کند، بلکه باعث افزایش پایداری، دسترس‌پذیری و مقیاس‌پذیری می‌شود.</p>



<h2 class="wp-block-heading" id="h-در-پایان">در پایان</h2>



<p class="wp-block-paragraph">Kubernetes Deployment یکی از ابزارهای کلیدی برای مدیریت خودکار پادها و ReplicaSetها در کلاستر کوبرنتیز است. با استفاده از Deployment می‌توانید اپلیکیشن‌های کانتینرسازی شده خود را با پایداری، دسترس‌پذیری و مقیاس‌پذیری بالا اجرا کنید، تغییرات را بدون توقف سرویس اعمال کنید و در صورت بروز مشکل به سرعت به نسخه پایدار بازگردید. استفاده از دیپلویمنت در کوبرنتیز نه تنها نیاز به مدیریت دستی را کاهش می‌دهد، بلکه عملکرد و قابلیت اطمینان سیستم را نیز به شکل قابل توجهی افزایش می‌دهد. برای مطالعه بیشتر در ارتباط با این موضوع می‌توانید به <strong><a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#updating-a-deployment" target="_blank" rel="noreferrer noopener">مستندات رسمی کوبرنتیز</a></strong> مراجعه کنید.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment/">آشنایی با Deployment در کوبرنتیز؛ ابزار مدیریت پادها و ReplicaSetها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-deployment/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>مهاجرت به کوبرنتیز: نکات و بهترین رویکردها</title>
		<link>https://hamravesh.com/blog/kubernetes-migration-best-practices/</link>
					<comments>https://hamravesh.com/blog/kubernetes-migration-best-practices/#respond</comments>
		
		<dc:creator><![CDATA[ارسطو عباسی]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 14:02:19 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=4095</guid>

					<description><![CDATA[<p>در این مطلب از وبلاگ هم‌روش، به بررسی نکات کلیدی و بهترین رویکردها برای مهاجرت موفق به کوبرنتیز خواهیم پرداخت. </p>
<p>The post <a href="https://hamravesh.com/blog/kubernetes-migration-best-practices/">مهاجرت به کوبرنتیز: نکات و بهترین رویکردها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">مهاجرت به کوبرنتیز یک گام بزرگ اما ضروری برای سازمان‌هایی است که به دنبال افزایش بهره‌وری، کاهش هزینه‌ها و پاسخ‌گویی بهتر به نیازهای متغیر بازار هستند. این فرآیند، اگر به درستی انجام شود، می‌تواند تحول عظیمی در چگونگی مدیریت و اجرای نرم‌افزارها ایجاد کند. اما این مسیر بدون چالش نیست؛ از برنامه‌ریزی دقیق گرفته تا تغییرات زیرساختی و فرهنگی، همه‌چیز باید به درستی طراحی و اجرا شود.</p>



<p class="wp-block-paragraph">در این مطلب از وبلاگ هم‌روش، به بررسی نکات کلیدی و بهترین رویکردها برای مهاجرت موفق به <strong><a href="https://hamravesh.com/blog/what-is-kubernetes/">کوبرنتیز</a></strong> خواهیم پرداخت. با ما همراه باشید تا این سفر پیچیده را به یک مسیر روشن و کاربردی تبدیل کنیم.</p>



<h2 class="wp-block-heading" id="h-برنامه-ریزی-و-استراتژی-برای-مهاجرت-به-کوبرنتیز"><strong>برنامه‌ریزی و استراتژی برای مهاجرت به کوبرنتیز</strong></h2>



<p class="wp-block-paragraph">در این بخش، به نکات مهمی خواهیم پرداخت که به شما کمک می‌کند مهاجرت به کوبرنتیز را به شکلی کارآمد و کم‌ریسک انجام دهید:</p>



<h3 class="wp-block-heading" id="h-ارزیابی-نیازها-و-اهداف-سازمان"><strong>ارزیابی نیازها و اهداف سازمان</strong></h3>



<p class="wp-block-paragraph">ارزیابی نیازها و اهداف سازمان یکی از اساسی‌ترین مراحل در فرآیند مهاجرت به کوبرنتیز است. این گام به شما کمک می‌کند تا دقیقاً بدانید چرا این تغییر ضروری است و چه انتظاراتی از آن دارید. در ابتدا باید به دلایل اصلی مهاجرت بپردازید؛ آیا سازمان شما با مشکلاتی مانند مقیاس‌پذیری پایین، پیچیدگی مدیریت برنامه‌ها یا هزینه‌های بالا مواجه است؟ یا شاید هدف شما دستیابی به یک زیرساخت مدرن‌تر و انعطاف‌پذیرتر باشد؟</p>



<p class="wp-block-paragraph">تعریف دقیق اهداف نیز اهمیت بالایی دارد. اهداف شما می‌توانند شامل کاهش زمان استقرار نرم‌افزار، بهبود دسترس‌پذیری، افزایش پایداری سیستم‌ها یا تسهیل فرآیندهای توسعه باشند. این اهداف باید مشخص و قابل اندازه‌گیری باشند تا بتوانید موفقیت پروژه را ارزیابی کنید.</p>



<h3 class="wp-block-heading" id="h-تحلیل-زیرساخت-فعلی"><strong>تحلیل زیرساخت فعلی</strong></h3>



<p class="wp-block-paragraph">تحلیل زیرساخت فعلی سازمان، گامی کلیدی برای آماده‌سازی مهاجرت به کوبرنتیز است. پیش از هر تغییری، باید شناخت دقیقی از سیستم‌ها، سرویس‌ها و وابستگی‌های موجود داشته باشید. این تحلیل به شما امکان می‌دهد تا نقاط قوت و ضعف زیرساخت فعلی را شناسایی کرده و از آن‌ها در طراحی زیرساخت جدید استفاده کنید.</p>



<p class="wp-block-paragraph">در ابتدا، لازم است تمام اجزای فعلی زیرساخت، از جمله سرورها، دیتابیس‌ها، سیستم‌های شبکه، و معماری نرم‌افزارها بررسی شوند. درک اینکه هر جزء چگونه با دیگر اجزا در تعامل است، کمک می‌کند تا وابستگی‌ها و بخش‌هایی که ممکن است در فرآیند مهاجرت دچار اختلال شوند را شناسایی کنید. همچنین، مشخص کردن تکنولوژی‌ها و ابزارهایی که در حال حاضر استفاده می‌کنید، می‌تواند به شما نشان دهد که آیا آن‌ها با محیط کوبرنتیز سازگار هستند یا نیاز به تغییر دارند.</p>



<h3 class="wp-block-heading" id="h-تدوین-استراتژی-مهاجرت"><strong>تدوین استراتژی مهاجرت</strong></h3>



<p class="wp-block-paragraph">تدوین استراتژی مهاجرت به کوبرنتیز یکی از مهم‌ترین مراحل برای اطمینان از موفقیت این فرآیند پیچیده است. این مرحله شامل طراحی یک نقشه راه دقیق است که سازمان شما را از وضعیت فعلی به یک زیرساخت مبتنی بر کوبرنتیز هدایت می‌کند، بدون اینکه اختلال جدی در عملکرد سیستم‌ها ایجاد شود.</p>



<p class="wp-block-paragraph">ابتدا باید نوع استراتژی مهاجرت خود را انتخاب کنید. استراتژی‌های متداول شامل مهاجرت مرحله‌ای (Phased Migration) و مهاجرت یکپارچه (Big Bang) هستند. اگر زیرساخت شما بسیار پیچیده است یا نمی‌خواهید ریسک اختلالات زیاد را بپذیرید، استراتژی مرحله‌ای مناسب‌تر خواهد بود. در این روش، برنامه‌ها به صورت تدریجی به کوبرنتیز منتقل می‌شوند، که این امکان را می‌دهد هر مرحله را به صورت جداگانه آزمایش و ارزیابی کنید. اما اگر زیرساخت فعلی قدیمی یا ناکارآمد است و به تغییر سریع نیاز دارید، مهاجرت یکپارچه می‌تواند انتخاب مناسبی باشد.</p>



<p class="wp-block-paragraph">در این فرآیند، شناسایی و اولویت‌بندی برنامه‌ها و سرویس‌ها بسیار مهم است. معمولاً توصیه می‌شود که ابتدا برنامه‌های ساده‌تر و مستقل‌تر به کوبرنتیز منتقل شوند تا تیم بتواند با فرآیند مهاجرت آشنا شود. پس از کسب تجربه، می‌توان به سراغ برنامه‌های پیچیده‌تر رفت.</p>



<h3 class="wp-block-heading" id="h-انتخاب-ابزارها-و-تکنولوژی-ها"><strong>انتخاب ابزارها و تکنولوژی‌ها</strong></h3>



<p class="wp-block-paragraph">انتخاب ابزارها و تکنولوژی‌ها یکی از حساس‌ترین بخش‌های مهاجرت به کوبرنتیز است، زیرا این انتخاب‌ها مستقیماً بر عملکرد، بهره‌وری و موفقیت کلی پروژه تأثیر می‌گذارند. هر ابزار یا تکنولوژی که انتخاب می‌کنید باید با نیازها، زیرساخت‌ها و اهداف سازمان همخوانی داشته باشد و بتواند کارایی و پایداری سیستم را بهبود بخشد.</p>



<p class="wp-block-paragraph">برای مدیریت چرخه حیات برنامه‌ها در کوبرنتیز، ابزارهایی مانند <strong><a href="https://hamravesh.com/blog/what-is-helm/">Helm</a></strong> نقش کلیدی ایفا می‌کنند. Helm به شما امکان می‌دهد تا تنظیمات پیچیده را به صورت چارت‌های ساده و قابل مدیریت انجام دهید و فرآیند استقرار را استانداردسازی کنید. برای خودکارسازی فرآیندهای توسعه و استقرار، سیستم‌های CI/CD مانند <strong>Jenkins</strong> ،<strong>GitLab CI</strong> و <strong>ArgoCD</strong> انتخاب‌های محبوبی هستند که می‌توانند به کاهش زمان استقرار کمک کنند.</p>



<p class="wp-block-paragraph">در حوزه مانیتورینگ و نظارت، ابزارهایی نظیر <strong>Prometheus</strong> و <strong>Grafana</strong> برای پایش سلامت و عملکرد سیستم بسیار ضروری هستند. این ابزارها اطلاعات لحظه‌ای از وضعیت کانتینرها، نودها و سرویس‌های مختلف را فراهم می‌کنند و به شما کمک می‌کنند تا مشکلات را به سرعت شناسایی و رفع کنید. همچنین برای مدیریت لاگ‌ها، استفاده از ابزارهایی مانند <strong>ELK Stack</strong> (Elasticsearch, Logstash, Kibana) یا <strong>Loki</strong> بسیار موثر است.</p>



<h3 class="wp-block-heading" id="h-آموزش-و-توانمندسازی-تیم"><strong>آموزش و توانمندسازی تیم</strong></h3>



<p class="wp-block-paragraph">آموزش و توانمندسازی تیم برای مهاجرت به کوبرنتیز امری ضروری است. ابتدا باید سطح آگاهی تیم از مفاهیم پایه‌ای مانند کانتینرها، Docker و کوبرنتیز را ارزیابی کرده و آن‌ها را با ابزارهایی مثل Helm، پرمتئوس و CI/CD آشنا کنید. برگزاری کارگاه‌های عملی و شبیه‌سازی سناریوهای واقعی به تیم کمک می‌کند تا مهارت‌های عملی را به‌طور مؤثر یاد بگیرند.</p>



<p class="wp-block-paragraph">همچنین، تقسیم وظایف به وضوح برای هر عضو تیم از اهمیت بالایی برخوردار است تا فرآیندها به درستی پیش برود. آموزش باید مداوم باشد، زیرا تکنولوژی‌های مرتبط با کوبرنتیز به سرعت تغییر می‌کنند و دسترسی به منابع به‌روز برای تیم ضروری است. توانمندسازی تیم نه تنها باعث افزایش کارایی می‌شود، بلکه تیم را برای حل چالش‌ها آماده‌تر می‌کند و موفقیت در مهاجرت به کوبرنتیز را تضمین می‌کند.</p>



<h3 class="wp-block-heading" id="h-اجرای-آزمایشی-و-تست-مداوم"><strong>اجرای آزمایشی و تست مداوم</strong></h3>



<p class="wp-block-paragraph">اجرای آزمایشی و تست مداوم بخش حیاتی در مهاجرت به کوبرنتیز است که به شما کمک می‌کند مشکلات احتمالی را قبل از پیاده‌سازی نهایی شناسایی کنید. پس از طراحی و پیاده‌سازی مرحله‌ای یا کامل، لازم است که فرآیندهای سیستم در یک محیط آزمایشی شبیه‌سازی شوند تا عملکرد واقعی کوبرنتیز در شرایط مشابه محیط تولید ارزیابی شود.</p>



<p class="wp-block-paragraph">در این مرحله، باید به شناسایی مشکلاتی مانند خطاهای پیکربندی، ناسازگاری‌های نرم‌افزاری یا مشکلات مقیاس‌پذیری پرداخته و آن‌ها را اصلاح کنید. استفاده از <strong>تست‌های خودکار</strong> برای ارزیابی عملکرد سیستم و <strong>مانیتورینگ مستمر</strong> می‌تواند به شما کمک کند تا از سلامت سیستم مطمئن شوید. همچنین، تست مداوم در طول زمان پس از مهاجرت نیز ضروری است تا هرگونه تغییر یا به‌روزرسانی به درستی ارزیابی و پیاده‌سازی شود.</p>



<p class="wp-block-paragraph">با پیروی از این مراحل و تدوین یک برنامه‌ریزی اصولی، مهاجرت به کوبرنتیز می‌تواند فرصتی بی‌نظیر برای بهبود عملکرد و انعطاف‌پذیری زیرساخت‌های شما باشد. این مسیر شاید چالش‌برانگیز باشد، اما نتایج نهایی ارزش آن را دارند.</p>



<h2 class="wp-block-heading" id="h-۴-نکته-کلیدی-برای-مهاجرت-به-کوبرنتیز">۴ نکته کلیدی برای مهاجرت به کوبرنتیز</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="521" src="https://hamravesh.com/blog/wp-content/uploads/2024/12/Migrating-your-app-to-Kubernetes-1024x521.webp" alt="مهاجرت به کوبرنتیز" class="wp-image-4099" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/12/Migrating-your-app-to-Kubernetes-1024x521.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2024/12/Migrating-your-app-to-Kubernetes-300x153.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2024/12/Migrating-your-app-to-Kubernetes-768x391.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2024/12/Migrating-your-app-to-Kubernetes-1536x782.webp 1536w, https://hamravesh.com/blog/wp-content/uploads/2024/12/Migrating-your-app-to-Kubernetes.webp 1964w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading" id="h-۱-شروع-با-رویکرد-مرحله-ای">۱. <strong>شروع با رویکرد مرحله‌ای</strong></h3>



<p class="wp-block-paragraph">مهاجرت به کوبرنتیز می‌تواند چالش‌برانگیز باشد، بنابراین بهتر است فرآیند را به صورت مرحله‌ای آغاز کنید. این رویکرد به شما این امکان را می‌دهد که ابتدا بخش‌های کوچک‌تر و کم‌خطرتر را به کوبرنتیز منتقل کنید، مشکلات احتمالی را شبیه‌سازی کنید و از آن‌ها درس بگیرید. با گذشت زمان و کسب تجربه، می‌توانید به تدریج پروژه‌های بزرگ‌تر را نیز به این پلتفرم منتقل کنید. این روش به کاهش ریسک و تسهیل فرآیند کمک می‌کند و همچنین به تیم شما فرصت می‌دهد تا با ابزارها و مفاهیم کوبرنتیز به تدریج آشنا شود.</p>



<h3 class="wp-block-heading" id="h-۲-بهره-گیری-از-چند-ابر-multi-cloud-برای-انعطاف-پذیری"><strong>۲. بهره‌گیری از چند ابر (Multi-Cloud) برای انعطاف‌پذیری</strong></h3>



<p class="wp-block-paragraph">استفاده از استراتژی چند ابری (Multi-Cloud) یکی از راهکارهای کلیدی در مهاجرت به کوبرنتیز است. این رویکرد به شما امکان می‌دهد تا از مزایای زیر بهره‌مند شوید:</p>



<ul class="wp-block-list">
<li><strong>انعطاف‌پذیری بیشتر:</strong> با توزیع بار کاری میان چندین ارائه‌دهنده ابری، می‌توانید زیرساخت خود را به شکلی طراحی کنید که وابسته به یک پلتفرم خاص نباشید.</li>



<li><strong>کاهش ریسک وابستگی:</strong> Multi-Cloud از قفل شدن در یک ارائه‌دهنده (Vendor Lock-In) جلوگیری می‌کند و به شما آزادی عمل بیشتری برای تغییر ارائه‌دهنده یا استفاده همزمان از چند سرویس را می‌دهد.</li>



<li><strong>بهینه‌سازی هزینه‌ها:</strong> با مقایسه و استفاده از خدمات مقرون‌به‌صرفه‌تر هر ارائه‌دهنده، می‌توانید هزینه‌های زیرساخت خود را کاهش دهید.</li>



<li><strong>افزایش دسترس‌پذیری:</strong> توزیع سرویس‌ها در چندین ابر، احتمال خرابی یا وقفه در سرویس‌دهی را کاهش داده و باعث افزایش پایداری می‌شود.</li>
</ul>



<p class="wp-block-paragraph">اتخاذ استراتژی چند ابری همراه با کوبرنتیز می‌تواند انعطاف‌پذیری و قابلیت‌های زیرساخت شما را به سطح بالاتری برساند.</p>



<h3 class="wp-block-heading" id="h-۳-استفاده-از-ابزارهای-خودکارسازی">۳. <strong>استفاده از ابزارهای خودکارسازی</strong></h3>



<p class="wp-block-paragraph">ابزارهای خودکارسازی نقش حیاتی در موفقیت مهاجرت به کوبرنتیز دارند و می‌توانند فرآیندهای پیچیده را ساده و کارآمد کنند. برخی از مزایای استفاده از این ابزارها عبارتند از:</p>



<ul class="wp-block-list">
<li><strong>کاهش خطاهای انسانی:</strong> ابزارهایی مانند <strong>Helm</strong> و <strong>Kustomize</strong> امکان مدیریت خودکار تنظیمات و استقرار برنامه‌ها را فراهم می‌کنند، که به کاهش اشتباهات دستی کمک می‌کند.</li>



<li><strong>خودکارسازی فرآیندهای CI/CD:</strong> با استفاده از ابزارهایی مانند <strong>Jenkins</strong>, <strong>GitLab CI/CD</strong>، یا <strong>ArgoCD</strong> می‌توانید استقرارها را سریع‌تر و با اطمینان بیشتری انجام دهید.</li>



<li><strong>مدیریت منابع:</strong> ابزارهای خودکارسازی به شما کمک می‌کنند منابع را بهینه تخصیص دهید و اطمینان حاصل کنید که کانتینرها تنها از منابع مورد نیاز استفاده می‌کنند.</li>



<li><strong>استانداردسازی محیط‌ها:</strong> این ابزارها محیط‌های توسعه، آزمایش و تولید را یکپارچه و استاندارد می‌کنند، که به تیم‌ها اجازه می‌دهد در محیط‌های مشابه کار کنند.</li>



<li><strong>تسریع فرآیند مهاجرت:</strong> خودکارسازی فعالیت‌های تکراری و وقت‌گیر، زمان و تلاش مورد نیاز برای مهاجرت را کاهش می‌دهد.</li>
</ul>



<p class="wp-block-paragraph">با انتخاب و استفاده از ابزارهای مناسب، می‌توانید فرآیند مهاجرت به کوبرنتیز را ساده‌تر، سریع‌تر و قابل‌اعتمادتر کنید.</p>



<h3 class="wp-block-heading" id="h-۴-تدوین-برنامه-بازگشت-rollback-plan">۴. <strong>تدوین برنامه بازگشت (Rollback Plan)</strong></h3>



<p class="wp-block-paragraph">در مهاجرت به کوبرنتیز، هرچند که تمام تلاش‌ها برای اجرای صحیح انجام شود، باز هم احتمال وقوع مشکلات یا شکست‌هایی وجود دارد. داشتن یک برنامه بازگشت (Rollback Plan) اطمینان می‌دهد که در صورت بروز خطا، می‌توانید سیستم را به حالت پایدار قبلی بازگردانید.</p>



<p class="wp-block-paragraph">ویژگی‌های کلیدی یک برنامه بازگشت مؤثر شامل موارد زیر است:</p>



<ul class="wp-block-list">
<li><strong>تهیه نسخه‌های پشتیبان:</strong> پیش از شروع مهاجرت، از داده‌ها، پیکربندی‌ها و سرویس‌های کلیدی نسخه‌های پشتیبان تهیه کنید تا در مواقع نیاز بتوانید آن‌ها را بازیابی کنید.</li>



<li><strong>ایجاد نقاط بازگشت:</strong> در هر مرحله از مهاجرت، نقاط بازگشت مشخصی تعریف کنید که امکان بازگرداندن تغییرات تا آن مرحله را فراهم می‌کند.</li>



<li><strong>تست بازگشت:</strong> قبل از اجرای مهاجرت در محیط تولید، فرآیند بازگشت را در محیط‌های آزمایشی شبیه‌سازی و آزمایش کنید تا از کارایی آن اطمینان حاصل شود.</li>



<li><strong>مستند‌سازی فرآیند:</strong> تمامی مراحل و اقدامات لازم برای بازگشت باید به‌طور دقیق مستند شود تا تیم بتواند به سرعت و بدون اشتباه عمل کند.</li>



<li><strong>آمادگی تیم:</strong> اعضای تیم باید با برنامه بازگشت آشنا باشند و نقش هر یک در اجرای آن مشخص باشد.</li>
</ul>



<p class="wp-block-paragraph">برنامه بازگشت نه تنها از سیستم شما در برابر خطاهای احتمالی محافظت می‌کند، بلکه به تیم و سازمان آرامش خاطر می‌دهد که حتی در شرایط پیش‌بینی‌نشده نیز آمادگی کامل وجود دارد.</p>



<h2 class="wp-block-heading" id="h-در-پایان"><strong>در پایان</strong></h2>



<p class="wp-block-paragraph">مهاجرت به کوبرنتیز گامی بزرگ و تأثیرگذار برای بهبود زیرساخت‌ها، مقیاس‌پذیری و مدیریت سرویس‌ها در سازمان‌هاست. با این حال، این فرآیند بدون برنامه‌ریزی دقیق، استفاده از رویکردهای مناسب و آماده‌سازی تیم می‌تواند به چالشی جدی تبدیل شود. در این مسیر، تدوین استراتژی مرحله‌ای، استفاده از ابزارهای خودکارسازی، آموزش مستمر تیم و طراحی برنامه بازگشت از جمله اقداماتی هستند که می‌توانند موفقیت شما را تضمین کنند.</p>



<p class="wp-block-paragraph">به یاد داشته باشید که مهاجرت به کوبرنتیز تنها یک پروژه نیست، بلکه یک تحول فرهنگی و فنی در سازمان است. این تغییر به شما کمک می‌کند تا زیرساخت‌های خود را مدرن‌تر، چابک‌تر و مقاوم‌تر کنید. با ارزیابی دقیق نیازها و چالش‌های خود و اجرای بهترین رویکردها، می‌توانید از این فناوری پیشرفته برای تحقق اهداف سازمانی خود بهره‌مند شوید.</p>



<p class="wp-block-paragraph">با حرکت گام‌به‌گام و آمادگی کامل، مهاجرت به کوبرنتیز می‌تواند به یکی از ارزشمندترین تصمیمات استراتژیک شما تبدیل شود.</p>
<p>The post <a href="https://hamravesh.com/blog/kubernetes-migration-best-practices/">مهاجرت به کوبرنتیز: نکات و بهترین رویکردها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/kubernetes-migration-best-practices/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
