Distroless Containers و دیباگ بدون Shell در Kubernetes

در دنیای DevOps و Kubernetes، همیشه دنبال بهترین روش‌ها برای افزایش امنیت، کارایی و مقیاس‌پذیری هستیم. یکی از تکنیک‌های محبوب در این مسیر، استفاده از Distroless Containers است. این مفهوم هرچند ساده به نظر می‌رسد، اما وقتی روی Kubernetes اجرا می‌شود و به دیباگ کردن می‌رسد، سؤالات زیادی ایجاد می‌کند: «اصلاً Distroless یعنی چه؟»، «چرا دیباگ کردنش بی‌نهایت سخته؟» و مهم‌تر از همه: «چطور می‌توان بدون Shell واقعی، مشکلات را پیدا کرد؟».

در این مقاله طولانی و جامع، قصد دارم همه این سوالات را با زبانی ساده، صمیمی و همراه با مثال‌های واقعی برایت جواب بدم 👇


📌 Distroless Containers چیست؟

Distroless به معنای “بدون توزیع” هست. این یعنی:

🔹 تصویر (image) فقط شامل اپلیکیشن تو و وابستگی‌های مستقیمش هست.

🔹 هیچ‌چیز اضافه‌ای مثل Shell، Package Manager یا ابزار دیباگ داخلش وجود نداره.

🔹 فقط runtime‌های مورد نیاز برای اجرای برنامه‌ات هستن (مثل Node.js، Go یا Java). 

به زبان ساده‌تر:

📦 فقط خود برنامه + چیزهایی که برای اجرا لازم داره، بدون هیچ ابزار اضافی.


💡 چرا Distroless Containers این‌قدر محبوب شده؟

خیلی وقتا وقتی داریم اپ‌ها رو برای production آماده می‌کنیم، می‌خواهیم که:

✅ حجم ایمیج خیلی کم باشه

✅ سریع‌تر به cluster منتقل بشه

✅ حمله‌های احتمالی کمتر باشه

✅ سطح حمله (attack surface) خیلی پایین بیاد

🔐 امنیت بیشتر بشه

Distroless دقیقاً همینو بهت می‌ده:

📉 تصویر خیلی سبک

🔒 هیچ ابزار اضافی که قابل سوءاستفاده باشه

🔥 مخصوص محیط production 


🤯 پس مشکل کجاست؟

وقتی از Distroless استفاده می‌کنی، همه چیز عالی به نظر می‌رسه تا زمانی که اپت روی Kubernetes خطا بده یا کار نکنه!

اولین واکنش هر کسی:

kubectl exec -it my-app -- sh

ولی جواب چیه؟

❌ خطا

❌ هیچ Shell، هیچ ابزار دیباگ

❌ هیچ Package Manager برای نصب ابزارها نیست

در واقع، داخل کانتینرت مثل یک فضای «کور» گیر کردی! 


💥 راه‌حل رسمی Kubernetes: Ephemeral Containers

Kubernetes یک قابلیت بسیار مفید داره به اسم Ephemeral Containers — کانتینرهای موقت برای دیباگ.

این کانتینرها رو می‌تونی به یک Pod فعال اضافه کنی، بدون اینکه:

✔ Pod ری‌استارت بشه

✔ نسخه production تغییر کنه

✔ هیچ downtime‌ای داشته باشی 

یعنی چی؟

مثلاً اپ تو Distroless اجرا می‌شه و بی‌صدا خطای 500 می‌ده.

به جای rebuild کردن ایمیج، می‌تونی یک کانتینر Debug موقت اضافه کنی و داخلش ابزارهایی مثل sh, ps, ping, wget داشته باشی 👇 


📌 چطور Ephemeral Containers کار می‌کنن؟

فرض کن Podای داریم با Distroless:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: gcr.io/distroless/static
    command: ["sleep", "3600"]

وقتی اینو می‌دی بالا، Pod به حالت RUNNING میره.

