Memory QoS در Kubernetes v1.36: حفاظت تیری از حافظه
خلاصهٔ کاملتر
کوبرنتیس ۱.۳۶ یه قدم مهم برای مدیریت حافظه برداشته. تیم SIG Node یه بهروزرسانی جدی روی قابلیت Memory QoS که هنوز در مرحلهی آلفاست ارائه داده که کار با cgroup v2 رو خیلی هوشمندتر و قابلکنترلتر میکنه.
اصل قضیه اینه که Memory QoS از memory controller توی cgroup v2 استفاده میکنه تا به kernel بگه با حافظهی containerها چطور رفتار کنه. این قابلیت از نسخهی ۱.۲۲ وجود داشته ولی توی ۱.۳۶ چند تغییر اساسی داشته که مهمترینشون اینه: حالا میشه throttling و reservation رو از هم جدا کرد.
یکی از بزرگترین مشکلات نسخههای قبلی اینه که وقتی MemoryQoS فعال میشد، بلافاصله memory.min رو برای هر containerای که memory request داشت ست میکرد. memory.min یه رزرو سخته که kernel تحت هیچ شرایطی اون حافظه رو پس نمیگیره. فکر کن یه node با ۸ گیگ RAM داری و Podهای Burstable جمعاً ۷ گیگ request کردن؛ توی نسخههای قبلی ۷ گیگ قفل میشد و node عملاً خفه میشد.
توی ۱.۳۶ یه فیلد جدید به اسم memoryReservationPolicy اضافه شده. دو حالت داره: None که پیشفرضه و فقط throttling از طریق memory.high فعاله، و TieredReservation که حفاظت تیری بر اساس QoS class رو فعال میکنه:
- Guaranteed Pods: حفاظت سخت از طریق memory.min. kernel تحت هیچ شرایطی این حافظه رو reclaim نمیکنه.
- Burstable Pods: حفاظت نرم از طریق memory.low. kernel در فشار عادی این حافظه رو حفظ میکنه ولی در فشار شدید میتونه بخشی رو پس بگیره.
- BestEffort Pods: هیچکدوم از این دو رو ندارن و حافظهشون کاملاً reclaimableه.
برای فعالسازی با حفاظت تیری، KubeletConfiguration رو اینطوری تنظیم میکنی:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
MemoryQoS: true
memoryReservationPolicy: TieredReservation
memoryThrottlingFactor: 0.9اگه فقط throttling بخوای بدون reservation، کافیه memoryReservationPolicy رو روی None بذاری یا اصلاً ننویسی:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
MemoryQoS: true
memoryReservationPolicy: Noneدو متریک جدید هم روی endpoint مربوط به /metrics در kubelet اضافه شده: kubelet_memory_qos_node_memory_min_bytes که مجموع memory.min تمام Guaranteed Podها رو نشون میده، و kubelet_memory_qos_node_memory_low_bytes که مجموع memory.low تمام Burstable Podهاست. با اینها میشه فهمید hard reservation داره به ظرفیت فیزیکی node نزدیک میشه یا نه.
یه نکتهی امنیتی هم اضافه شده: روی kernelهای قدیمیتر از ۵.۹، throttling از طریق memory.high میتونه یه باگ livelock در kernel ایجاد کنه. این باگ توی ۵.۹ فیکس شده. حالا kubelet موقع استارت نسخهی kernel رو چک میکنه و اگه پایینتر از ۵.۹ باشه یه warning لاگ میکنه. این فقط اطلاعرسانیه و feature رو بلاک نمیکنه.
برای استفاده باید Kubernetes v1.36 یا بالاتر، Linux با cgroup v2 (ترجیحاً kernel 5.9+)، و یه container runtime سازگار با cgroup v2 مثل containerd 1.6+ یا CRI-O 1.22+ داشته باشی.
نکات کلیدی:
- Memory QoS در v1.36 حالا throttling رو از reservation جدا میکنه
- فیلد جدید memoryReservationPolicy با دو حالت None و TieredReservation اضافه شده
- Guaranteed Pods از memory.min (حفاظت سخت) و Burstable Pods از memory.low (حفاظت نرم) استفاده میکنن
- BestEffort Pods هیچ حفاظت حافظهای ندارن
- دو متریک جدید برای capacity planning اضافه شده
- روی kernelهای قدیمیتر از 5.9 یه warning نشون داده میشه ولی feature کار میکنه
- این قابلیت هنوز در مرحلهی آلفاست




