<?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/author/hamravesh-blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://hamravesh.com/blog/author/hamravesh-blog/</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/author/hamravesh-blog/</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/scheduled-maintenance-1405-05-30/</link>
					<comments>https://hamravesh.com/blog/scheduled-maintenance-1405-05-30/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Sat, 15 Aug 2026 05:13:00 +0000</pubDate>
				<category><![CDATA[اخبار هم‌روش]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5601</guid>

					<description><![CDATA[<p>به‌منظور افزایش پایداری زیرساخت و رفع عوامل ایجادکننده ناپایداری‌های اخیر، عملیات نگهداری برنامه‌ریزی‌شده‌ای روی کنسول هم‌روش و برخی از سرویس‌ها اجرا خواهد شد. این عملیات از ساعت ۰۰:۰۰ تا ۰۸:۰۰ روز جمعه ۳۰ مرداد ۱۴۰۵ انجام می‌شود. در طول این عملیات، اپلیکیشن‌ها و دیتابیس‌های ایجادشده پیش از آغاز بازه نگهداری همچنان در دسترس خواهند بود. [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/scheduled-maintenance-1405-05-30/">اطلاعیه عملیات نگهداری برنامه‌ریزی‌شده هم‌روش در ۳۰ مرداد ۱۴۰۵</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">به‌منظور افزایش پایداری زیرساخت و رفع عوامل ایجادکننده ناپایداری‌های اخیر، عملیات نگهداری برنامه‌ریزی‌شده‌ای روی کنسول هم‌روش و برخی از سرویس‌ها اجرا خواهد شد. این عملیات از <strong>ساعت ۰۰:۰۰ تا ۰۸:۰۰ روز جمعه ۳۰ مرداد ۱۴۰۵</strong> انجام می‌شود.</p>



<p class="wp-block-paragraph">در طول این عملیات، <strong>اپلیکیشن‌ها و دیتابیس‌های ایجادشده پیش از آغاز بازه نگهداری همچنان در دسترس خواهند بود.</strong> بااین‌حال، برخی قابلیت‌های مدیریتی کنسول غیرفعال می‌شوند و سرویس‌های سنتری، هم‌گیت و کانتینر رجیستری موقتاً از دسترس خارج خواهند شد.</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">جمعه ۳۰ مرداد ۱۴۰۵<br>از ساعت ۰۰:۰۰ تا ۰۸:۰۰<br>(اختلال هر سرویس ممکن است تمام یا بخشی از این بازه را دربر بگیرد.)</td></tr></tbody></table></figure>



<h2 id="h-اختلال-در-عملکرد-کنسول-هم-روش" class="wp-block-heading">اختلال در عملکرد کنسول هم‌روش</h2>



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



<ul class="wp-block-list">
<li>اکشن‌های کنسول هم‌روش غیر فعال می‌شوند؛ به نحوی که امکان ایجاد تغییرات در سرویس‌ها از طریق کنسول هم‌روش وجود نخواهد داشت.</li>



<li> در این بازه، در بخش پشتیبانی، سیستم <a href="https://console.hamravesh.com/ticketing" data-type="link" data-id="https://console.hamravesh.com/ticketing" target="_blank" rel="noreferrer noopener">ثبت تیکت</a> هم‌روش همچنان فعال است.</li>
</ul>



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



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



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



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



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



<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">در طول بازه عملیات نگهداری، سرویس‌های سنتری و هم‌گیت به‌طور کامل از دسترس خارج می‌شوند:</p>



<ul class="wp-block-list">
<li><strong>هم‌گیت:</strong> دسترسی به مخزن‌ها و انجام عملیات مرتبط با Git امکان‌پذیر نخواهد بود. اجرای پایپ‌لاین‌ها و GitLab Runnerهای تحت تأثیر نیز تا پایان عملیات متوقف خواهد شد. داده‌های ذخیره‌شده پیش از آغاز عملیات حفظ می‌شوند.</li>



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



<h2 id="h-اختلال-در-عملکرد-سرویس-بکاپ" class="wp-block-heading">اختلال در عملکرد سرویس بکاپ</h2>



<p class="wp-block-paragraph">در این بازه، وضعیت سرویس بکاپ به شرح زیر خواهد بود:</p>



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



<li>در این بازه، فرایند بکاپ‌گیری دستی یا خودکار غیر فعال می‌شود.</li>



<li>پس از پایان بازه نگهداری، مجددا فرایند بکاپ‌گیری خودکار از سر گرفته می‌شود.</li>
</ul>



<h2 id="h-عدم-کارکرد-کانتینر-رجیستری" class="wp-block-heading">عدم کارکرد کانتینر رجیستری</h2>



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



<h2 id="h-موارد-مالی-تحت-تاثیر-اختلال" class="wp-block-heading">موارد مالی تحت تاثیر اختلال</h2>



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



<ul class="wp-block-list">
<li>در طول عملیات، درگاه پرداخت در دسترس نخواهد بود و تأیید خودکار واریزهای شناسه‌دار انجام نمی‌شود. در صورت انجام واریز شناسه‌دار، می‌توانید از طریق <a href="https://console.hamravesh.com/ticketing" data-type="link" data-id="https://console.hamravesh.com/ticketing" target="_blank" rel="noreferrer noopener">ثبت تیکت</a> بررسی و تأیید واریز را پیگیری کنید.</li>



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



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



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



<h2 id="h-وضعیت-سایر-سرویس-ها" class="wp-block-heading">وضعیت سایر سرویس‌ها</h2>



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



<h2 id="h-خلاصه-وضعیت-سرویس-ها" class="wp-block-heading">خلاصه وضعیت سرویس‌ها</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>سرویس</th><th class="has-text-align-center" data-align="center">وضعیت در بازه نگهداری</th><th class="has-text-align-center" data-align="center">وضعیت سرویس‌های قبلی</th></tr></thead><tbody><tr><td>کنسول هم‌روش</td><td class="has-text-align-center" data-align="center">عملیات مدیریتی غیرفعال؛ اطلاعات نمایش‌داده‌شده به‌روز نمی‌شود</td><td class="has-text-align-center" data-align="center">داده‌های قبلی محفوظ می‌مانند</td></tr><tr><td>پلتفرم دارکوب</td><td class="has-text-align-center" data-align="center">بیلد، دیپلوی و عملیات مدیریتی غیرفعال</td><td class="has-text-align-center" data-align="center">اپلیکیشن‌های موجود فعال هستند؛ داده‌های قبلی محفوظ‌ می‌مانند</td></tr><tr><td>بازارچه</td><td class="has-text-align-center" data-align="center">ایجاد اپلیکیشن جدید و عملیات مدیریتی غیرفعال</td><td class="has-text-align-center" data-align="center">اپلیکیشن‌های موجود فعال هستند؛ داده‌های قبلی محفوظ‌ می‌مانند</td></tr><tr><td>دیتابیس مدیریت‌شده</td><td class="has-text-align-center" data-align="center">ایجاد دیتابیس جدید و عملیات مدیریتی غیرفعال</td><td class="has-text-align-center" data-align="center">دیتابیس‌های موجود فعال هستند؛ داده‌های قبلی محفوظ‌ می‌مانند</td></tr><tr><td>سرویس بکاپ</td><td class="has-text-align-center" data-align="center">بکاپ‌گیری خودکار و دستی غیرفعال</td><td class="has-text-align-center" data-align="center">امکان مشاهده و دانلود بکاپ‌های قبلی فراهم است</td></tr><tr><td>هم‌گیت</td><td class="has-text-align-center" data-align="center">خارج از دسترس</td><td class="has-text-align-center" data-align="center">مخزن‌ها در دسترس نیستند؛ داده‌های قبلی محفوظ می‌مانند</td></tr><tr><td>سنتری</td><td class="has-text-align-center" data-align="center">خارج از دسترس</td><td class="has-text-align-center" data-align="center">سرویس در دسترس نیست؛ داده‌های قبلی محفوظ می‌مانند اما رخدادهای جدید ثبت نمی‌شوند</td></tr><tr><td>سرویس کانتینر رجیستری</td><td class="has-text-align-center" data-align="center">خارج از دسترس</td><td class="has-text-align-center" data-align="center">سرویس در دسترس نیست؛ داده‌های قبلی محفوظ می‌مانند</td></tr><tr><td>مالی و صورت‌حساب در کنسول</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>



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



<p class="wp-block-paragraph">وضعیت اجرای عملیات و پایان آن از طریق صفحه «<a href="https://hamraveshstatus.com" data-type="link" data-id="https://hamraveshstatus.com" target="_blank" rel="noreferrer noopener">وضعیت سرویس‌های هم‌روش</a>» اطلاع‌رسانی خواهد شد.</p>



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



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/scheduled-maintenance-1405-05-30/">اطلاعیه عملیات نگهداری برنامه‌ریزی‌شده هم‌روش در ۳۰ مرداد ۱۴۰۵</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/scheduled-maintenance-1405-05-30/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-sentry/</link>
					<comments>https://hamravesh.com/blog/what-is-sentry/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 08:27:51 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[مشاهده‌پذیری]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5564</guid>

					<description><![CDATA[<p>Sentry (سنتری) با جمع‌آوری و ارتباط‌دادن این داده‌ها، دید یکپارچه‌تری از رفتار اپلیکیشن در زمان وقوع مشکل ارائه می‌دهد. به همین دلیل، Sentry فقط یک ابزار ثبت خطا نیست، بلکه داده‌های مرتبط با خطاها، Traceها، لاگ‌ها و مشاهده رفتار واقعی کاربران را در کنار یکدیگر قرار می‌دهد تا عیب‌یابی بر پایه شواهد کامل‌تری انجام شود. </p>
<p>The post <a href="https://hamravesh.com/blog/what-is-sentry/">سنتری چیست؟ از پایش خطای اپلیکیشن تا تحلیل عملکرد در سطح کد</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">فرض کنید نسخه جدید یک اپلیکیشن منتشر شده، اما پس از انتشار، بخشی از درخواست‌های پرداخت کامل نمی‌شوند. در رابط کاربری هم خطای مشخصی دیده نمی‌شود و گزارش کاربران هم اطلاعات کافی برای بازتولید مشکل در اختیار تیم فنی قرار نمی‌دهد. در نتیجه، مشخص نیست اختلال دقیقا از کدام بخش سیستم آغاز شده است. برای پیدا کردن علت مشکل، فقط مشاهده یک پیام خطا کافی نیست. تیم فنی باید بداند خطا برای کدام کاربران، در کدام نسخه و در امتداد کدام درخواست رخ داده است. همچنین لازم است ارتباط میان خطاها، ردیابی توزیع‌شده یا Distributed Tracing، لاگ‌ها و سایر شواهد فنی را بررسی کند تا مسیر رسیدن به علت اصلی کوتاه‌تر شود.</p>



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



<h2 id="h-sentry-چیست" class="wp-block-heading"><strong>Sentry چیست؟</strong></h2>



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



<p class="wp-block-paragraph">نرم‌افزار Sentry فعالیت خود را به‌عنوان ابزاری برای پایش خطا آغاز کرد، اما در سال‌های اخیر قابلیت‌هایی مانند Logs ،Tracing ،Profiling و Session Replay هم به آن اضافه شدند.</p>



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



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



<p class="wp-block-paragraph">فرایند کار Sentry را می‌توان در چهار مرحله بررسی کرد:</p>



<h3 id="h-۱-اتصال-اپلیکیشن-به-sentry-از-طریق-sdk" class="wp-block-heading"><strong>۱. اتصال اپلیکیشن به Sentry از طریق SDK</strong></h3>



<p class="wp-block-paragraph">نخستین گام، نصب و پیکربندی کیت توسعه نرم‌افزار (SDK) متناسب با زبان و فریم‌ورک اپلیکیشن است. سنتری برای بسیاری از پلتفرم‌های بک‌اِند، فرانت‌اِند، موبایل، دسکتاپ و توسعه بازی‌ها پشتیبانی می‌کند. <a href="https://docs.sentry.io/platforms" data-type="link" data-id="https://docs.sentry.io/platforms" target="_blank" rel="noreferrer noopener">لیست کامل پلتفرم‌های پشتیبانی شده توسط سنتری</a> در وب‌سایت سنتری قابل مشاهده است. پس از انجام تنظیمات اولیه، SDK رخدادها و اطلاعات زمینه‌ای مرتبط را از اپلیکیشن جمع‌آوری و به پروژه Sentry ارسال می‌کند.</p>



<h3 id="h-۲-جمع-آوری-خطا-و-اطلاعات-زمینه-ای" class="wp-block-heading"><strong>۲. جمع‌آوری خطا و اطلاعات زمینه‌ای</strong></h3>



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



<h3 id="h-۳-ارتباط-خطاها-و-لاگ-ها-با-trace-و-span" class="wp-block-heading"><strong>۳. ارتباط خطاها و لاگ‌ها با Trace و Span</strong></h3>



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



<p class="wp-block-paragraph"><strong>تفاوت Error و Span چیست؟</strong></p>



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



<h3 id="h-۴-تحلیل-عملکرد-در-سطح-trace-و-تابع" class="wp-block-heading"><strong>۴. تحلیل عملکرد در سطح Trace و تابع</strong></h3>



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



<h2 id="h-قابلیت-های-اصلی-sentry-چیست" class="wp-block-heading"><strong>قابلیت‌های اصلی Sentry چیست؟</strong></h2>



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



<h3 id="h-پایش-و-تحلیل-خطاها" class="wp-block-heading"><strong>پایش و تحلیل خطاها</strong></h3>



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



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="569" src="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-01-1024x569.webp" alt="شناسایی و اولویت‌بندی مشکلات در سنتری" class="wp-image-5582" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-01-1024x569.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-01-300x167.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-01-768x427.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-01-1536x853.webp 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-01-2048x1138.webp 2048w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-01-120x67.webp 120w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">سنتری، اطلاعات موردنیاز برای بررسی هر مشکل عملکردی را در نمای یکپارچه ارائه می‌دهد. تیم فنی می‌تواند گستره تأثیر، روند تکرار و شواهد فنی مشکل را بررسی کند. همچنین امکان بررسی روند تکرار مشکل و ارتباط آن با نسخه‌های منتشرشده و نیز شناسایی تابع و کوئری‌های تکرارشونده موثر در افت عملکرد فراهم شده است.</figcaption></figure>



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



<h3 id="h-پایش-عملکرد-و-distributed-tracing" class="wp-block-heading"><strong>پایش عملکرد و Distributed Tracing</strong></h3>



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



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="569" src="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-02-1024x569.webp" alt="تحلیل مسیر اجرای درخواست‌ها در سنتری" class="wp-image-5584" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-02-1024x569.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-02-300x167.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-02-768x427.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-02-1536x853.webp 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-02-2048x1138.webp 2048w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-02-120x67.webp 120w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">سنتری با نمای آبشاری یک Trace، مسیر اجرای درخواست را از فرانت‌اند، سرویس‌های مختلف و پایگاه داده نمایش می‌دهد. مقایسه زمان اجرای عملیات مختلف به تیم فنی کمک می‌کند منشأ کندی را در میان اجزای وابسته پیدا کند، ارتباط والد و فرزند میان درخواست‌ها، توابع و کوئری‌ها را مشاهده کند و عملکرد صفحه را با شاخص‌های LCP ،FCP ،CLS و TTFB بسنجد.</figcaption></figure>



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



<h3 id="h-بررسی-عملکرد-در-سطح-کد-با-profiling" class="wp-block-heading"><strong>بررسی عملکرد در سطح کد با Profiling</strong></h3>



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



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



<h3 id="h-مشاهده-لاگ-های-ساختاریافته" class="wp-block-heading"><strong>مشاهده لاگ‌های ساختاریافته</strong></h3>



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



<p class="wp-block-paragraph">لاگ‌های ساختاریافته را می‌توان به Trace و Span مربوط به همان درخواست متصل کرد. به این ترتیب، هنگام بررسی یک خطا یا مشکل عملکردی، می‌توان لاگ‌های مرتبط با همان درخواست را در کنار سایر شواهد مشاهده کرد و مسیر رسیدن به علت اصلی را سریع‌تر دنبال کرد. Sentry همچنین امکان مشاهده زنده لاگ‌ها (Live Tail) و ساخت Alert و Dashboard بر اساس الگوهای ثبت‌شده را فراهم می‌کند.</p>



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



<h3 id="h-بازسازی-مسیر-کاربر-با-session-replay" class="wp-block-heading"><strong>بازسازی مسیر کاربر با Session Replay</strong></h3>



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



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="569" src="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-03-1024x569.webp" alt="قابلیت Session Replay در سنتری" class="wp-image-5583" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-03-1024x569.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-03-300x167.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-03-768x427.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-03-1536x853.webp 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-03-2048x1138.webp 2048w, https://hamravesh.com/blog/wp-content/uploads/2026/08/hamravesh-sentry-03-120x67.webp 120w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">قابلیت Session Replay در سنتری، تعامل کاربر با اپلیکیشن را در کنار رویدادهای فنی بازسازی می‌کند. تیم توسعه می‌تواند ببیند کاربر چه اقداماتی انجام داده، در کدام مرحله با مشکل مواجه شده و هم‌زمان چه خطایی در برنامه ثبت شده است. Session Replay همچنین امکان شناسایی کلیک‌های بی‌نتیجه یا عصبی را فراهم می‌کند و قابلیت محافظت از اطلاعات حساس کاربران با پنهان‌سازی خودکار محتوای صفحه دارد.</figcaption></figure>



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



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



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



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



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



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



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



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



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



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



<h2 id="h-مزایای-استفاده-از-sentry-برای-تیم-های-فنی" class="wp-block-heading"><strong>مزایای استفاده از Sentry برای تیم‌های فنی</strong></h2>



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



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



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



<h3 id="h-کاهش-نیاز-به-بازتولید-دستی-تمام-خطاها" class="wp-block-heading"><strong>کاهش نیاز به بازتولید دستی تمام خطاها</strong></h3>



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



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



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



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



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



<h2 id="h-محدودیت-ها-و-ملاحظات-استفاده-از-sentry" class="wp-block-heading"><strong>محدودیت‌ها و ملاحظات استفاده از Sentry</strong></h2>



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



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



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



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



<h3 id="h-جمع-آوری-داده-بیشتر-همیشه-به-عیب-یابی-بهتر-منجر-نمی-شود" class="wp-block-heading"><strong>جمع‌آوری داده بیشتر، همیشه به عیب‌یابی بهتر منجر نمی‌شود</strong></h3>



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



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



<h3 id="h-هزینه-استفاده-با-حجم-داده-افزایش-پیدا-می-کند" class="wp-block-heading"><strong>هزینه استفاده با حجم داده افزایش پیدا می‌کند</strong></h3>



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



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



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



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



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



<h2 id="h-استقرار-شخصی-sentry-چیست" class="wp-block-heading"><strong>استقرار شخصی Sentry چیست؟</strong></h2>



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



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



<h2 id="h-چالش-های-راه-اندازی-و-نگهداری-استقرار-شخصی-sentry" class="wp-block-heading"><strong>چالش‌های راه‌اندازی و نگهداری استقرار شخصی Sentry</strong></h2>



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



<h3 id="h-معماری-چندجزئی-sentry" class="wp-block-heading"><strong>معماری چندجزئی Sentry</strong></h3>



<p class="wp-block-paragraph">استقرار شخصی Sentry به چند سرویس زیرساختی وابسته است که از جمله آن‌ها می‌توان به PostgreSQL ،Redis ،Kafka ،ClickHouse و Relay اشاره کرد.</p>



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



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



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



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



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



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



<h3 id="h-پشتیبان-گیری-و-بازیابی" class="wp-block-heading"><strong>پشتیبان‌گیری و بازیابی</strong></h3>



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



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



<h3 id="h-پایش-خود-sentry" class="wp-block-heading"><strong>پایش خود Sentry</strong></h3>



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



<h3 id="h-هزینه-پنهان-نیروی-فنی" class="wp-block-heading"><strong>هزینه پنهان نیروی فنی</strong></h3>



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



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



<h2 id="h-چه-زمانی-استقرار-شخصی-sentry-انتخاب-مناسبی-است" class="wp-block-heading"><strong>چه زمانی استقرار شخصی Sentry انتخاب مناسبی است؟</strong></h2>



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



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



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



<h2 id="h-سرویس-مدیریت-شده-sentry-چه-تفاوتی-با-self-hosted-دارد" class="wp-block-heading"><strong>سرویس مدیریت‌شده Sentry چه تفاوتی با Self-hosted دارد؟</strong></h2>



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



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>معیار</strong></th><th><strong>استقرار Self-hosted</strong></th><th><strong>سرویس سنتری هم‌روش</strong></th></tr></thead><tbody><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><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>



<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">استفاده از Sentry بدون پذیرش بار عملیاتی Self-hosting</p>



<p class="wp-block-paragraph"><br>✅ راه‌اندازی و نگهداری زیرساخت توسط هم‌روش<br>✅ کاهش بار عملیاتی تیم‌های توسعه، DevOps و Platform<br>✅ امکان استقرار و نگهداری روی زیرساخت اختصاصی سازمان</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/sentry" 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">برای بسیاری از تیم‌های فنی، چالش اصلی استفاده از Sentry خودِ قابلیت‌های آن نیست؛ بلکه زمان و منابعی است که باید برای نصب، نگهداری، ارتقای نسخه‌ها و مدیریت زیرساخت صرف شود. سنتری هم‌روش این مسئولیت‌های عملیاتی را بر عهده می‌گیرد تا تیم‌ها بتوانند بدون درگیر شدن با مدیریت زیرساخت، از Sentry استفاده کنند.</p>



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



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



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



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



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



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



<p class="wp-block-paragraph">در این مطلب بررسی کردیم که Sentry چیست و چه قابلیت‌ها و محدودیت‌هایی دارد و به چه روش‌هایی ارائه می‌شود. همچنین توضیح دادیم سرویس مدیریت‌شده می‌تواند برای تیم‌هایی مناسب باشد که می‌خواهند از قابلیت‌های Sentry استفاده کنند، اما نمی‌خواهند زمان تیم فنی خود را صرف نگهداری زیرساخت آن کنند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-sentry/">سنتری چیست؟ از پایش خطای اپلیکیشن تا تحلیل عملکرد در سطح کد</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-sentry/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 loading="lazy" 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="auto, (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>راکت چت چیست؟ بررسی قابلیت‌ها، امنیت و روش‌های استقرار</title>
		<link>https://hamravesh.com/blog/what-is-rocketchat/</link>
					<comments>https://hamravesh.com/blog/what-is-rocketchat/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 29 Jul 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5417</guid>

					<description><![CDATA[<p>Rocket.Chat یکی از شناخته‌شده‌ترین پلتفرم‌های متن‌باز در این حوزه است که امکان راه‌اندازی یک پیام‌رسان سازمانی روی زیرساخت اختصاصی یا محیط‌های ابری را فراهم می‌کند. </p>
<p>The post <a href="https://hamravesh.com/blog/what-is-rocketchat/">راکت چت چیست؟ بررسی قابلیت‌ها، امنیت و روش‌های استقرار</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ارتباطات داخلی یکی از بخش‌های مهم زیرساخت فناوری اطلاعات در بسیاری از سازمان‌ها است. استفاده از ابزارهای عمومی پیام‌رسان همیشه پاسخگوی نیاز سازمان‌هایی که به کنترل بیشتر روی داده‌ها، امنیت ارتباطات و استقرار در زیرساخت اختصاصی نیاز دارند نیست. به همین دلیل، بسیاری از سازمان‌ها به سراغ راهکارهای پیام‌رسان سازمانی می‌روند. معمولا این نیاز زمانی جدی‌تر می‌شود که سازمان بخواهد داده‌های ارتباطی خود را روی زیرساخت اختصاصی نگه دارد یا با محدودیت‌های انطباق و حریم خصوصی سروکار داشته باشد. Rocket Chat یکی از شناخته‌شده‌ترین پلتفرم‌های متن‌باز در این حوزه است که امکان راه‌اندازی یک پیام‌رسان سازمانی روی زیرساخت اختصاصی یا محیط‌های ابری را فراهم می‌کند. در این مقاله بررسی می‌کنیم راکت چت چیست، چه قابلیت‌هایی دارد، برای چه سازمان‌هایی مناسب است، چه مزایا و محدودیت‌هایی دارد و تفاوت آن با ابزارهایی مانند Slack و Mattermost چیست.</p>



<h2 id="h-راکت-چت-چیست" class="wp-block-heading">راکت چت چیست؟</h2>



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



<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">Rocket Chat مجموعه‌ای از قابلیت‌های ارتباطی، مدیریتی و امنیتی را در یک پلتفرم واحد ارائه می‌دهد تا سازمان‌ها بتوانند ارتباطات داخلی و بین‌سازمانی خود را بدون نیاز به استفاده از چند ابزار مختلف مدیریت کنند. مهم‌ترین قابلیت‌های این نرم‌افزار چت سازمانی عبارت‌اند از:</p>



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



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



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



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



<p class="wp-block-paragraph">راکت چت از قابلیت‌هایی مانند مدیریت دسترسی مبتنی بر نقش و اتصال به سامانه‌های هویت سازمانی مانند LDAP ،Active Directory و راهکارهای ورود یکپارچه (SSO) پشتیبانی می‌کند. بعضی از روش‌های احراز هویت و کنترل دسترسی پیشرفته ممکن است تنها در پلن‌های مشخص در دسترس باشند.</p>



<h3 id="h-یکپارچه-سازی-و-توسعه-پذیری" class="wp-block-heading">یکپارچه‌سازی و توسعه‌پذیری</h3>



<p class="wp-block-paragraph">این پیام‌رسان سازمانی امکان اتصال به ابزارها و سرویس‌های دیگر را فراهم می‌کند. سازمان‌ها می‌توانند از اپلیکیشن‌های آماده Marketplace استفاده کنند یا با کمک Apps Engine، برنامه‌ها، بات‌ها و گردش‌کارهای اختصاصی خود را توسعه دهند. راکت چت همچنین API و SDKهایی برای اتصال به سامانه‌های دیگر ارائه می‌دهد. قابلیت‌هایی مانند Matrix Federation و پل‌های ارتباطی Microsoft Teams و XMPP نیز در پلن‌های سازمانی این پلتفرم ارائه شده‌اند.</p>



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



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



<h3 id="h-سفارشی-سازی-و-شخصی-سازی" class="wp-block-heading">سفارشی‌سازی و شخصی‌سازی</h3>



<p class="wp-block-paragraph">Rocket Chat امکاناتی برای سفارشی‌سازی ظاهر و عملکرد محیط کاری ارائه می‌دهد. این امکانات شامل تغییر قالب و چیدمان، استفاده از CSS و JavaScript سفارشی، تغییر برند، تعریف Emoji، صدا و وضعیت‌های اختصاصی و توسعه اپلیکیشن‌ها و گردش‌کارهای سفارشی با Apps Engine است. دسترسی به هر یک از این امکانات باید براساس پلن مورد استفاده بررسی شود.</p>



<h3 id="h-اپلیکیشن-موبایل" class="wp-block-heading">اپلیکیشن موبایل</h3>



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



<h2 id="h-امنیت-در-راکت-چت" class="wp-block-heading">امنیت در راکت چت</h2>



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



<h3 id="h-مدل-امنیتی-zero-trust" class="wp-block-heading">مدل امنیتی Zero-Trust</h3>



<p class="wp-block-paragraph">Rocket Chat از قابلیت‌های مدل امنیتی Zero-Trust (اعتماد صفر) پشتیبانی می‌کند. از جمله این قابلیت‌ها می‌توان به کنترل دسترسی مبتنی بر ویژگی و به‌روزرسانی پویای دسترسی براساس اطلاعات هویتی اشاره کرد. این امکانات در پلن‌های سازمانی و دفاعی ارائه می‌شوند و سطح دسترسی به آن‌ها در همه پلن‌ها یکسان نیست.</p>



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



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



<h3 id="h-استقرار-در-محیط-های-ایزوله" class="wp-block-heading">استقرار در محیط‌های ایزوله</h3>



<p class="wp-block-paragraph">Rocket Chat علاوه بر استقرار روی سرورهای داخلی، از اجرای Self-Hosted و محیط‌های کاملا ایزوله از اینترنت (Air-gapped) هم پشتیبانی می‌کند. این روش استقرار برای سازمان‌هایی که نیازمند سطح بالاتری از حفاظت داده‌ها هستند، در نسخه‌های سازمانی در دسترس است.</p>



<h3 id="h-رمزنگاری-ارتباطات" class="wp-block-heading">رمزنگاری ارتباطات</h3>



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



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



<p class="wp-block-paragraph">Rocket Chat قابلیت‌هایی مانند کنترل دسترسی مبتنی بر نقش، ورود یکپارچه، احراز هویت چندعاملی و اتصال به Active Directory و LDAP را برای مدیریت هویت و دسترسی ارائه می‌دهد. در پلن‌های پیشرفته‌تر، کنترل دسترسی مبتنی بر ویژگی و اتصال به Policy Decision Point نیز در دسترس است (Policy Decision Point یا PDP بخشی از سامانه کنترل دسترسی است که براساس ویژگی‌های کاربر و سیاست‌های امنیتی سازمان، درباره مجاز یا غیرمجاز بودن دسترسی تصمیم می‌گیرد).</p>



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



<p class="wp-block-paragraph">راکت چت برای نظارت بر فعالیت‌های کاربران، امکان ثبت لاگ‌های حسابرسی (Audit Logs) را فراهم می‌کند. همچنین مدیران می‌توانند سیاست‌های نگهداری داده (Data Retention Policies) را تعریف&nbsp; کرده و از قابلیت‌هایی مانند جلوگیری از نشت اطلاعات (Data Loss Prevention) و ابزارهای پایش محتوا استفاده کنند.</p>



<h3 id="h-پشتیبانی-از-الزامات-انطباق" class="wp-block-heading">پشتیبانی از الزامات انطباق</h3>



<p class="wp-block-paragraph">براساس صفحه پلن‌های Rocket Chat، این شرکت دارای گواهی ISO 27001 (استاندارد بین‌المللی مدیریت امنیت اطلاعات) است و ارزیابی SOC 2 Type 2 (گزارش ارزیابی اثربخشی کنترل‌های امنیتی یک شرکت در یک دوره زمانی مشخص) را تکمیل کرده است. راکت چت همچنین خود را HIPAA-supportive (پشتیبانی از الزامات قانونی آمریکا برای حفاظت از اطلاعات سلامت) معرفی می‌کند و امکان ارائه Business Associate Agreement (قراردادی که مسئولیت‌های راکت چت و سازمان را درباره نگهداری و حفاظت از اطلاعات سلامت مشخص می‌کند) را دارد. برای GDPR (مقررات حفاظت از داده‌های شخصی در اتحادیه اروپا) نیز قابلیت‌هایی در زمینه مدیریت، نگهداری و محل پردازش داده ارائه می‌دهد. سطح این امکانات و شرایط استفاده از آن‌ها به پلن و مدل استقرار بستگی دارد.</p>



<h2 id="h-روش-های-استقرار-راکت-چت" class="wp-block-heading">روش‌های استقرار راکت چت</h2>



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



<h3 id="h-استقرار-روی-زیرساخت-اختصاصی-on-premises" class="wp-block-heading">استقرار روی زیرساخت اختصاصی (On-Premises)</h3>



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



<h3 id="h-استقرار-در-محیط-های-ابری" class="wp-block-heading">استقرار در محیط‌های ابری</h3>



<p class="wp-block-paragraph">«Rocket Chat امکان استقرار در محیط‌های ابری را نیز فراهم می‌کند. گزینه‌های سازمانی آن شامل Sovereign Cloud و میزبانی اختصاصی مدیریت‌شده است. در مدل Dedicated Cloud Hosting، زیرساخت اختصاصی همراه با کمک تخصصی برای استقرار در اختیار سازمان قرار می‌گیرد.</p>



<h3 id="h-استقرار-در-شبکه-های-ایزوله-air-gapped" class="wp-block-heading">استقرار در شبکه‌های ایزوله (Air-gapped)</h3>



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



<h3 id="h-استفاده-از-اپلیکیشن-های-آماده-one-click" class="wp-block-heading">استفاده از اپلیکیشن‌های آماده (One-Click)</h3>



<p class="wp-block-paragraph">برخی ارائه‌دهندگان زیرساخت ابری، Rocket Chat را برای راه‌اندازی سریع‌تر به‌صورت اپلیکیشن آماده نصب (One-Click App) ارائه می‌کنند. هم‌روش هم در نسخه‌های رایگان و پریمیوم این پلتفرم را به همین شکل در اختیار کاربران قرار می‌دهد.</p>



<h3 id="h-قابلیت-های-مرتبط-با-استقرار-در-نسخه-های-سازمانی" class="wp-block-heading">قابلیت‌های مرتبط با استقرار در نسخه‌های سازمانی</h3>



<p class="wp-block-paragraph">Rocket Chat در پلن‌های سازمانی قابلیت‌هایی مانند معماری <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> با Failover خودکار را ارائه می‌دهد. <a href="https://hamravesh.com/blog/what-is-disaster-recovery/" data-type="link" data-id="https://hamravesh.com/blog/what-is-disaster-recovery/" target="_blank" rel="noreferrer noopener">بازیابی از فاجعه</a> نیز در صفحه پلن‌ها برای Workspaceهای ابری ذکر شده است. دسترسی به این قابلیت‌ها در پلن‌های مختلف یکسان نیست و باید پیش از انتخاب پلن بررسی شود.</p>



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



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



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



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



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



<ul class="wp-block-list">
<li><strong>کنترل محل میزبانی داده‌ها: </strong>امکان استقرار روی زیرساخت سازمان، مراکز داده ملی و محیط‌های Sovereign Cloud به سازمان‌ها اجازه می‌دهد محل میزبانی داده را متناسب با الزامات خود انتخاب کنند.</li>



<li><strong>انعطاف در استقرار:</strong> Rocket Chat گزینه‌هایی مانند On-premises، ابر خصوصی، میزبانی اختصاصی و در پلن‌های مشخص، استقرار Air-gapped را ارائه می‌دهد.</li>



<li><strong>توسعه‌پذیری: </strong>سازمان‌ها می‌توانند از اپلیکیشن‌های آماده، API و SDK یا Apps Engine برای اتصال Rocket Chat به ابزارها و فرایندهای داخلی استفاده کنند.</li>



<li><strong>قابلیت‌های امنیتی و مدیریتی: </strong>امکاناتی مانند کنترل دسترسی، SSO ،MFA ،LDAP، سیاست نگهداری داده و گزارش‌های حسابرسی در پلن‌های مختلف ارائه می‌شوند.</li>



<li><strong>پشتیبانی از معماری‌های سازمانی:</strong> High Availability ،Failover خودکار، Launchpad Deployment و در Workspaceهای ابری، Disaster Recovery در میان قابلیت‌های سازمانی راکت چت قرار دارند.</li>



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



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



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



<ul class="wp-block-list">
<li>پیچیدگی راه‌اندازی و نگهداری: برخی کاربران معتقدند نصب، پیکربندی و سفارشی‌سازی راکت چت (مخصوصا در حالت Self-hosted)، نسبت به ابزارهای ساده‌تر به دانش فنی بیشتری نیاز دارد و نگهداری آن برای تیم‌های بدون نیروی متخصص IT یا DevOps، ممکن است زمان‌بر باشد.</li>



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



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



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



<li>تغییرات مدل قیمت‌گذاری: برخی کاربران گفته‌اند بخشی از قابلیت‌های پیشرفته تنها در پلن‌های غیر رایگان در دسترس است و در دوره‌هایی، تغییرات قیمت یا سیاست‌های لایسنس برایشان رضایت‌بخش نبوده است.</li>



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



<li>قابلیت تماس صوتی در صفحه پلن‌ها به‌عنوان Add-on معرفی شده است. ویدئوکنفرانس نیز از طریق یکپارچه‌سازی با سرویس‌هایی مانند Jitsi،Google Meet ،Zoom و Pexip ارائه می‌شود.</li>
</ul>



<h2 id="h-مقایسه-rocket-chat-با-slack-و-mattermost" class="wp-block-heading">مقایسه Rocket Chat با Slack و Mattermost</h2>



<p class="wp-block-paragraph">RocketChat ،Slack و Mattermost تمرکز و مدل استقرار یکسانی ندارند. Slack خود را یک پلتفرم متمرکز برای گردآوری افراد، فرایندها، داده‌ها، ابزارها و قابلیت‌های هوش مصنوعی در یک رابط گفت‌وگومحور معرفی می‌کند Mattermost نیز یک پلتفرم Open Core با تمرکز بر عملیات‌های حیاتی، DevSecOps، پاسخ به رخداد و استقرار روی زیرساخت اختصاصی یا ابر خصوصی است Rocket Chat بر ارتباطات سازمانی، حاکمیت داده و امکان استقرار در زیرساخت اختصاصی، محیط‌های ابری و شبکه‌های ایزوله تمرکز دارد.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="449" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-rocketchat2-1024x449.webp" alt="مقایسه Rocket Chat با Slack و Mattermost" class="wp-image-5523" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-rocketchat2-1024x449.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-rocketchat2-300x132.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-rocketchat2-768x337.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-rocketchat2-120x53.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-rocketchat2.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>معیار</strong></th><th><strong>Rocket Chat</strong></th><th><strong>Slack</strong></th><th><strong>Mattermost</strong></th></tr></thead><tbody><tr><td>تعریف محصول</td><td>پلتفرم ارتباطات سازمانی با تمرکز بر حاکمیت داده، امنیت و انعطاف‌پذیری در استقرار</td><td>پلتفرمی برای گردآوری افراد، فرایندها، داده‌ها، عامل‌های هوش مصنوعی و ابزارها در یک رابط گفت‌وگومحور</td><td>پلتفرم Open Core برای همکاری سازمانی و گردش‌کارهای عملیاتی حساس</td></tr><tr><td>شیوه استقرار</td><td>قابل‌استقرار روی زیرساخت اختصاصی، ابر خصوصی، میزبانی اختصاصی، Sovereign Cloud و در پلن‌های مشخص، شبکه‌های Air-gapped</td><td>ارائه به‌عنوان یک سرویس ابری</td><td>قابل‌استقرار روی زیرساخت داخلی، ابر خصوصی و گزینه‌های ابری</td></tr><tr><td>قابلیت‌های ارتباطی</td><td>پیام‌رسانی، تماس صوتی، اشتراک‌گذاری صفحه‌نمایش و اتصال به سرویس‌های ویدئوکنفرانس</td><td>کانال‌های کاری، اطلاعات مشترک و قابل جست‌وجو و ابزارهای بهره‌وری</td><td>پیام‌رسانی فردی و گروهی، تماس صوتی و اشتراک‌گذاری صفحه‌نمایش</td></tr><tr><td>توسعه‌پذیری</td><td>Marketplace ،API ،SDK و Apps Engine برای ساخت اپلیکیشن‌ها، بات‌ها و گردش‌کارهای اختصاصی</td><td>بیش از ۲۶۰۰ اپلیکیشن سازمانی و API برای اتصال ابزارهای داخلی</td><td>افزونه‌ها، Webhook ،Slash Command ،RESTful API و یکپارچه‌سازی‌های آماده</td></tr><tr><td>تمرکز اصلی</td><td>حاکمیت داده، ارتباطات سازمانی و استقرار در محیط‌های حساس</td><td>متمرکزکردن پروژه‌ها، اطلاعات، داده‌ها و ابزارهای کاری</td><td>عملیات‌های حیاتی، DevSecOps، پاسخ‌گویی به رخداد و گردش‌کارهای سازمانی</td></tr></tbody></table></figure>



<h2 id="h-پلن-های-rocket-chat-چه-تفاوتی-دارند" class="wp-block-heading">پلن‌های Rocket Chat چه تفاوتی دارند؟</h2>



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



<h3 id="h-پلن-های-citizen-engagement" class="wp-block-heading">پلن‌های Citizen Engagement</h3>



<p class="wp-block-paragraph">پلن‌های Citizen Engagement برای سازمان‌ها و نهادهایی ارائه شده‌اند که می‌خواهند پیام‌های شهروندان یا دیگر مخاطبان بیرونی را از کانال‌هایی مانند Live Chat، ایمیل، SMS و WhatsApp دریافت و در یک محیط واحد مدیریت کنند. البته در Citizen Engagement، قابلیت همکاری تیمی نیز وجود دارد؛ بنابراین کاربران Workspace می‌توانند در کنار رسیدگی به پیام‌های بیرونی، با همکاران خود همکاری کنند یا درخواست‌ها را در همان پلتفرم به بخش‌های دیگر ارجاع دهند.</p>



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



<ul class="wp-block-list">
<li>Starter</li>



<li>Enterprise</li>
</ul>



<p class="wp-block-paragraph">پلن Starter به‌صورت رایگان و Self-managed ارائه می‌شود و حداکثر ۱۰۰ مخاطب فعال ماهانه را پوشش می‌دهد. منظور از مخاطب فعال ماهانه یا MAC، مخاطب ثبت‌نام‌نشده‌ای است که از یک کانال بیرونی مانند Live Chat ،WhatsApp، ایمیل یا SMS پیام می‌فرستد و یکی از کاربران Workspace به پیام او پاسخ می‌دهد یا آن را ارجاع می‌دهد. این پلن قابلیت‌هایی مانند اتصال کانال‌های ارتباطی، تعریف دپارتمان و واحد سازمانی، مسیریابی هوشمند مکالمات، انتقال درخواست‌ها، تعیین ساعات کاری، پاسخ‌های آماده و گزارش‌های تحلیلی را ارائه می‌دهد.</p>



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



<h3 id="h-پلن-های-secure-commsos-enterprise" class="wp-block-heading">پلن‌های Secure CommsOS Enterprise</h3>



<p class="wp-block-paragraph">Rocket Chat پلن‌های Secure CommsOS Enterprise را برای سازمان‌هایی معرفی می‌کند که حاکمیت داده، انطباق و تداوم عملیات برایشان اهمیت دارد. این دسته شامل سه پلن است:</p>



<ul class="wp-block-list">
<li>Commercial</li>



<li>Government</li>



<li>Defense</li>
</ul>



<p class="wp-block-paragraph">پلن Commercial برای سازمان‌های تجاری ارائه شده است. از امکانات شاخص آن می‌توان به استقرار روی زیرساخت داخلی، ابر خصوصی یا شبکه‌های VPC و VPN ایزوله، میزبانی ابری اختصاصی، High Availability ،Disaster Recovery، پیام‌رسانی، تماس، اشتراک‌گذاری صفحه‌نمایش، همکاری با مجموعه‌های بیرونی، اپلیکیشن موبایل و APIهای باز اشاره کرد.</p>



<p class="wp-block-paragraph">پلن Government برای سازمان‌ها و نهادهای بخش عمومی طراحی شده و بر حاکمیت داده، کنترل حوزه قضایی، حسابرسی و مدیریت دسترسی تمرکز دارد. از قابلیت‌های معرفی‌شده برای آن می‌توان به استقرار On-premises یا Sovereign Cloud، کنترل دسترسی مبتنی بر نقش، رمزنگاری سرتاسری، اتصال به SSO ،LDAP ،SAML 2.0 و Active Directory، لاگ‌های حسابرسی، سیاست‌های نگهداری داده، Matrix Federation و قابلیت‌های Sovereign AI اشاره کرد.</p>



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



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



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



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-right" data-align="right"><strong>قابلیت</strong></th><th class="has-text-align-center" data-align="center"><strong>نسخه Starter</strong></th><th class="has-text-align-center" data-align="center"><strong>نسخه Enterprise</strong></th><th class="has-text-align-center" data-align="center"><strong>نسخه پریمیوم هم‌روش</strong></th><th class="has-text-align-center" data-align="center"><strong>توضیحات قابلیت</strong></th></tr></thead><tbody><tr><td class="has-text-align-right" data-align="right">تعداد کاربران دارای حساب کاربری</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">مخاطبان فعال ماهانه</td><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><td class="has-text-align-center" data-align="center">تعداد مخاطبان منحصربه‌فردی که در هر ماه از طریق واتس‌اپ، پیامک، ایمیل یا چت آنلاین با سازمان تعامل می‌کنند.</td></tr><tr><td class="has-text-align-right" data-align="right">یکپارچه‌سازی کانال‌های ارتباطی</td><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><td class="has-text-align-center" data-align="center">اتصال Rocket.Chat به واتس‌اپ، ایمیل، پیامک و Live Chat و مدیریت پیام‌ها در یک رابط یکپارچه</td></tr><tr><td class="has-text-align-right" data-align="right">بارگذاری لیست مخاطبان</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">اشتراک‌گذاری فایل، لینک و موقعیت مکانی</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">منشن، واکنش، سنجاق‌کردن و ذخیره پیام‌ها</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">فرمت‌بندی محتوای پیام‌ها</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">پیام‌های صوتی و ویدئویی</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">تاریخچه نامحدود گفتگوها</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">پاسخ‌های آماده</td><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><td class="has-text-align-center" data-align="center">استفاده از پاسخ‌های از پیش نوشته‌شده برای پرسش‌های تکراری</td></tr><tr><td class="has-text-align-right" data-align="right">اپلیکیشن‌های دسکتاپ و موبایل</td><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><td class="has-text-align-center" data-align="center">اپلیکیشن‌های ویندوز، لینوکس، macOS و iOS</td></tr><tr><td class="has-text-align-right" data-align="right">سفارشی‌سازی ظاهری</td><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><td class="has-text-align-center" data-align="center">شخصی‌سازی تم، چیدمان، محتوا، CSS سفارشی و JavaScript</td></tr><tr><td class="has-text-align-right" data-align="right">پشتیبانی رابط کاربری از ۶۴ زبان</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">کنترل دسترسی دقیق مبتنی بر نقش</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">تحلیل‌ها و گزارش‌ها</td><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><td class="has-text-align-center" data-align="center">بررسی شاخص‌های خدمات‌رسانی، داده‌های مکالمات و عملکرد کارشناسان در بازه‌های زمانی مختلف</td></tr><tr><td class="has-text-align-right" data-align="right">تاریخچه فایل‌ها</td><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><td class="has-text-align-center" data-align="center">دسترسی به سوابق فایل‌های به‌اشتراک‌گذاشته‌شده</td></tr><tr><td class="has-text-align-right" data-align="right">قابلیت ارسال اعلان در سیستم‌عامل</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">تاریخچه یکپارچه مخاطب در کانال‌های مختلف</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">امکان حذف واترمارک نشان تجاری Rocket.Chat</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">نقش‌ها و مجوزهای سفارشی</td><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><td class="has-text-align-center" data-align="center">ایجاد نقش‌های جدید و اختصاص مجوزهای مشخص برای کنترل اقدامات و دسترسی کاربران</td></tr><tr><td class="has-text-align-right" data-align="right">مدیریت دستگاه‌ها</td><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><td class="has-text-align-center" data-align="center">نظارت و کنترل دسترسی دستگاه‌ها به پلتفرم و امکان قطع اتصال دستگاه‌ها</td></tr><tr><td class="has-text-align-right" data-align="right">ممیزی پیام‌ها</td><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><td class="has-text-align-center" data-align="center">جست‌وجو و بازبینی مکالمات براساس کانال، کاربر یا پیام مستقیم توسط کاربران دارای نقش ممیز</td></tr><tr><td class="has-text-align-right" data-align="right">پشتیبانی از دامنه اختصاصی</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">هوش مصنوعی با اولویت حفظ حریم خصوصی</td><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><td class="has-text-align-center" data-align="center">استفاده از مدل زبانی بزرگ self host و غنی‌سازی آن با دانش داخلی سازمان از طریق پایپ‌لاین RAG</td></tr><tr><td class="has-text-align-right" data-align="right">امکان آپدیت</td><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><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">امکان بازگشت به نسخه قبل از آپدیت</td><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><td class="has-text-align-center" data-align="center">امکان بازگشت به بکاپِ قبل از آپدیت، تا ۳ روز پس از آپدیت (در سرویس هم‌روش)</td></tr><tr><td class="has-text-align-right" data-align="right">پشتیبان‌گیری خودکار</td><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">بکاپ خودکار روزانه به صورت Off-Site (نگهداری بکاپ در دیتاسنتر دیگر)</td><td class="has-text-align-center" data-align="center"></td></tr><tr><td class="has-text-align-right" data-align="right">پشتیبانی از ابزارهای مارکت‌پلیس راکت چت</td><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><td class="has-text-align-center" data-align="center">شامل افزونه‌های فیلتر محتوای نامناسب مانند هرزنامه، جلوگیری از نشت داده‌ها (DLP)، فریم‌ورک توسعه برنامه‌های سفارشی با کدنویسی محدود و ماژول‌های قابل استفاده مجدد و &#8230;</td></tr><tr><td class="has-text-align-right" data-align="right">نحوه پشتیبانی</td><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><td class="has-text-align-center" data-align="center"></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">پلتفرم امن برای ارتباطات سازمانی</p>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex">
<p class="wp-block-paragraph">✅ راه‌اندازی به‌صورت پرداخت به میزان مصرف (PAYG)<br>✅ امنیت و پایداری در سطح سازمانی</p>



<p class="wp-block-paragraph">✅ امکان انتخاب منابع زیرساختی متناسب با نیاز سازمان<br>✅ بکاپ‌گیری خودکار روزانه</p>
</div>
</div>
</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://console.hamravesh.com/marketplace/explore/oneclick_rocketchatp" target="_blank" rel="noreferrer noopener">راه‌اندازی راکت چت پریمیوم هم‌روش</a><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">راکت چت (Rocket Chat) یک پیام‌رسان سازمانی متن‌باز است که با تمرکز بر امنیت، حاکمیت داده و انعطاف‌پذیری در استقرار، نیازهای طیف گسترده‌ای از سازمان‌ها را پوشش می‌دهد. این ویژگی‌ها آن را برای سازمان‌هایی که کنترل کامل بر داده‌ها و زیرساخت ارتباطی برایشان اهمیت دارد، به یک گزینه مناسب و کاربردی تبدیل می‌کند.</p>



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



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



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-rocketchat/">راکت چت چیست؟ بررسی قابلیت‌ها، امنیت و روش‌های استقرار</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-rocketchat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>جیتسی چیست؟ آشنایی با پلتفرم متن‌باز ویدئوکنفرانس</title>
		<link>https://hamravesh.com/blog/what-is-jitsi/</link>
					<comments>https://hamravesh.com/blog/what-is-jitsi/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Tue, 28 Jul 2026 12:30:15 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5498</guid>

					<description><![CDATA[<p>جیتسی یکی از شناخته‌شده‌ترین گزینه‌های متن‌باز در این حوزه است که امکان راه‌اندازی یک سرویس ویدئوکنفرانس اختصاصی را فراهم می‌کند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-jitsi/">جیتسی چیست؟ آشنایی با پلتفرم متن‌باز ویدئوکنفرانس</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">بسیاری از سرویس‌های ویدئوکنفرانس رایج، وابستگی کامل به زیرساخت شرکت ارائه‌دهنده دارند و کاربران امکان استقرار یا پیکربندی عمیق آنها را در اختیار ندارند. به همین دلیل، برخی سازمانها به‌دنبال راهکاری هستند که بتوانند ابزار ارتباط تصویری را روی زیرساخت اختصاصی خود اجرا و مدیریت کنند. جیتسی یکی از شناخته‌شده‌ترین مجموعه پروژه‌های متن‌باز در این حوزه است که امکان ایجاد و استقرار سرویس ویدئوکنفرانس اختصاصی را فراهم می‌کند. در ادامه بررسی می‌کنیم که جیتسی چیست، جیتسی میت (Jitsi Meet) چه تفاوتی با جیتسی (Jitsi) دارد، این پلتفرم چگونه کار می‌کند و چه قابلیت‌ها و ویژگی‌های امنیتی دارد.</p>



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



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



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



<h3 class="wp-block-heading" id="h-تفاوت-jitsi-و-jitsi-meet-چیست">تفاوت Jitsi و Jitsi Meet چیست؟</h3>



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



<p class="wp-block-paragraph">جیتسی میت برای برگزاری جلسه از مؤلفه‌هایی مانند Jitsi Videobridge ،Jicofo (یا به اختصار JVB) و Prosody استفاده می‌کند. مؤلفه‌های Jibri و Jigasi نیز در صورت نیاز به ضبط، پخش زنده یا اتصال تماس‌های SIP به این معماری اضافه می‌شوند.</p>



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



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



<p class="wp-block-paragraph"> مولفه Jicofo نشست‌های رسانه‌ای را مدیریت می‌کند و برای هر کنفرانس یک Jitsi Videobridge در نظر می‌گیرد. Jitsi Videobridge نیز جریان‌های صوتی و تصویری را میان شرکت‌کنندگان جلسه مسیریابی می‌کند. در صورت نیاز، Jibri برای ضبط یا پخش زنده و Jigasi برای اتصال تماس‌های مبتنی بر پروتکل SIP به این معماری اضافه می‌شوند.</p>



<h3 class="wp-block-heading" id="h-نقش-jitsi-videobridge-و-معماری-sfu">نقش Jitsi Videobridge و معماری SFU</h3>



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



<h3 class="wp-block-heading" id="h-اجزای-اصلی-معماری-جیتسی">اجزای اصلی معماری جیتسی</h3>



<p class="wp-block-paragraph">در جدول زیر می‌توانید اجزای اصلی معماری جیتسی را به همراه نقش هریک از آن‌ها مشاهده کنید:&nbsp;</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>مولفه</strong></td><td><strong>نقش</strong></td></tr><tr><td>Jitsi Meet</td><td>رابط وب و موبایل برای برگزاری و مدیریت جلسه</td></tr><tr><td>Jitsi Videobridge</td><td>هدایت جریان‌های صوتی و تصویری میان شرکت‌کنندگان</td></tr><tr><td>Jicofo</td><td>مدیریت نشست و انتخاب Videobridge مناسب</td></tr><tr><td>Prosody</td><td>انجام سیگنالینگ مبتنی بر سرور XMPP برای برقراری جلسه و برقراری ارتباط میان اجزای جیتسی</td></tr><tr><td>Jibri</td><td>ضبط جلسه و پخش زنده (در صورت فعال بودن)</td></tr><tr><td>Jigasi</td><td>اتصال تماس‌های SIP به جلسه</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-مهم-ترین-قابلیت-های-jitsi-meet">مهم‌ترین قابلیت‌های Jitsi Meet</h2>



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



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



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



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



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



<h3 class="wp-block-heading" id="h-ضبط-پخش-زنده-و-اتصال-تلفنی">ضبط، پخش زنده و اتصال تلفنی</h3>



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



<h3 class="wp-block-heading" id="h-یکپارچه-سازی-جیتسی-با-سایت-و-اپلیکیشن">یکپارچه‌سازی جیتسی با سایت و اپلیکیشن</h3>



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



<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="753" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-jitsi-02-1024x753.png" alt="نمایی از سرویس جیتسی میت در مرورگر" class="wp-image-5531" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-jitsi-02-1024x753.png 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-jitsi-02-300x221.png 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-jitsi-02-768x565.png 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-jitsi-02-1536x1130.png 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-jitsi-02-120x88.png 120w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-jitsi-02.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading" id="h-استفاده-از-سرویس-عمومی-meet-jit-si">استفاده از سرویس عمومی meet.jit.si</h3>



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



<h3 class="wp-block-heading" id="h-استقرار-جیتسی-روی-زیرساخت-اختصاصی">استقرار جیتسی روی زیرساخت اختصاصی</h3>



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



<h3 class="wp-block-heading" id="h-استفاده-از-سرویس-یا-اپلیکیشن-مدیریت-شده">استفاده از سرویس یا اپلیکیشن مدیریت‌شده</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><td><strong>مسئولیت نگهداری</strong></td></tr><tr><td>سرویس عمومی</td><td>زیاد</td><td>کم</td><td>ارائه‌دهنده</td></tr><tr><td>استقرار شخصی (Self-hosted)</td><td>کم</td><td>زیاد</td><td>سازمان</td></tr><tr><td>اپلیکیشن آماده و مدیریت‌شده</td><td>زیاد</td><td>وابسته به سرویس</td><td>ارائه‌دهنده و پلتفرم</td></tr></tbody></table></figure>



<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">راه‌اندازی سریع ابزار متن‌باز کنفرانس ویدیویی </p>



<p class="wp-block-paragraph"><br>✅ ارائه سرویس روی زیر ساخت ابری مبتنی بر کوبرنتیز<br>✅ کاهش نیاز به مدیریت مستقیم زیرساخت<br>✅ امکان انتخاب منابع دلخواه</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://console.hamravesh.com/marketplace/explore/oneclick_jitsi" target="_blank" rel="noreferrer noopener">راه‌اندزای سرور جیتسی</a><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 class="wp-block-heading" id="h-امنیت-و-حریم-خصوصی-در-جیتسی-چگونه-است">امنیت و حریم خصوصی در جیتسی چگونه است؟</h2>



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



<h3 class="wp-block-heading" id="h-رمزنگاری-تماس-ها">رمزنگاری تماس‌ها</h3>



<p class="wp-block-paragraph">در جیتسی، صدا و تصویر هنگام انتقال در شبکه با پروتکل DTLS-SRTP رمزنگاری می‌شوند تا از شنود اطلاعات در مسیر ارتباط جلوگیری شود. البته ترافیک جلسه از طریق سرور هدایت می‌شود، به همین دلیل نباید تصور کرد که همه جلسه‌ها به‌صورت پیش‌فرض از رمزنگاری سرتاسری (End-to-End Encryption یا E2EE) استفاده می‌کنند.</p>



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



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



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



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



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



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



<h2 class="wp-block-heading" id="h-آیا-جیتسی-مقیاس-پذیر-است">آیا جیتسی مقیاس‌پذیر است؟</h2>



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



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



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



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



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



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



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



<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> جیتسی به‌صورت متن‌باز منتشر شده و امکان استفاده، بررسی و توسعه آن برای کاربران و سازمان‌ها وجود دارد.</li>



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



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



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



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



<li><strong>قابلیت یکپارچه‌سازی با محصولات دیگر:</strong> امکان قرار دادن جلسات در وب‌سایت یا اپلیکیشن و استفاده از API و SDK را فراهم می‌کند.</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><strong>پیچیدگی در راه‌اندازی نسخه آماده تولید (محیط عملیاتی واقعی): </strong>استقرار حرفه‌ای (مخصوصا در مقیاس بالا)، به دانش فنی و طراحی مناسب زیرساخت نیاز دارد.</li>



<li><strong>مقیاس‌پذیری بر اساس زیرساخت: </strong>مقیاس‌پذیری، به طراحی مناسب و مدیریت زیرساخت وابسته است.</li>



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



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



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



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



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



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



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



<li>اگر کنترل داده‌ها و زیرساخت برایتان اهمیت دارد، استقرار اختصاصی انتخاب مناسبی است.</li>



<li>اگر در حوزه آموزش آنلاین فعالیت دارید، این پلتفرم امکاناتی مانند تماس صوتی و تصویری، اشتراک‌گذاری صفحه و گفت‌وگوی متنی را به شما ارائه می‌دهد.</li>



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



<li>جیتسی برای تیم‌های پشتیبانی و مشاوره آنلاین، امکان برقراری ارتباط تصویری و اشتراک‌گذاری صفحه را فراهم می‌کند.</li>



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



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



<h3 class="wp-block-heading" id="h-جیتسی-برای-چه-مجموعه-هایی-انتخاب-مناسبی-نیست">جیتسی برای چه مجموعه‌هایی انتخاب مناسبی نیست؟</h3>



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



<ul class="wp-block-list">
<li>تیم‌هایی که دانش زیرساخت و مدیریت سرور ندارند، اما قصد راه‌اندازی نسخه استقرار شخصی را دارند.&nbsp;</li>



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



<li>کسب‌وکارهایی که انتظار دارند همه قابلیت‌های سازمانی بدون سفارشی‌سازی در دسترس باشد. برخی نیازهای تخصصی تنها با پیکربندی یا توسعه بیشتر قابل پیاده‌سازی هستند.</li>



<li>مجموعه‌هایی که تصور می‌کنند متن‌باز بودن به معنای حذف هزینه‌های عملیاتی است. </li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی-آیا-جیتسی-انتخاب-مناسبی-است">جمع‌بندی؛ آیا جیتسی انتخاب مناسبی است؟</h2>



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



<p class="wp-block-paragraph">البته استقرار Production و مقیاس‌پذیر جیتسی به دانش زیرساخت نیاز دارد و نمی‌توان آن را یک راه‌حل آماده و بدون چالش تصور کرد. برای سازمان‌هایی که نمی‌خواهند با پیچیدگی‌های استقرار دستی درگیر شوند، اپلیکیشن‌های آماده جیتسی روی بستر کوبرنتیز، گزینه‌ای عملی برای شروع سریع ارائه می‌دهد. در نهایت، انتخاب بین استقرار مستقل یا استفاده از سرویس آماده، به منابع فنی، نیازهای امنیتی و الزامات سازمان بستگی دارد.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-jitsi/">جیتسی چیست؟ آشنایی با پلتفرم متن‌باز ویدئوکنفرانس</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-jitsi/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 loading="lazy" 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="auto, (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>آبجکت استورج چیست؟ آشنایی با مفاهیم متادیتا، باکت و S3</title>
		<link>https://hamravesh.com/blog/what-is-object-storage/</link>
					<comments>https://hamravesh.com/blog/what-is-object-storage/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[فضای ابری]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5369</guid>

					<description><![CDATA[<p>آبجکت استوریج (Object Storage) یا ذخیره‌سازی آبجکت، یک معماری ذخیره‌سازی داده است که برای ذخیره‌سازی، بایگانی، پشتیبان‌گیری و مدیریت حجم بالای داده‌های بدون‌ساختار (Unstructured Data) طراحی شده است.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-object-storage/">آبجکت استورج چیست؟ آشنایی با مفاهیم متادیتا، باکت و S3</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">تصاویر، ویدئوها، فایل‌های پشتیبان، لاگ‌ها و داده‌های تولیدشده توسط سرویس‌های ابری، معمولاً ساختار ثابتی ندارند و حجم آن‌ها به‌سرعت رشد می‌کند. مدیریت این نوع داده‌ها با روش‌های سنتی ذخیره‌سازی همیشه ساده یا مقرون‌به‌صرفه نیست. آبجکت استورج (Object Storage) معماری‌ای است که برای ذخیره‌سازی مقیاس‌پذیر داده‌های بدون‌ساختار طراحی شده است. در این مطلب بررسی می‌کنیم که آبجکت استورج چیست، چگونه کار می‌کند، چه تفاوتی با فایل استورج و بلاک استورج دارد و مفاهیمی مانند باکت، متادیتا و S3 چه نقشی در آن دارند.</p>



<h2 class="wp-block-heading" id="h-آبجکت-استورج-چیست">آبجکت استورج چیست؟</h2>



<p class="wp-block-paragraph">آبجکت استورج (Object Storage) یا ذخیره‌سازی آبجکت، یک معماری ذخیره‌سازی داده است که برای ذخیره‌سازی، بایگانی، پشتیبان‌گیری و مدیریت حجم بالای داده‌های بدون‌ساختار (Unstructured Data) طراحی شده است.</p>



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



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



<ul class="wp-block-list">
<li><strong>داده (Data): </strong>محتوای اصلی فایل، مانند تصویر، ویدئو، سند یا هر نوع داده دیگر.</li>



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



<li><strong>کلید آبجکت (Object Key):</strong> نام یا شناسه‌ای است که برای دسترسی به آبجکت استفاده می‌شود. در سرویس‌هایی مانند S3، هر آبجکت معمولاً با ترکیب نام باکت و Object Key شناسایی می‌شود.</li>
</ul>



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



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



<p class="wp-block-paragraph">برای درک بهتر این تفاوت، تصور کنید که در یک سیستم فایل سنتی، برای پیدا کردن یک تصویر باید مسیر مشخصی مانند Photos &gt; Travel &gt; Summer &gt; photo.jpg را دنبال کنید. اما در آبجکت استورج، برنامه با استفاده از نام باکت و Object Key به آبجکت دسترسی پیدا می‌کند. ممکن است کلید آبجکت ظاهری شبیه مسیر پوشه‌ای داشته باشد، اما این ساختار یک دایرکتوری واقعی نیست و معمولاً یک قرارداد نام‌گذاری است.</p>



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



<ul class="wp-block-list">
<li>PUT برای بارگذاری و ذخیره یک آبجکت</li>



<li>GET برای بازیابی آبجکت</li>



<li>DELETE برای حذف آبجکت</li>
</ul>



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



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



<p class="wp-block-paragraph">باکت برخلاف پوشه‌های فایل استورج، ساختار سلسله‌مراتبی واقعی ندارد. در سرویس‌هایی مانند Amazon S3، آبجکت‌ها درون باکت در ساختاری مسطح نگهداری می‌شوند، اما می‌توان با استفاده از پیشوندها (Prefix) در نام آبجکت‌ها، ظاهری شبیه پوشه ایجاد کرد؛ برای مثال logs/2026/app.log. این ساختار در عمل یک روش نام‌گذاری و سازمان‌دهی منطقی است، نه یک دایرکتوری واقعی</p>



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



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



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



<p class="wp-block-paragraph">برخلاف بسیاری از روش‌های ذخیره‌سازی، متادیتا در آبجکت استورج تنها به اطلاعات پایه محدود نیست و قابلیت سفارشی‌سازی بالایی دارد. کاربران و برنامه‌ها می‌توانند متناسب با نیاز خود اطلاعات بیشتری به هر آبجکت اضافه کنند.</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="616" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage03-1024x616.webp" alt="تفاوت آبجکت استورج و بلاک استورج و فایل استورج" class="wp-image-5410" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage03-1024x616.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage03-300x181.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage03-768x462.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage03-120x72.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">برای انتخاب معماری مناسب ذخیره‌سازی، باید تفاوت آبجکت استورج و فایل استورج را بدانید. همچنین آشنایی با تفاوت آبجکت استورج و بلاک استورج کمک می‌کند که بتوانید متناسب با نوع داده و بار کاری، گزینه مناسب را انتخاب کنید.</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>فایل استورج  (File Storage)</strong></td><td><strong>بلاک استورج (Block Storage)</strong></td><td><strong>آبجکت استورج (Object Storage)</strong></td></tr><tr><td><strong>ساختار ذخیره‌سازی</strong></td><td>سلسله‌مراتبی (پوشه و فایل)</td><td>بلوک‌های مستقل</td><td>ساختار مسطح (Flat)</td></tr><tr><td><strong>واحد ذخیره‌سازی</strong></td><td>فایل</td><td>بلوک</td><td>آبجکت</td></tr><tr><td><strong>متادیتا</strong></td><td>محدود</td><td>بسیار محدود</td><td>غنی و قابل سفارشی‌سازی</td></tr><tr><td><strong>روش دسترسی</strong></td><td>مسیر فایل (Path)</td><td>از طریق volume/disk در سطح سیستم‌عامل یا زیرساخت</td><td>APIهای HTTP و شناسه آبجکت</td></tr><tr><td><strong>مقیاس‌پذیری</strong></td><td>مناسب، اما در مقیاس‌های بسیار بزرگ با پیچیدگی بیشتر همراه است</td><td>وابسته به زیرساخت و معمولاً مناسب workloadهای عملکردمحور</td><td>بسیار مناسب برای مقیاس افقی و حجم‌های بزرگ داده</td></tr><tr><td><strong>مناسب برای</strong></td><td>اشتراک فایل و استفاده روزمره</td><td>پایگاه‌های داده و ماشین‌های مجازی</td><td>داده‌های بدون‌ساختار، آرشیو و فضای ابری</td></tr><tr><td><strong>محدودیت اصلی</strong></td><td>مدیریت پیچیده‌تر در مقیاس بسیار بزرگ</td><td>مقیاس‌پذیری و مدیریت متادیتای محدودتر نسبت به آبجکت استورج</td><td>مناسب نبودن برای ویرایش‌های کوچک و مکرر</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-مزایای-آبجکت-استورج">مزایای آبجکت استورج</h2>



<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> آبجکت استورج از ابتدا برای محیط‌های ابری طراحی شده است و به همین دلیل یکی از رایج‌ترین گزینه‌ها برای پیاده‌سازی فضای ذخیره‌سازی ابری، سرویس‌های Cloud Native و ذخیره‌سازی مقیاس‌پذیر به‌حساب می‌آید.</li>
</ul>



<h2 class="wp-block-heading" id="h-چالش-های-آبجکت-استورج">چالش‌های آبجکت استورج</h2>



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



<ul class="wp-block-list">
<li><strong>مناسب نبودن برای ویرایش‌های کوچک و مکرر:</strong> آبجکت استورج برای ذخیره و بازیابی آبجکت‌های کامل طراحی شده است. پس از ذخیره شدن یک آبجکت، معمولاً امکان ویرایش مستقیم بخشی از آن وجود ندارد و برای اعمال تغییر باید نسخه جدیدی از کل آبجکت نوشته شود. به همین دلیل، این روش برای داده‌هایی که دائماً در بخش‌های کوچک تغییر می‌کنند، گزینه ایده‌آلی نیست. در چنین سناریوهایی، بسته به نوع بار کاری، معماری‌هایی مانند بلاک استورج می‌توانند انتخاب مناسب‌تری باشند.</li>



<li><strong>هزینه خروج داده (Data Egress):</strong> برخی ارائه‌دهندگان سرویس‌های آبجکت استورج برای انتقال داده از فضای ذخیره‌سازی به خارج از سرویس هزینه دریافت می‌کنند. اگر داده‌ها به‌طور مداوم بازیابی شوند، این هزینه می‌تواند زیاد باشد.</li>



<li><strong>عملکرد پایین‌تر نسبت به Block Storage در برخی سناریوها:</strong> آبجکت استورج برای ذخیره‌سازی حجم بالای داده بهینه شده است، اما در بارهای کاری با تاخیر بسیار کم یا عملیات خواندن و نوشتن مکرر، معمولا بلاک استورج عملکرد بهتری ارائه می‌دهد.</li>
</ul>



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



<p class="wp-block-paragraph">سرویس S3 یا Amazon S3 (مخفف Simple Storage Service) سرویس آبجکت استورج آمازون است که از سال ۲۰۰۶ ارائه شد و در حال حاضر به یکی از شناخته‌شده‌ترین نمونه‌های پیاده‌سازی Object Storage تبدیل شده است.&nbsp;</p>



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



<p class="wp-block-paragraph">برای مثال، عملیاتی مانند ساخت باکت، بارگذاری آبجکت، دریافت آبجکت و حذف آبجکت در بسیاری از سرویس‌های S3-compatible با همان منطق کلی S3 انجام می‌شود. این سرویس‌ها معمولاً با ابزارهایی مانند AWS CLI، ابزارهای خط فرمان مانند s3cmd و rclone و کلاینت‌هایی مانند MinIO Client قابل استفاده‌اند.</p>



<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">رمزنگاری نیز نقش مهمی در حفاظت از داده‌ها دارد. بسیاری از سرویس‌های آبجکت استورج از رمزنگاری داده‌ها در زمان انتقال (Encryption in Transit) و رمزنگاری داده‌ها در حالت ذخیره‌شده (Encryption at Rest)، پشتیبانی می‌کنند. Encryption in Transit معمولاً با استفاده از پروتکل‌هایی مانند HTTPS/TLS انجام می‌شود تا داده هنگام انتقال بین کاربر، برنامه و سرویس ذخیره‌سازی محافظت شود. Encryption at Rest نیز برای محافظت از داده‌هایی است که روی زیرساخت ذخیره‌سازی نگهداری می‌شوند.</p>



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



<p class="wp-block-paragraph">در برخی سرویس‌ها، قابلیت‌هایی مانند Object Lock برای پیاده‌سازی مدل WORM (مخفف Write Once, Read Many) وجود دارد. در این مدل، آبجکت پس از ذخیره شدن تا مدت مشخصی قابل حذف یا تغییر نیست. این قابلیت برای نگهداری داده‌های حساس، آرشیوهای قانونی، لاگ‌های مهم، فایل‌های پشتیبان و داده‌هایی که باید در برابر تغییر یا حذف محافظت شوند کاربرد دارد.</p>



<p class="wp-block-paragraph">البته سطح پشتیبانی از این قابلیت‌ها در همه سرویس‌های آبجکت استورج یکسان نیست. بنابراین هنگام انتخاب سرویس، باید بررسی شود که امکاناتی مانند کنترل دسترسی، Encryption at Rest ،Encryption in Transit ،Versioning ،Object Lock و WORM تا چه سطحی پشتیبانی می‌شوند.</p>



<h2 class="wp-block-heading" id="h-مدیریت-چرخه-عمر-داده-ها-در-آبجکت-استورج">مدیریت چرخه عمر داده‌ها در آبجکت استورج</h2>



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



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



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



<h2 class="wp-block-heading" id="h-کاربردهای-آبجکت-استورج">کاربردهای آبجکت استورج</h2>



<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/07/hamravesh-what-is-object-storage01-1024x668.webp" alt="انواع کاربردهای آبجکت استورج" class="wp-image-5411" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage01-1024x668.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage01-300x196.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage01-768x501.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage01-120x78.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/07/hamravesh-what-is-object-storage01.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



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



<ul class="wp-block-list">
<li><strong>پشتیبان‌گیری و بازیابی از فاجعه (Backup &amp; Disaster Recovery): </strong>نگهداری نسخه‌های پشتیبان و بازیابی اطلاعات در صورت خرابی سیستم یا از دست رفتن داده‌ها در فرایند <a href="https://hamravesh.com/blog/what-is-disaster-recovery/" type="link" id="https://hamravesh.com/blog/what-is-disaster-recovery/" target="_blank" rel="noreferrer noopener">بازیابی از فاجعه</a></li>



<li><strong>آرشیو داده (Data Archiving): </strong>ذخیره‌سازی بلندمدت داده‌هایی که به‌ندرت استفاده می‌شوند، اما نباید حذف شوند</li>



<li><strong>دریاچه داده (Data Lake):</strong> ایجاد مخزنی متمرکز برای نگهداری حجم بسیار زیادی از داده‌های ساخت‌یافته و بدون‌ساختار جهت تحلیل و پردازش</li>



<li><strong>برنامه‌های ابری (Cloud-Native Applications):</strong> ذخیره فایل‌ها و داده‌های موردنیاز برنامه‌های مبتنی بر فضای ابری، کانتینرها و معماری‌های Serverless</li>



<li><strong>هوش مصنوعی و یادگیری ماشین (AI / ML): </strong>نگهداری مجموعه‌داده‌های بزرگ برای آموزش مدل‌ها و ذخیره نتایج پردازش</li>



<li><strong>فایل‌های رسانه‌ای (Media):</strong> ذخیره تصاویر، ویدئوها، فایل‌های صوتی و سایر محتوای حجیم چندرسانه‌ای</li>



<li><strong>اینترنت اشیا (IoT):</strong> جمع‌آوری و ذخیره حجم بالای داده‌های تولیدشده توسط حسگرها و دستگاه‌های متصل برای تحلیل‌های بعدی</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 class="wp-block-heading" id="h-آبجکت-استورج-هم-روش">💡 آبجکت استورج هم‌روش</h3>



<p class="wp-block-paragraph">فضای ذخیره‌سازی ابری پایدار و مطمئن</p>



<p class="wp-block-paragraph"><br>✅ سازگاری کامل با ابزارهای مبتنی بر S3<br>✅ امنیت و پایداری در سطح سازمانی<br>✅ کنترل سطح دسترسی کاربردی و پیشرفته</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/object-storage" id="https://hamravesh.com/managed-kubernetes" target="_blank" rel="noreferrer noopener">خرید آبجکت استورج</a><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 class="wp-block-heading">جمع‌بندی</h2>



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



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



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-object-storage/">آبجکت استورج چیست؟ آشنایی با مفاهیم متادیتا، باکت و S3</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-object-storage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>گزارش تغییرات سرویس‌های هم‌روش؛ بهار ۱۴۰۵</title>
		<link>https://hamravesh.com/blog/changelog-spring-1405/</link>
					<comments>https://hamravesh.com/blog/changelog-spring-1405/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 08:02:00 +0000</pubDate>
				<category><![CDATA[اخبار هم‌روش]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5388</guid>

					<description><![CDATA[<p>در بهار ۱۴۰۵، بخشی از تمرکز تیم هم‌روش روی بهبود تجربه کاربری کنسول، افزایش مشاهده‌پذیری سرویس‌ها، ارتقای امنیت و ساده‌تر کردن مدیریت اپلیکیشن‌ها بود. در این گزارش، مهم‌ترین تغییرات سرویس‌ها در فصلی که گذشت را مرور کرده‌ایم. کنسول هم‌روش در این فصل کنسول هم‌روش با تغییرات و بهبودهایی از جمله موارد زیر همراه بود. صفحه [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/changelog-spring-1405/">گزارش تغییرات سرویس‌های هم‌روش؛ بهار ۱۴۰۵</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">در بهار ۱۴۰۵، بخشی از تمرکز تیم هم‌روش روی بهبود تجربه کاربری کنسول، افزایش مشاهده‌پذیری سرویس‌ها، ارتقای امنیت و ساده‌تر کردن مدیریت اپلیکیشن‌ها بود. در این گزارش، مهم‌ترین <a href="https://docs.hamravesh.com/changelog" type="link" id="https://docs.hamravesh.com/changelog" target="_blank" rel="noreferrer noopener">تغییرات سرویس‌ها</a> در فصلی که گذشت را مرور کرده‌ایم.</p>



<h2 class="wp-block-heading" id="h-کنسول-هم-روش">کنسول هم‌روش</h2>



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



<h3 class="wp-block-heading" id="h-صفحه-جدید-ترمینال-اپلیکیشن-ها">صفحه جدید ترمینال اپلیکیشن‌ها</h3>



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="664" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/terminal-in-external-window-1024x664.jpg" alt="امکان باز کردن ترمینال اپلیکیشن‌های دارکوب در پنجره مستقل" class="wp-image-5389" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/terminal-in-external-window-1024x664.jpg 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/terminal-in-external-window-300x194.jpg 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/terminal-in-external-window-768x498.jpg 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/terminal-in-external-window-1536x996.jpg 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/07/terminal-in-external-window-2048x1327.jpg 2048w, https://hamravesh.com/blog/wp-content/uploads/2026/07/terminal-in-external-window-120x78.jpg 120w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



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



<h3 class="wp-block-heading" id="h-قابلیت-انتقال-مالکیت-سازمان-به-دیگر-اعضا">قابلیت انتقال مالکیت سازمان به دیگر اعضا</h3>



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="523" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/org-transfer-ownership-1024x523.png" alt="قابلیت انتقال مالکیت سازمان به دیگر اعضا در کنسول هم‌روش" class="wp-image-5392" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/org-transfer-ownership-1024x523.png 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/org-transfer-ownership-300x153.png 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/org-transfer-ownership-768x392.png 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/org-transfer-ownership-1536x784.png 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/07/org-transfer-ownership-2048x1045.png 2048w, https://hamravesh.com/blog/wp-content/uploads/2026/07/org-transfer-ownership-120x61.png 120w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



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



<h3 class="wp-block-heading" id="h-بهبود-زیرساخت-صفحه-وضعیت-سرویس-ها">بهبود زیرساخت صفحه وضعیت سرویس‌ها</h3>



<p class="wp-block-paragraph">صفحه وضعیت سرویس‌های هم‌روش به زیرساخت جدیدی منتقل شد. این تغییر با هدف افزایش دسترس‌پذیری و کاهش وابستگی صفحه وضعیت به سایر اجزای زیرساخت انجام شد تا هنگام رخدادها، کاربران همچنان بتوانند وضعیت سرویس‌ها و اطلاعیه‌های مرتبط را پیگیری کنند. در نتیجه این انتقال، آدرس صفحه وضعیت از status.hamravesh.com به <a href="https://hamraveshstatus.com" type="link" id="https://hamraveshstatus.com" target="_blank" rel="noreferrer noopener">hamraveshstatus.com</a> تغییر کرد.</p>



<p class="wp-block-paragraph">از این پس برای مشاهده وضعیت سرویس‌های هم‌روش، اطلاع از اختلال‌ها، عملیات نگهداری و رخدادهای زیرساختی، باید از <a href="https://hamraveshstatus.com" type="link" id="https://hamraveshstatus.com" target="_blank" rel="noreferrer noopener">آدرس جدید</a> استفاده کنید.</p>



<h2 class="wp-block-heading" id="h-انتشار-نسخه-پایدار-آبجکت-استورج-هم-روش">انتشار نسخه پایدار آبجکت استورج هم‌روش</h2>



<p class="wp-block-paragraph">سرویس <a href="https://hamravesh.com/object-storage" type="link" id="https://hamravesh.com/object-storage" target="_blank" rel="noreferrer noopener">آبجکت استورج هم‌روش</a> پس از طی دوره بتا و اعمال بهبودهای لازم، اکنون به‌صورت پایدارتر و آماده استفاده در محیط‌های عملیاتی در دسترس کاربران قرار گرفته است. این سرویس، یک فضای ذخیره‌سازی ابری سازگار با S3 است که برای نگهداری فایل‌ها، تصاویر، آرشیوها، نسخه‌های پشتیبان، فایل‌های اپلیکیشن و داده‌های حجیم کاربرد دارد. آبجکت استورج هم‌روش از قابلیت‌هایی شامل امکان اتصال به دامنه اختصاصی با گواهی SSL، مدیریت کلیدها با سطوح دسترسی متفاوت برای باکت‌ها و ساخت لینک موقت زمان‌دار بهره می‌برد. </p>



<h2 class="wp-block-heading" id="h-پلتفرم-ابری-دارکوب">پلتفرم ابری دارکوب</h2>



<p class="wp-block-paragraph">در پلتفرم ابری دارکوب در این فصل تغییراتی شامل موارد زیر اعمال شد.</p>



<h3 class="wp-block-heading" id="h-امکان-دریافت-گواهی-ssl-از-طریق-dns-challenge">امکان دریافت گواهی SSL از طریق DNS Challenge</h3>



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



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="168" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/darkube-dns-ssl-cert-1024x168.jpg" alt="اضافه شدن قابلیت دریافت گواهی SSL از طریق DNS Challenge" class="wp-image-5390" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/darkube-dns-ssl-cert-1024x168.jpg 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/07/darkube-dns-ssl-cert-300x49.jpg 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/darkube-dns-ssl-cert-768x126.jpg 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/darkube-dns-ssl-cert-120x20.jpg 120w, https://hamravesh.com/blog/wp-content/uploads/2026/07/darkube-dns-ssl-cert.jpg 1182w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



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



<h3 class="wp-block-heading" id="h-نمایش-تاریخ-انقضای-گواهی-دامنه-شخصی">نمایش تاریخ انقضای گواهی دامنه شخصی</h3>



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



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="905" height="148" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/cert-expiry-datetime.webp" alt="اضافه شدن قابفلیت نمایش تاریخ انقضای گواهی دامنه شخصی" class="wp-image-5391" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/cert-expiry-datetime.webp 905w, https://hamravesh.com/blog/wp-content/uploads/2026/07/cert-expiry-datetime-300x49.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/cert-expiry-datetime-768x126.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/cert-expiry-datetime-120x20.webp 120w" sizes="auto, (max-width: 905px) 100vw, 905px" /></figure>



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



<h2 class="wp-block-heading" id="h-بازارچه-ابری">بازارچه ابری</h2>



<p class="wp-block-paragraph">در فصل بهار، بازارچه ابری با قابلیت جدیدی هم‌راه شد.</p>



<h3 class="wp-block-heading" id="h-اضافه-شدن-تب-مصرف-منابع-به-بازارچه">اضافه شدن تب مصرف منابع به بازارچه</h3>



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



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="775" height="365" src="https://hamravesh.com/blog/wp-content/uploads/2026/07/insight-marketplace.png" alt="اضافه شدن تب مصرف منابع به بازارچه هم‌روش" class="wp-image-5393" style="width:840px;height:auto" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/07/insight-marketplace.png 775w, https://hamravesh.com/blog/wp-content/uploads/2026/07/insight-marketplace-300x141.png 300w, https://hamravesh.com/blog/wp-content/uploads/2026/07/insight-marketplace-768x362.png 768w, https://hamravesh.com/blog/wp-content/uploads/2026/07/insight-marketplace-614x289.png 614w, https://hamravesh.com/blog/wp-content/uploads/2026/07/insight-marketplace-120x57.png 120w" sizes="auto, (max-width: 775px) 100vw, 775px" /></figure>



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



<h2 class="wp-block-heading" id="h-سرویس-سنتری">سرویس سنتری</h2>



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



<h3 class="wp-block-heading" id="h-ارتقای-سنتری-به-نسخه-26-2-1">ارتقای سنتری به نسخه 26.2.1</h3>



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



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



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/changelog-spring-1405/">گزارش تغییرات سرویس‌های هم‌روش؛ بهار ۱۴۰۵</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/changelog-spring-1405/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GitOps چیست؟ آشنایی با معماری، اصول و روش عملکرد</title>
		<link>https://hamravesh.com/blog/what-is-gitops/</link>
					<comments>https://hamravesh.com/blog/what-is-gitops/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 01 Jul 2026 12:30:12 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5331</guid>

					<description><![CDATA[<p>وقتی تعداد سرورها، سرویس‌ها و محیط‌های استقرار افزایش پیدا می‌کند، مدیریت تغییرات زیرساخت به یکی از چالش‌های اصلی تیم‌های فنی تبدیل می‌شود. در چنین شرایطی، اعمال دستی تغییرات می‌تواند باعث ناهماهنگی بین محیط‌های مختلف، خطاهای پیکربندی و دشواری در ردیابی تغییرات شود، به همین دلیل در سال‌های اخیر رویکردی به نام گیت آپس (GitOps) مورد توجه بسیاری از تیم‌های DevOps و مهندسان رایانش ابری قرار گرفته است.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-gitops/">GitOps چیست؟ آشنایی با معماری، اصول و روش عملکرد</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">وقتی تعداد سرورها، سرویس‌ها و محیط‌های استقرار افزایش پیدا می‌کند، مدیریت تغییرات زیرساخت به یکی از چالش‌های اصلی تیم‌های فنی تبدیل می‌شود. اِعمال دستی تغییرات می‌تواند باعث ناهماهنگی میان محیط‌ها، خطاهای پیکربندی و دشواری در ردیابی تغییرات شود. گیت آپس (GitOps) رویکردی است که با استفاده از Git به‌عنوان تک‌منبع حقیقت (Single Source of Truth)، مدیریت زیرساخت و استقرار برنامه‌ها را خودکار، تکرارپذیر و قابل‌ردیابی می‌کند. این رویکرد با تکیه بر Infrastructure as Code و گردش کار مبتنی بر Git، به یکی از روش‌های رایج برای مدیریت زیرساخت در محیط‌های Cloud-Native، به‌ویژه کوبرنتیز، تبدیل شده است. در این مقاله بررسی می‌کنیم که گیت آپس چیست، چگونه کار می‌کند، چه مزایا و چالش‌هایی دارد، در کوبرنتیز چگونه پیاده‌سازی می‌شود و تفاوت GitOps با DevOps و CI/CD چیست.</p>



<h2 class="wp-block-heading" id="h-گیت-آپس-چیست">گیت آپس چیست؟</h2>



<p class="wp-block-paragraph">گیت آپس (GitOps) یک چارچوب عملیاتی و مجموعه‌ای از روش‌ها برای مدیریت زیرساخت و استقرار برنامه‌ها است که از Git به‌عنوان تک‌منبع حقیقت (Single Source of Truth) استفاده می‌کند. در این رویکرد، وضعیت مطلوب (Desired State) زیرساخت و برنامه‌ها به‌صورت اعلامی (Declarative) در مخزن Git تعریف و نگهداری می‌شود و Git مرجع اصلی ثبت و مدیریت تغییرات است.</p>



<p class="wp-block-paragraph">GitOps را می‌توان تکامل IaC (مخفف Infrastructure as Code به معنی <a href="https://hamravesh.com/blog/infrastructure-as-code/" type="link" id="https://hamravesh.com/blog/infrastructure-as-code/" target="_blank" rel="noreferrer noopener">زیرساخت به عنوان کد</a>) و یکی از بهترین شیوه‌های DevOps دانست. این رویکرد با استفاده از Git و اتوماسیون، امکان مدیریت زیرساخت و استقرار برنامه‌ها را به‌صورت سازگار، تکرارپذیر و قابل‌ردیابی فراهم می‌کند.</p>



<h2 class="wp-block-heading" id="h-اصول-gitops">اصول GitOps</h2>



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



<ul class="wp-block-list">
<li>پیکربندی‌ها باید به‌صورت اعلامی (Declarative) تعریف شوند؛ یعنی وضعیت مطلوب سیستم در قالب فایل‌های پیکربندی در مخزن Git نگهداری شود.</li>



<li>تمام تغییرات باید در Git نسخه‌بندی شوند تا تاریخچه تغییرات حفظ شود و امکان بررسی، بازبینی و بازگشت به نسخه‌های قبلی وجود داشته باشد.</li>



<li>تغییرات باید به‌صورت خودکار از مخزن Git دریافت و در محیط اعمال شوند تا وضعیت عملیاتی با وضعیت ثبت‌شده در Git همگام بماند.</li>



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



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



<p class="wp-block-paragraph">در GitOps، تمام تغییرات زیرساخت و استقرار برنامه‌ها ابتدا در مخزن Git ثبت می‌شوند. تیم‌ها تغییرات را در قالب Pull Request (درخواست بررسی و ادغام تغییرات) یا Merge Request (معادل Pull Request در GitLab) ایجاد می‌کنند و پس از بررسی و تأیید، آن‌ها را در شاخه اصلی مخزن ادغام می‌کنند. به این ترتیب، Git به‌عنوان تک‌منبع حقیقت، وضعیت مطلوب (Desired State) زیرساخت و برنامه‌ها را نگهداری می‌کند.</p>



<p class="wp-block-paragraph">پس از ادغام تغییرات، فرایندهای خودکار وضعیت ثبت‌شده در Git را روی محیط عملیاتی اعمال می‌کنند تا زیرساخت و برنامه‌ها با وضعیت تعریف‌شده در مخزن همگام شوند. این رویکرد باعث می‌شود استقرارها به‌صورت سازگار، تکرارپذیر و قابل‌ردیابی انجام شوند.</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/06/hamravesh-what-is-gitops-03-1024x668.webp" alt="تشریح نحوه عملکرد گیت آپس" class="wp-image-5360" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-gitops-03-1024x668.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-gitops-03-300x196.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-gitops-03-768x501.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-gitops-03-120x78.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-gitops-03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">در GitOps، تمام تغییرات زیرساخت و برنامه‌ها ابتدا در قالب Pull Request یا Merge Request بررسی و پس از تأیید، در مخزن Git ثبت می‌شوند. مخزن Git به‌عنوان تک‌منبع حقیقت (Single Source of Truth)، وضعیت مطلوب (Desired State) سیستم را نگهداری می‌کند. سپس GitOps Agent یا Operator (مانند Argo CD یا Flux) به‌طور مداوم مخزن Git را پایش می‌کند، وضعیت مطلوب را با وضعیت واقعی (Actual State) در کلاستر کوبرنتیز مقایسه می‌کند و در صورت مشاهده هرگونه اختلاف، از طریق فرایند Continuous Reconciliation محیط عملیاتی را به‌صورت خودکار با وضعیت ثبت‌شده در Git همگام می‌کند.</figcaption></figure>



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



<ul class="wp-block-list">
<li>تعریف زیرساخت به‌صورت کد (IaC)</li>



<li>ثبت تغییرات در مخزن Git</li>



<li>ایجاد Pull Request یا Merge Request</li>



<li>بررسی و تأیید تغییرات</li>



<li>ادغام تغییرات در شاخه اصلی</li>



<li>اجرای خودکار فرایندهای CI/CD</li>



<li>همگام‌سازی محیط عملیاتی با وضعیت ثبت‌شده در Git</li>
</ul>



<h2 class="wp-block-heading" id="h-اجزای-اصلی-معماری-گیت-آپس">اجزای اصلی معماری گیت آپس </h2>



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>مؤلفه</strong></th><th class="has-text-align-center" data-align="center"><strong>نقش در معماری GitOps</strong></th></tr></thead><tbody><tr><td>مخزن گیت (Git Repository)</td><td class="has-text-align-center" data-align="center">تک‌منبع حقیقت (Single Source of Truth) برای نگهداری وضعیت مطلوب (Desired State)، فایل‌های پیکربندی و تعریف زیرساخت و برنامه‌ها</td></tr><tr><td>پیکربندی‌های اعلامی (Declarative Configuration)</td><td class="has-text-align-center" data-align="center">تعریف وضعیت مطلوب زیرساخت و برنامه‌ها به‌صورت فایل‌های اعلامی که در Git نسخه‌بندی می‌شوند</td></tr><tr><td>IaC</td><td class="has-text-align-center" data-align="center">مدیریت و نسخه‌بندی زیرساخت به‌صورت کد و نگهداری آن در مخزن Git</td></tr><tr><td>Pull Request / Merge Request</td><td class="has-text-align-center" data-align="center">مکانیزمی برای پیشنهاد، بررسی، تأیید و ادغام تغییرات پیش از اعمال آن‌ها</td></tr><tr><td>CI (اختیاری)</td><td class="has-text-align-center" data-align="center">اعتبارسنجی، تست و آماده‌سازی تغییرات پیش از استقرار؛ GitOps معمولاً در کنار فرایندهای CI استفاده می‌شود، اما به آن وابسته نیست</td></tr><tr><td>GitOps Agent یا Operator</td><td class="has-text-align-center" data-align="center">مقایسه مداوم وضعیت واقعی با وضعیت مطلوب موجود در Git و همگام‌سازی خودکار محیط در صورت وجود اختلاف</td></tr><tr><td>کوبرنتیز یا پلتفرم ارکستریشن</td><td class="has-text-align-center" data-align="center">بستر اجرای برنامه‌ها و اعمال خودکار تغییرات؛ اگرچه GitOps به کوبرنتیز محدود نیست، اما رایج‌ترین پیاده‌سازی‌های آن بر پایه کوبرنتیز هستند</td></tr></tbody></table></figure>



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



<h2 class="wp-block-heading" id="h-گیت-آپس-در-کوبرنتیز">گیت‌آپس در کوبرنتیز</h2>



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



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



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>کاربرد</strong></th><th class="has-text-align-center" data-align="center"><strong>توضیح</strong></th></tr></thead><tbody><tr><td>استقرار مداوم (Continuous Deployment)</td><td class="has-text-align-center" data-align="center">اعمال خودکار تغییرات ثبت‌شده در Git روی کلاستر کوبرنتیز </td></tr><tr><td>مدیریت پیکربندی</td><td class="has-text-align-center" data-align="center">نگهداری فایل‌های پیکربندی کوبرنتیز در Git و مدیریت تغییرات از طریق فرایندهای استاندارد Git</td></tr><tr><td>حفظ وضعیت مطلوب (Desired State)</td><td class="has-text-align-center" data-align="center">مقایسه مداوم وضعیت واقعی خوشه با وضعیت تعریف‌شده در Git و همگام‌سازی خودکار در صورت وجود اختلاف</td></tr><tr><td>قابلیت ردیابی تغییرات</td><td class="has-text-align-center" data-align="center">ثبت تمامی تغییرات در Git و امکان بررسی، حسابرسی و بازگشت به نسخه‌های قبلی</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-ابزارهای-معروف-گیت-آپس">ابزارهای معروف گیت آپس</h2>



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



<p class="wp-block-paragraph">در میان این ابزارها، <a href="https://hamravesh.com/blog/what-is-argocd/" type="link" id="https://hamravesh.com/blog/what-is-argocd/" target="_blank" rel="noreferrer noopener">Argo CD</a> و Flux از رایج‌ترین ابزارهای گیت آپس برای همگام‌سازی وضعیت کوبرنتیز با وضعیت ثبت‌شده در مخزن Git هستند. در محیط‌های مبتنی بر OpenShift نیز Red Hat OpenShift GitOps برای پیاده‌سازی این رویکرد ارائه شده است. علاوه بر این، ابزارهای CI مانند GitLab CI ،Jenkins ،Tekton و CircleCI معمولاً برای ساخت، تست و اعتبارسنجی تغییرات پیش از استقرار در کنار گیت آپس استفاده می‌شوند.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>ابزار</strong></th><th class="has-text-align-center" data-align="center"><strong>دسته</strong></th><th class="has-text-align-center" data-align="center"><strong>کاربرد</strong></th></tr></thead><tbody><tr><td>Argo CD</td><td class="has-text-align-center" data-align="center">GitOps</td><td class="has-text-align-center" data-align="center">همگام‌سازی خودکار وضعیت کوبرنتیز با وضعیت ثبت‌شده در Git و مدیریت استقرار برنامه‌ها</td></tr><tr><td>Flux</td><td class="has-text-align-center" data-align="center">GitOps</td><td class="has-text-align-center" data-align="center">همگام‌سازی مداوم کلاستر کوبرنتیز با وضعیت مطلوب تعریف‌شده در مخزن Git</td></tr><tr><td>GitHub ،GitLab و Bitbucket</td><td class="has-text-align-center" data-align="center">مخزن Git</td><td class="has-text-align-center" data-align="center">نگهداری کد، فایل‌های پیکربندی و وضعیت مطلوب سیستم</td></tr><tr><td>GitLab CI ،Jenkins ،Tekton و CircleCI</td><td class="has-text-align-center" data-align="center">CI</td><td class="has-text-align-center" data-align="center">ساخت، تست و اعتبارسنجی تغییرات پیش از استقرار</td></tr><tr><td>Terraform</td><td class="has-text-align-center" data-align="center">IaC</td><td class="has-text-align-center" data-align="center">مدیریت و تأمین زیرساخت به‌صورت کد در کنار گردش کار GitOps</td></tr><tr><td>Kubernetes</td><td class="has-text-align-center" data-align="center">ارکستریشن</td><td class="has-text-align-center" data-align="center">اجرای بارهای کاری کانتینری و رایج‌ترین بستر پیاده‌سازی GitOps</td></tr><tr><td>Red Hat OpenShift GitOps</td><td class="has-text-align-center" data-align="center">پلتفرم GitOps</td><td class="has-text-align-center" data-align="center">پیاده‌سازی GitOps در محیط‌های مبتنی بر Red Hat OpenShift</td></tr></tbody></table></figure>



<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-گیت-لب-رانر-اختصاصی-هم-روش-سرویس-gitlab-مدیریت-شده-هم-روش">💡 گیت‌لب رانر اختصاصی هم‌روش؛ سرویس GitLab مدیریت‌شده هم‌روش</h3>



<p class="wp-block-paragraph">زیرساخت اختصاصی برای اجرای پایپ‌لاین‌های CI/CD</p>



<p class="wp-block-paragraph"><br>✅ اجرای Jobهای CI/CD روی Runner اختصاصی<br>✅ پشتیبانی از Docker، همراه با Image Layer Cache برای اجرای سریع‌تر پایپ‌لاین‌ها<br>✅ عبور از تحریم و راه‌اندازی ساده</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="https://hamravesh.com/gitlab-runner" type="link" id="https://hamravesh.com/gitlab-runner" target="_blank" rel="noreferrer noopener">گیت‌لب رانر</a></p>
</div></div>
</div></div>
</div>



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



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



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>سناریو</strong></th><th class="has-text-align-center" data-align="center"><strong>دلیل استفاده از GitOps</strong></th></tr></thead><tbody><tr><td>استقرار برنامه‌ها در کوبرنتیز</td><td class="has-text-align-center" data-align="center">همگام‌سازی خودکار وضعیت کلاستر با وضعیت ثبت‌شده در Git</td></tr><tr><td>مدیریت زیرساخت و برنامه‌ها با Git</td><td class="has-text-align-center" data-align="center">نگهداری وضعیت مطلوب در یک مخزن مرکزی و قابل‌نسخه‌بندی</td></tr><tr><td>استفاده از IaC</td><td class="has-text-align-center" data-align="center">مدیریت تغییرات زیرساخت از طریق فایل‌های اعلامی و قابل‌ردیابی</td></tr><tr><td>استقرارهای مکرر</td><td class="has-text-align-center" data-align="center">خودکارسازی فرایند استقرار و کاهش نیاز به عملیات دستی</td></tr><tr><td>نیاز به قابلیت حسابرسی</td><td class="has-text-align-center" data-align="center">ثبت کامل تاریخچه تغییرات و امکان بررسی و بازبینی آن‌ها</td></tr><tr><td>مدیریت چند محیط استقرار</td><td class="has-text-align-center" data-align="center">حفظ سازگاری پیکربندی‌ها میان محیط‌های توسعه، آزمایش و تولید</td></tr></tbody></table></figure>



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



<h2 class="wp-block-heading" id="h-مزایای-گیت-آپس-چیست">مزایای گیت آپس چیست؟</h2>



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



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



<li><strong>قابلیت حسابرسی و ردیابی تغییرات:</strong> تمام تغییرات در Git ثبت می‌شوند و تاریخچه کاملی از آن‌ها برای بررسی، بازبینی و ممیزی در دسترس است.</li>



<li><strong>همکاری بهتر بین تیم‌ها:</strong> توسعه‌دهندگان و تیم‌های عملیات از یک مخزن مشترک برای مدیریت زیرساخت و برنامه‌ها استفاده می‌کنند و تغییرات را از طریق گردش کار استاندارد Git بررسی می‌کنند.</li>



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



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



<li><strong>استفاده از ابزارهای آشنا:</strong> گیت آپس بر پایه Git و فرایندهایی مانند Pull Request یا Merge Request بنا شده است؛ بنابراین بسیاری از توسعه‌دهندگان بدون نیاز به یادگیری ابزارها یا گردش کار کاملاً جدید می‌توانند از آن استفاده کنند.</li>
</ul>



<h2 class="wp-block-heading" id="h-چالش-های-گیت-آپس-چیست">چالش‌های گیت آپس چیست؟</h2>



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



<ul class="wp-block-list">
<li><strong>نیاز به تغییر فرایندها و فرهنگ کاری:</strong> در گیت آپس تمام تغییرات باید از طریق Git مدیریت شوند. این موضوع ممکن است برای تیم‌هایی که به اعمال مستقیم تغییرات در محیط عملیاتی عادت دارند، نیازمند تغییر در شیوه کار و پذیرش فرایندهای جدید باشد.</li>



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



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



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



<li><strong>مدیریت اطلاعات حساس (Secrets):</strong> از آنجا که Git به‌عنوان تک‌منبع حقیقت برای نگهداری پیکربندی‌ها استفاده می‌شود، نباید اطلاعات حساس به‌صورت مستقیم در مخزن ذخیره شوند. در عمل، معمولاً از راهکارهایی مانند Secret Managerها، Sealed Secrets یا External Secrets برای مدیریت امن این اطلاعات استفاده می‌شود.</li>



<li><strong>مدیریت وابستگی‌ها و گردش کار CI/CD:</strong> در پروژه‌های بزرگ، هماهنگ نگه داشتن وابستگی میان برنامه‌ها، پایپ‌لایت‌های CI و فرایندهای استقرار می‌تواند پیچیدگی گیت آپس را افزایش دهد و نیازمند طراحی دقیق گردش کار باشد.</li>
</ul>



<h2 class="wp-block-heading" id="h-تفاوت-gitops-و-devops">تفاوت GitOps و DevOps</h2>



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



<p class="wp-block-paragraph">به عبارت دیگر، GitOps جایگزین <a href="https://hamravesh.com/blog/what-is-devops/" type="link" id="https://hamravesh.com/blog/what-is-devops/" target="_blank" rel="noreferrer noopener">DevOps</a> نیست، بلکه رویکردی برای پیاده‌سازی بخشی از اصول DevOps با تکیه بر Git ،IaC و اتوماسیون است.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>معیار</strong></th><th class="has-text-align-center" data-align="center"><strong>DevOps</strong></th><th class="has-text-align-center" data-align="center"><strong>GitOps</strong></th></tr></thead><tbody><tr><td>ماهیت</td><td class="has-text-align-center" data-align="center">فرهنگ و مجموعه‌ای از اصول و روش‌ها</td><td class="has-text-align-center" data-align="center">مدل عملیاتی و مجموعه‌ای از روش‌ها مبتنی بر Git</td></tr><tr><td>هدف اصلی</td><td class="has-text-align-center" data-align="center">افزایش همکاری، اتوماسیون و ارائه سریع‌تر نرم‌افزار</td><td class="has-text-align-center" data-align="center">مدیریت زیرساخت و استقرار برنامه‌ها بر پایه Git</td></tr><tr><td>منبع حقیقت</td><td class="has-text-align-center" data-align="center">می‌تواند ابزارها و منابع مختلفی داشته باشد</td><td class="has-text-align-center" data-align="center">Git تک‌منبع حقیقت است</td></tr><tr><td>مدیریت تغییرات</td><td class="has-text-align-center" data-align="center">وابسته به ابزارها و فرایندهای سازمان</td><td class="has-text-align-center" data-align="center">تمام تغییرات از طریق Git مدیریت می‌شوند</td></tr><tr><td>دامنه کاربرد</td><td class="has-text-align-center" data-align="center">توسعه، تست، استقرار و عملیات</td><td class="has-text-align-center" data-align="center">مدیریت زیرساخت، پیکربندی و استقرار برنامه‌ها</td></tr><tr><td>ارتباط با کوبرنتیز</td><td class="has-text-align-center" data-align="center">الزامی نیست</td><td class="has-text-align-center" data-align="center">یکی از رایج‌ترین بسترهای پیاده‌سازی GitOps است</td></tr><tr><td>رابطه با یکدیگر</td><td class="has-text-align-center" data-align="center">مفهوم گسترده‌تر</td><td class="has-text-align-center" data-align="center">روشی برای پیاده‌سازی بخشی از اصول DevOps</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-تفاوت-gitops-و-ci-cd">تفاوت GitOps و CI/CD</h2>



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



<p class="wp-block-paragraph">در بسیاری از پیاده‌سازی‌ها، ابزارهای CI مسئول ساخت، تست و انتشار Artifactها هستند و پس از آن، GitOps با استفاده از مخزن Git و ابزارهایی مانند Argo CD یا Flux، تغییرات را در محیط عملیاتی اعمال و وضعیت آن را با مخزن Git همگام نگه می‌دارد.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>معیار</strong></th><th class="has-text-align-center" data-align="center"><strong>CI/CD</strong></th><th class="has-text-align-center" data-align="center"><strong>GitOps</strong></th></tr></thead><tbody><tr><td>تعریف</td><td class="has-text-align-center" data-align="center">مجموعه‌ای از فرایندها برای خودکارسازی ساخت، تست و استقرار نرم‌افزار</td><td class="has-text-align-center" data-align="center">مدل عملیاتی برای مدیریت استقرار و زیرساخت بر پایه Git</td></tr><tr><td>تمرکز اصلی</td><td class="has-text-align-center" data-align="center">ساخت، تست و آماده‌سازی نرم‌افزار برای انتشار</td><td class="has-text-align-center" data-align="center">مدیریت وضعیت مطلوب و استقرار زیرساخت و برنامه‌ها</td></tr><tr><td>منبع حقیقت</td><td class="has-text-align-center" data-align="center">وابسته به ابزارها و فرایندهای سازمان</td><td class="has-text-align-center" data-align="center">Git تک‌منبع حقیقت است</td></tr><tr><td>نحوه اعمال تغییرات</td><td class="has-text-align-center" data-align="center">معمولاً پایپ‌لاین تغییرات را به محیط هدف ارسال می‌کند (Push)</td><td class="has-text-align-center" data-align="center">عامل GitOps تغییرات را از مخزن Git دریافت و با محیط همگام می‌کند (Pull)</td></tr><tr><td>ابزارهای رایج</td><td class="has-text-align-center" data-align="center">GitLab CI،Jenkins ،CircleCI و Tekton</td><td class="has-text-align-center" data-align="center">Argo CD ،Flux و Red Hat OpenShift GitOps</td></tr><tr><td>نقش Git</td><td class="has-text-align-center" data-align="center">مخزن کد و یکی از اجزای فرایند توسعه</td><td class="has-text-align-center" data-align="center">مرجع نهایی وضعیت مطلوب سیستم</td></tr><tr><td>ارتباط با یکدیگر</td><td class="has-text-align-center" data-align="center">مسئول ساخت، تست و آماده‌سازی برای استقرار</td><td class="has-text-align-center" data-align="center">معمولاً پس از CI، استقرار و همگام‌سازی محیط را انجام می‌دهد</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">در عمل، بسیاری از سازمان‌ها از GitOps و CI/CD در کنار یکدیگر استفاده می‌کنند. ابزارهای CI مانند GitLab CI ،Jenkins یا Tekton کد را می‌سازند، تست می‌کنند و Artifactها را تولید می‌کنند. سپس ابزارهای GitOps مانند Argo CD یا Flux وضعیت ثبت‌شده در Git را با محیط عملیاتی همگام می‌کنند تا استقرارها به‌صورت خودکار، قابل‌ردیابی و سازگار انجام شوند.</p>



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



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



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



<p class="wp-block-paragraph">با این حال، موفقیت گیت آپس تنها به انتخاب ابزارهایی مانند Argo CD یا Flux وابسته نیست؛ بلکه به استفاده صحیح از IaC، طراحی گردش کار مناسب و پایبندی تیم‌ها به مدیریت تغییرات از طریق Git نیز بستگی دارد.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-gitops/">GitOps چیست؟ آشنایی با معماری، اصول و روش عملکرد</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-gitops/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با High Availability؛ بررسی معماری و مقایسه با Disaster Recovery</title>
		<link>https://hamravesh.com/blog/what-is-high-availability/</link>
					<comments>https://hamravesh.com/blog/what-is-high-availability/#respond</comments>
		
		<dc:creator><![CDATA[هم‌روش]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 12:30:49 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5307</guid>

					<description><![CDATA[<p>HA در ابر یکی از مهم‌ترین رویکردها برای کاهش زمان ازکارافتادگی سرویس‌ها و حفظ دسترسی مداوم به برنامه‌ها و داده‌ها است. با گسترش استفاده از رایانش ابری، سازمان‌ها انتظار دارند خدمات آن‌ها حتی در زمان بروز خرابی یا عملیات نگهداری هم تا حد امکان در دسترس باقی بماند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-high-availability/">آشنایی با High Availability؛ بررسی معماری و مقایسه با Disaster Recovery</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">دسترسی مداوم به سرویس‌ها و داده‌ها به یکی از مهم‌ترین الزامات زیرساخت‌های مدرن تبدیل شده است. ازکارافتادگی حتی کوتاه‌مدت یک سرویس می‌تواند بر تجربه کاربران، تداوم فعالیت سازمان و تعهدات SLA تأثیر بگذارد. به همین دلیل، بسیاری از سازمان‌ها از معماری‌های High Availability (یا به اختصار HA) برای کاهش زمان ازکارافتادگی و حفظ پایداری سرویس‌ها استفاده می‌کنند. در این مقاله بررسی می‌کنیم که HA چیست، دسترس‌پذیری بالا چگونه محقق می‌شود و چه فاکتورهایی برای ارزیابی آن وجود دارد.</p>



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



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



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



<ul class="wp-block-list">
<li>کاهش زمان ازکارافتادگی از طریق افزونگی (Redundancy)</li>



<li>تداوم سرویس در صورت خرابی مؤلفه‌ها با استفاده از مکانیزم‌هایی مانند Failover</li>
</ul>



<h3 class="wp-block-heading" id="h-تفاوت-high-availability-با-uptime">تفاوت High Availability با Uptime</h3>



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



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



<h2 class="wp-block-heading" id="h-معیارهای-اندازه-گیری-high-availability-فاکتورهای-ha">معیارهای اندازه‌گیری High Availability (فاکتورهای HA)</h2>



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



<h3 class="wp-block-heading" id="h-five-nines-99-999-یا-سطوح-دسترس-پذیری">Five Nines (99.999%) یا سطوح دسترس‌پذیری</h3>



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



<h3 class="wp-block-heading" id="h-میانگین-زمان-بین-خرابی-ها-mtbf">میانگین زمان بین خرابی‌ها (MTBF)</h3>



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



<h3 class="wp-block-heading" id="h-میانگین-زمان-تعمیر-mttr">میانگین زمان تعمیر (MTTR)</h3>



<p class="wp-block-paragraph">MTTR یا Mean Time to Repair، میانگین مدت زمان موردنیاز برای شناسایی، عیب‌یابی و بازگرداندن سیستم به حالت عملیاتی پس از خرابی را اندازه‌گیری می‌کند. کاهش MTTR نشان می‌دهد سازمان می‌تواند در زمان کوتاه‌تری به رخدادها پاسخ دهد و سرویس را دوباره در اختیار کاربران قرار دهد.</p>



<h3 class="wp-block-heading" id="h-هدف-زمان-بازیابی-rto">هدف زمان بازیابی (RTO)</h3>



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



<h3 class="wp-block-heading" id="h-هدف-نقطه-بازیابی-rpo">هدف نقطه بازیابی (RPO)</h3>



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



<h2 class="wp-block-heading" id="h-اجزای-کلیدی-و-مفاهیم-بنیادین-در-معماری-high-availability">اجزای کلیدی و مفاهیم بنیادین در معماری High Availability</h2>



<p class="wp-block-paragraph">پیاده‌سازی High Availability به مجموعه‌ای از فناوری‌ها و معماری‌ها متکی است که با همکاری یکدیگر، احتمال ازکارافتادگی سرویس را کاهش می‌دهند. این اجزا با حذف نقاط شکست تکی (SPOF مخفف Single Point of Failure)، تشخیص خرابی و بازیابی سریع سرویس، به افزایش دسترس‌پذیری کمک می‌کنند. در ادامه، مهم‌ترین مفاهیم معماری HA را بررسی می‌کنیم.</p>



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



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



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



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



<p class="wp-block-paragraph"><strong>تکثیر داده (Replication):</strong> تکثیر داده به فرایند کپی و همگام‌سازی داده‌ها میان چند نود یا حتی چند کلاستر گفته می‌شود. این کار باعث می‌شود در صورت از دسترس خارج شدن یک سرور یا دیتاسنتر، داده‌های موردنیاز همچنان در محل دیگری در دسترس باشند. تکثیر داده می‌تواند به‌صورت همزمان (Synchronous) یا ناهمزمان (Asynchronous) انجام شود که هریک از نظر عملکرد و میزان ریسک از دست رفتن داده ویژگی‌های متفاوتی دارند.</p>



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



<p class="wp-block-paragraph"><strong>بررسی سلامت (Health Checks) و خودترمیمی (Self-healing): </strong>سیستم‌های HA به‌طور مداوم وضعیت سرورها، سرویس‌ها و برنامه‌های کاربردی را پایش می‌کنند تا خرابی‌ها در کوتاه‌ترین زمان ممکن شناسایی شوند. در بسیاری از معماری‌های مدرن، پس از تشخیص مشکل، فرایندهایی مانند اجرای Failover یا بازیابی خودکار سرویس بدون دخالت انسان انجام می‌شود که این امر به کاهش زمان ازکارافتادگی کمک می‌کند.</p>



<h2 class="wp-block-heading" id="h-روش-های-پیاده-سازی-high-availability">روش‌های پیاده‌سازی High Availability</h2>



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



<h3 class="wp-block-heading" id="h-حذف-نقاط-شکست-تکی-spof">حذف نقاط شکست تکی (SPOF)</h3>



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



<h3 class="wp-block-heading" id="h-پیاده-سازی-failover-قابل-اعتماد">پیاده‌سازی Failover قابل اعتماد</h3>



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



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



<p class="wp-block-paragraph">یک معماری HA باید بتواند خرابی‌ها را در کوتاه‌ترین زمان ممکن شناسایی کند و در صورت نیاز، به‌صورت خودکار اقداماتی مانند Failover را اجرا کند. معمولا برای این منظور از ابزارهای مانیتورینگ، Health Check و مکانیزم‌های Heartbeat (مکانیزمی برای بررسی مداوم وضعیت و در دسترس بودن نودها) استفاده می‌شود.</p>



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



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



<h3 class="wp-block-heading" id="h-استقرار-کلاسترهای-ha-و-load-balancing">استقرار کلاسترهای HA و Load Balancing</h3>



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



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



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



<h2 class="wp-block-heading" id="h-مقایسه-high-availability-با-disaster-recovery">مقایسه High Availability با Disaster Recovery</h2>



<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/06/hamravesh-what-is-high-availability2-1024x668.webp" alt="مقایسه High Availability با Disaster Recovery" class="wp-image-5339" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-high-availability2-1024x668.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-high-availability2-300x196.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-high-availability2-768x501.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-high-availability2-120x78.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/06/hamravesh-what-is-high-availability2.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">تفاوت HA و DR یکی از موضوعات مهم در طراحی زیرساخت‌های پایدار است. High Availability بر کاهش زمان ازکارافتادگی و حفظ دسترس‌پذیری سرویس در زمان خرابی‌های معمول تمرکز دارد، در حالی که <a href="https://hamravesh.com/blog/what-is-disaster-recovery/" type="link" id="https://hamravesh.com/blog/what-is-disaster-recovery/" target="_blank" rel="noreferrer noopener">بازیابی از فاجعه</a> یا DR برای بازیابی سرویس‌ها و داده‌ها پس از رویدادهای گسترده و فاجعه‌بار به کار می‌رود. این دو رویکرد مکمل یکدیگر هستند و بسیاری از سازمان‌ها برای افزایش تداوم کسب‌وکار از هر دو استفاده می‌کنند. در جدول زیر بررسی کرده‌ایم که مهم‌ترین تفاوت‌های DR و HA چیست. </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>High Availability (HA)</strong></td><td class="has-text-align-center" data-align="center"><strong>Disaster Recovery (DR)</strong></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><tr><td class="has-text-align-center" data-align="center">هدف</td><td class="has-text-align-center" data-align="center">کاهش downtime و حفظ دسترس‌پذیری سرویس</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">افزونگی، Load Balancing ،Failover ،Replication و Clustering</td><td class="has-text-align-center" data-align="center">Backup و Restore، تکثیر بین سایت‌ها، بازیابی مبتنی بر ابر و برنامه‌ریزی مدیریت بحران</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><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><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><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><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-تفاوت-high-availability-با-fault-tolerance">تفاوت High Availability با Fault Tolerance</h2>



<p class="wp-block-paragraph">High Availability و Fault Tolerance هر دو با هدف افزایش پایداری و تداوم سرویس طراحی می‌شوند، اما رویکرد آن‌ها متفاوت است. High Availability با استفاده از افزونگی و Failover تلاش می‌کند زمان ازکارافتادگی را به حداقل برساند، در حالی که Fault Tolerance به‌گونه‌ای طراحی می‌شود که سرویس حتی در صورت خرابی برخی مؤلفه‌ها نیز بدون وقفه به کار خود ادامه دهد. به همین دلیل، Fault Tolerance معمولاً به منابع بیشتر و معماری پیچیده‌تری نسبت به HA نیاز دارد. در جدول مقایسه کرده‌ایم که تفاوت‌های Fault Tolerance و HA چیست.</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>High Availability (HA)</strong></td><td class="has-text-align-center" data-align="center"><strong>Fault Tolerance (FT)</strong></td></tr><tr><td class="has-text-align-center" data-align="center">هدف</td><td class="has-text-align-center" data-align="center">به حداقل رساندن downtime</td><td class="has-text-align-center" data-align="center">دستیابی به صفر downtime</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><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><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><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><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-مزایای-high-availability">مزایای High Availability</h2>



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



<ul class="wp-block-list">
<li><strong>افزایش دسترس‌پذیری سرویس‌ها: </strong>HA امکان دسترسی مداوم کاربران و کارکنان به برنامه‌ها و داده‌های حیاتی را فراهم می‌کند و وابستگی به زمان یا مکان را کاهش می‌دهد.</li>



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



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



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



<li><strong>پشتیبانی از تعهدات SLA: </strong>بسیاری از ارائه‌دهندگان خدمات ابری و سرویس‌های مدیریت‌شده برای رعایت توافق‌نامه‌های سطح سرویس (SLA)، به زیرساخت‌های HA متکی هستند.</li>



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



<li><strong>کمک به تداوم کسب‌وکار:</strong> High Availability به سازمان کمک می‌کند حتی در زمان خرابی مؤلفه‌ها یا انجام تعمیرات برنامه‌ریزی‌شده، فعالیت سرویس‌های اصلی بدون اختلال جدی ادامه پیدا کند.</li>
</ul>



<h2 class="wp-block-heading" id="h-چالش-های-high-availability">چالش‌های High Availability</h2>



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



<ul class="wp-block-list">
<li><strong>دستیابی به ۱۰۰٪ Uptime عملاً امکان‌پذیر نیست:</strong> هیچ زیرساختی نمی‌تواند همیشه و بدون حتی یک لحظه اختلال فعال بماند. حتی استاندارد پنج ۹ (99.999%) هم چند دقیقه ازکارافتادگی مجاز در سال دارد.</li>



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



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



<li><strong>مقابله با خرابی‌های هم‌علت (Common-Cause Failures):</strong> گاهی یک عامل مشترک مانند قطعی برق، آتش‌سوزی یا خطای نرم‌افزاری می‌تواند چند مؤلفه را به‌طور هم‌زمان از کار بیندازد. کاهش این ریسک معمولاً به افزونگی و توزیع مناسب منابع نیاز دارد.</li>



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



<li><strong>نیاز به تست و پایش مداوم:</strong> پیاده‌سازی HA پایان کار نیست. مکانیزم‌های Failover، نسخه‌های پشتیبان و فرایندهای بازیابی باید به‌صورت منظم آزمایش شوند تا در زمان بروز خرابی، مطابق انتظار عمل کنند.</li>



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



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



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



<p class="wp-block-paragraph">در طراحی معماری‌های HA، شاخص‌هایی مانند Availability، MTBF و MTTR برای ارزیابی عملکرد زیرساخت اهمیت دارند. همچنین، HA با وجود ارتباط نزدیک با مفاهیمی مانند Disaster Recovery و Fault Tolerance، هدف و کاربرد متفاوتی دارد؛ HA بر کاهش اختلال در سرویس تمرکز دارد، در حالی که DR برای بازیابی پس از حوادث گسترده و FT برای ادامه فعالیت بدون وقفه طراحی شده است.</p>



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



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-high-availability/">آشنایی با High Availability؛ بررسی معماری و مقایسه با Disaster Recovery</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-high-availability/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>
	</channel>
</rss>