حالا می‌خواهیم واردش بشیم اما چون هیچ shell نیست، دسترسی نداریم. 

📍 اضافه کردن Debug کانتینر:

kubectl debug -it my-app \
  --image=busybox \
  --target=app \
  --name=debugger

حالا وارد BusyBox می‌شی که:

🔹 داخل همون network namespaceه

🔹 processهای اپ اصلی رو می‌بینه

🔹 می‌تونی فایل‌سیستم رو بررسی کنی

🔹 ابزارهای دیرینه مثل ps, ping, cat, wget رو داری 

بعد از وارد شدن، می‌تونی:

ps
ping 8.8.8.8
cat /etc/hosts
wget <some-url>

و تمام ابزارهای لازم رو در اختیار داری! 


🧠 مهم‌ترین نکته:

🔥 اپ اصلی بدون ری‌استارت و بدون downtime اجرا می‌شه!

این یعنی:

✔ لازم نیست Distroless رو دوباره بسازی

✔ ابزارهای دیباگ به ایمیج اضافه نمی‌شن

✔ امنیت و سبک بودن Distroless حفظ می‌شن 


💡 نکته پیشرفته: /proc/1/root

اگر بخوای به فایل‌سیستم اصلی کانتینر دسترسی داشته باشی، می‌تونی از راه‌های قوی‌تر مثل مسیر /proc/1/root استفاده کنی (این مسیر به روت فایل‌سیستم پردازه با PID 1 اشاره داره) و فایل‌های کانتینر اصلی رو از داخل debug container ببینی. 


📌 مزایای Distroless در Production

✨ سایز ایمیج خیلی کمتر

✨ امنیت بیشتر

✨ حملات کمتر

✨ کم‌کردن منابع غیرضروری

✨ Deploy سریع‌تر

✨ مناسب برای Cloud-native 


⚠️ مواردی که باید بدونی

✔ Distroless برای production عالیه

✔ برای دیباگ، همیشه از Ephemeral Containers استفاده کن

✔ نیازی به rebuild ایمیج برای debug نیست

✔ ابزارهای debug فقط در کانتینر موقت هستند

✔ بعد از exit کردن، Debug container حذف میشه


🧾 جمع‌بندی

وقتی حرف از Kubernetes میاد و می‌خوای اپت پروداکشن باشه، Distroless Containers یه انتخاب عالیه چون:

  • سبک‌ترن
  • امن‌ترن
  • سریع‌تر deploy می‌شن

ولی وقتی برمی‌خوریم به دیباگ، دیگه نمی‌تونی با kubectl exec داخلش بشی چون حتی شل نداره.

برای همین Kubernetes Magic می‌کنه با Ephemeral Containers — ابزاری که بهت اجازه می‌ده کانتینرهای دیباگ رو بدون تغییر ایمیج و بدون downtime اضافه کنی، و به راحتی با ابزارهای مورد نیاز داخلش کار کن 🛠️.

اگر دفعه بعد تو Distroless گیر کردی، به جای rebuild کردن تصویر، هوشمندانه debug کن! 🚀


❓ سوالات متداول (FAQs)

1. آیا Distroless فقط برای Kubernetes خوبه؟

نه، Distroless برای هر محیط production که امنیت و حجم کم مهمه مفیده، ولی ابزار دیباگ نداره. 

2. چطور می‌تونم داخل Distroless Shell داشته باشم؟

به‌طور پیش‌فرض نمی‌تونی چون Shell نداره. باید از Ephemeral Container استفاده کنی. 

3. آیا Ephemeral Containers همیشه فعال هستن؟

نه، موقتی هستن و بعد از خروج ازش حذف می‌شن. 

4. می‌تونم برای دیباگ از ابزارهای حرفه‌ای‌تر مثل tcpdump استفاده کنم؟

بله، اگر Debug Imageت این ابزارها رو داشته باشه. 

5. آیا باید Pod رو ری‌استارت کنم تا Debug‌کنم؟

نه! با Ephemeral Containers نیازی به ری‌استارت نیست.