تغییر منابع Pod در جابهای متوقفشده Kubernetes
خلاصهٔ کاملتر
کوبرنتیس ۱.۳۶ یه قابلیت جالب رو از آلفا به بتا ارتقا داده: امکان تغییر منابع containerها در pod template جابهایی که توقف دارن (suspended Jobs). این یعنی دیگه لازم نیست برای تنظیم CPU، حافظه یا GPU یه Job، اون رو حذف و دوباره بسازی.
مشکل اصلی اینجا بود که در نسخههای قبلی، وقتی یه Job ساخته میشد، منابع تعریفشده توی pod template کاملاً غیرقابل تغییر بودن. یعنی اگه یه queue controller مثل Kueue تشخیص میداد که باید این Job با منابع کمتری اجرا بشه (مثلاً به خاطر کمبود GPU)، تنها راه این بود که Job رو کامل پاک کنه و از نو بسازه. این کار باعث از دست رفتن متادیتا، وضعیت و تاریخچه Job میشد که اصلاً جالب نبود.
حالا با این قابلیت جدید، یه queue controller میتونه Job رو در حالت suspend نگه داره، منابع رو تنظیم کنه و بعدش spec.suspend رو روی false بذاره تا با تنظیمات جدید اجرا بشه. این خیلی برای workloadهای ML و batch مفیده، چون نیاز منابعشون اغلب به cluster capacity، اولویتهای صف و دسترسی به سختافزار خاص مثل GPU بستگی داره.
یه مثال ملموس: فرض کن یه Job آموزش ML داری که ۴ تا GPU میخواد، ولی cluster فقط ۲ تا GPU آزاد داره. با این قابلیت، controller میتونه Job رو suspend نگه داره، منابع رو از ۴ GPU به ۲ GPU کاهش بده و بعد Job رو resume کنه تا با منابع جدید اجرا بشه.
از نظر فنی، API server محدودیت immutability رو فقط برای فیلدهای مشخصی از pod template در suspended Jobها برمیداره. هیچ نوع API جدیدی اضافه نشده و همون ساختارهای قبلی با validation شلتر این کار رو ممکن میکنن. فیلدهایی که میشه تغییرشون داد شامل resources.requests و resources.limits هم برای containerهای اصلی و هم initContainerها میشه.
چند شرط برای این تغییر لازمه: اول اینکه Job باید در حالت suspend باشه. دوم اینکه اگه Job قبلاً در حال اجرا بوده و بعد suspend شده، باید همه Pod های فعالش کاملاً خاموش شده باشن (یعنی status.active برابر صفر باشه). قوانین معمول validation منابع هم همچنان برقراره؛ مثلاً limits باید بزرگتر یا مساوی requests باشن.
توی نسخه ۱.۳۶ که این قابلیت به بتا رسیده، feature gate مربوطه (MutablePodResourcesForSuspendedJobs) به صورت پیشفرض فعاله و نیازی به تنظیم اضافه نداره. روی نسخه ۱.۳۵ باید این feature gate رو دستی روی kube-apiserver فعال کرد. یه نکته مهم اینه که Dynamic Resource Allocation یا همون resourceClaimTemplates هنوز immutable هستن و اگه workloadت از DRA استفاده میکنه، باید claim templateها رو جداگانه بازسازی کنی.
نکات کلیدی:
- کوبرنتیس ۱.۳۶ تغییر منابع CPU، حافظه و GPU در suspended Jobها رو به صورت پیشفرض فعال کرده
- دیگه نیازی نیست Job رو پاک و بازسازی کنی؛ تاریخچه و متادیتا حفظ میشه
- تغییر منابع فقط وقتی Job در حالت suspend و بدون Pod فعال باشه ممکنه
- برای جلوگیری از تداخل Pod، استفاده از podReplacementPolicy: Failed توصیه میشه
- resourceClaimTemplates مربوط به DRA هنوز immutable هستن و این قابلیت شاملشون نمیشه
- این قابلیت توسط SIG Apps با همکاری WG Batch توسعه داده شده




