Kubernetes نسخه 1.35 یک قابلیت جدید و کاربردی برای محیط‌های SRE/DevOps و بارهای کاری AI/ML معرفی کرده: راه‌اندازی مجدد کامل و در محل (in-place) یک Pod با استفاده از عمل RestartAllContainers. این ویژگی در وضعیت آلفا قرار دارد و از طریق دروازه ویژگی RestartAllContainersOnContainerExits فعال می‌شود. 🔁

مسئله چیست؟ گاهی راه‌اندازی مجدد یک کانتینر کافی نیست و حذف و ایجاد مجدد کامل Pod بسیار پرهزینه است. مثلاً وقتی یک init container یک حجم را مقداردهی می‌کند یا فایل پیکربندی می‌سازد، و کانتینر اصلی آن وضعیت را خراب کند — راه‌اندازی مجدد فقط همان کانتینر مشکل را برطرف نمی‌کند؛ کل جریان اولیه باید دوباره اجرا شود. یا وقتی یک sidecar که مدیریت منبع راه‌دور را بر عهده دارد، خراب می‌شود ولی بازگرداندن آن به‌تنهایی مشکل اصلی را حل نمی‌کند. حذف و ری‌کرییت Pod شامل زمان‌بندی مجدد، تخصیص منابع گره، راه‌اندازی شبکه و ذخیره‌سازی است؛ در مقیاس بالا (مثلاً هزار گره) این کار می‌تواند هزینه و تاخیر زیادی ایجاد کند. ⚠️

چطور کار می‌کند؟ با استفاده از عمل RestartAllContainers، وقتی یک قاعده خروج (onExit) تطبیق برقرار کند، kubelet یک راه‌اندازی مجدد سریع و درجا برای آن Pod انجام می‌دهد. این فرایند منابع مهم Pod را حفظ می‌کند: UID Pod، آدرس IP، namespace شبکه، sandbox و دستگاه‌های متصل. سپس چرخه راه‌اندازی Pod از ابتدا (از init containers تا sidecars و containers معمولی) دوباره اجرا می‌شود و وضعیت تمیز و قابل پیش‌بینی‌ای فراهم می‌آید. به‌جز کانتینرهای ephemeral که پایان می‌یابند، بقیه کانتینرها (صرف‌نظر از سیاست راه‌اندازی مجدد فردی) مجدداً اجرا می‌شوند. ⚡

مزیت برای ML و Batch: برای jobهای آموزشی که ری‌سکجولینگ Worker Pod هزینه‌بر است، راه‌اندازی مجدد در محل می‌تواند زمان بازیابی را از چند دقیقه به چند ثانیه کاهش دهد و مصرف منابع را به‌طور قابل توجهی کم کند. به‌عنوان مثال، در کلاستری در مقیاس بزرگ، جلوگیری از حذف و مجدد ایجاد کردن هزاران Pod، می‌تواند صرفه‌جویی مالی و بهبود سرعت راه‌اندازی مجدد را به همراه داشته باشد. برای معماری‌هایی که از checkpoint استفاده می‌کنند، یک sidecar می‌تواند هنگام تشخیص خطای قابل تکرار، با خروج کردن کد مشخصی، RestartAllContainers را تحریک کند تا Worker از آخرین checkpoint ادامه دهد بدون درگیر کردن کنترلر Job. 🧠

نمونه پیکربندی (نمونه توضیحی):

apiVersion: v1
kind: Pod
metadata:
  name: ml-worker-pod
spec:
  restartPolicy: Never
  initContainers:
  - name: setup-worker
    image: my-repo/setup-worker:1.0
  containers:
  - name: watcher-sidecar
    image: my-repo/watcher:1.0
  - name: training-app
    image: my-repo/training-app:1.0
  restartPolicyRules:
  - action: RestartAllContainers
    onExit:
      exitCodes:
        operator: In
        values: [-8]

چیزهایی که باید مراقب باشید: این راه‌اندازی مجدد درجا قلاب‌های preStop را اجرا نمی‌کند؛ بنابراین کانتینرها باید بتوانند با خاتمه ناگهانی (abrupt termination) بدون تکیه به preStop به‌صورت ایمن رفتار کنند. همچنین ابزارهای مشاهده‌پذیری و مانیتورینگ باید آماده باشند که همه کانتینرهای Pod ممکن است هم‌زمان دوباره راه‌اندازی شوند تا هشدارها و متریک‌ها به‌درستی تفسیر شوند. ⚙️

شواهد عملی و وضعیت مشاهده‌پذیری: هنگام شروع RestartAllContainers، یک شرط جدید در وضعیت Pod به نام AllContainersRestarting اضافه می‌شود که در طول فرایند true می‌ماند و پس از تکمیل فرایند مجدداً false می‌شود. همچنین تعداد restartها برای هر کانتینر افزایش می‌یابد تا ابزارها و اپ‌ها بتوانند تغییر وضعیت را ببینند.

نحوه فعال‌سازی: این قابلیت در حالت آلفا از طریق دروازه ویژگی RestartAllContainersOnContainerExits فعال می‌شود؛ معمولاً باید در اجزای مربوطهٔ خوشه (kube-apiserver و kubelet) این feature gate را فعال کنید تا قابلیت در دسترس قرار گیرد. قبل از فعال‌سازی، سناریوهای خود را در محیط تست بررسی کنید تا اطمینان حاصل شود رفتار مورد انتظار و ابزارهای مانیتورینگ با این تغییر سازگارند.

این ویژگی توسط SIG Node هدایت می‌شود و برای استفاده آزمایشی و بازخورد باز است — اگر می‌خواهید مشارکت کنید یا تجربه‌تان را به اشتراک بگذارید، در کانال‌های جامعه SIG Node حضور پیدا کنید. 🙌