Kubernetes v1.37 Memory QoS Beta: Ne Değişti?
Kubernetes v1.37 ile Memory QoS Beta aşamasına geçti ve varsayılan olarak etkin geliyor. cgroup v2 kullanan Linux düğümlerinde kubelet artık konteyner belleğinin nasıl ele alınacağı konusunda çekirdeğe daha iyi yönlendirme yapabiliyor. Feature gate’in açık olması ise kümede kendiliğinden bellek kısıtlaması başlayacağı anlamına gelmiyor; v1.37’de değişen şey varsayılanlar, yükseltmede mevcut davranışın nasıl korunduğu ve özelliği açıp kapatan kubelet ayarları.
Memory QoS kısaca nedir?
Memory QoS Kubernetes’e ilk kez v1.22’de Alpha olarak girdi. cgroup v2 üzerindeki memory controller’ı kullanarak konteyner belleğinin çekirdek tarafından nasıl yönetileceğini etkiliyor. v1.36 sürümünde kapsamı katmanlı bellek rezervasyonuyla (tiered memory reservation) genişletilmişti. v1.37’de gelen adım ise özelliğin Beta’ya terfi etmesi ve MemoryQoS feature gate’inin varsayılan olarak açılması.
Özellik cgroup v2’nin üç ayarını yazabiliyor: kısıtlama için memory.high, koruma ve rezervasyon için memory.min ile memory.low.
v1.37’de neler değişti?
Feature gate Beta ve varsayılan açık
MemoryQoS feature gate’i v1.37’de Beta seviyesinde ve her v1.37 kubelet‘inde hiçbir yapılandırma değişikliği yapılmadan açık geliyor. Bunun güvenli olmasının nedeni, varsayılan kubelet yapılandırmasının ne bellek kısıtlamasını ne de bellek rezervasyonunu etkinleştirmesi. Siz açıkça yapılandırmadıkça cgroup’lara memory.high, memory.min veya memory.low değeri yazılmıyor.
Davranışları iki alan üzerinden devreye alıyorsunuz:
memoryThrottlingFactor: Burstable ve BestEffort konteynerlerindememory.hightabanlı kısıtlamayı etkinleştirir (örneğin0.9). Varsayılan değerinull, yani kısıtlama yok.memoryReservationPolicy:TieredReservationolarak ayarlandığındamemory.minvememory.lowüzerinden katmanlı bellek korumasını açar. VarsayılanıNone, yani rezervasyon yok.
memoryThrottlingFactor varsayılanı null oldu
Önceki Alpha sürümlerinde memoryThrottlingFactor varsayılan olarak 0.9 idi, yani feature gate’i açtığınız anda kubelet konteynerlere memory.high yazıyordu. v1.37’de varsayılan null‘a çekildi; artık siz bir değer vermedikçe memory.high ayarlanmıyor.
Değişikliğin gerekçesi doğrudan Beta terfisiyle ilgili. Gate varsayılan olarak açıldığı için otomatik bir memory.high değeri, daha önce hiç kısıtlanmadan çalışan iş yüklerini kısıtlamaya başlayabilirdi. null varsayılanı sayesinde v1.37’ye yükseltmek mevcut kümelerde çalışma zamanı davranışını değiştirmiyor.
Yükseltme senaryosunu iki durumda düşünmek gerekiyor:
kubeletyapılandırma dosyanızda açıkça birmemoryThrottlingFactordeğeri varsa, bu değer yükseltmede korunur ve kısıtlama önceki gibi çalışır.- Yapılandırmanızda bu alan yoksa,
kubeletyeninullvarsayılanını kullanır vememory.highyazmayı bırakır. Kısıtlamanın sürmesini istiyorsanız alanı açıkça eklemeniz gerekir:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9
v1.37’de MemoryQoS nasıl yapılandırılır?
Yalnızca bellek kısıtlaması
memoryThrottlingFactor değerini 0 ile 1 arasında bir değere ayarlayın. kubelet bu faktörü kullanarak Burstable ve BestEffort konteynerleri için memory.high değerini hesaplar. Her QoS sınıfı için memory.high‘ın nasıl hesaplandığı, Kubernetes dokümantasyonundaki Memory QoS bölümünde ayrıntılı anlatılıyor.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9
Kısıtlama ve katmanlı rezervasyon birlikte
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9
memoryReservationPolicy: TieredReservation
Kısıtlama olmadan yalnızca katmanlı rezervasyon
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryReservationPolicy: TieredReservation
Memory QoS’u tamamen kapatmak
Yükseltmeden sonra özelliği devre dışı bırakmak istiyorsanız feature gate’i false yapmanız ve yapılandırmanın buna uyumlu olduğundan emin olmanız gerekiyor. kubelet, memoryThrottlingFactor eski varsayılan olan 0.9 dışında bir değere ayarlanmışsa ya da memoryReservationPolicy TieredReservation ise yapılandırmayı reddeder. Bu alanları daha önce ayarladıysanız kaldırmanız veya düzeltmeniz gerekir.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
MemoryQoS: false
Feature gate kapalıyken ya da memoryReservationPolicy TieredReservation değilken kubelet, cgroup v2 düğümlerinde başlangıçta eski koruma değerlerini sıfırlıyor: kök kubepods cgroup’unda memory.min=0 ve memory.low=0, Burstable QoS cgroup’unda ise memory.low=0 ayarlanır. Konteyner tarafında artık geçerli olmayan memory.high değerleri de yeniden başlatma veya resize gibi mutabakat (reconciliation) yollarında max değerine döner.
Bilinen sınırlama: rezervasyon düğüm genelinde uygulanıyor
memoryReservationPolicy ayarı düğüm üzerindeki her pod için geçerli. TieredReservation seçildiğinde her Guaranteed pod memory.min, her Burstable pod ise memory.low alır; tek tek podları bu davranışın dışında veya içinde tutmanın bir yolu yok. Katı rezervasyona ihtiyaç duyan iş yükleriyle belleği geri alınabilir (reclaimable) kalması gereken iş yüklerini aynı düğümde karıştırıyorsanız, hepsi için tek bir politikaya karar vermek zorundasınız.
İkinci nokta katı rezervasyonun kapsamı. Konteynerin cgroup’una yazılan her şeyi, page cache dahil, kapsıyor. Büyük dosyalar okuyan bir pod bu yüzden, çekirdeğin normalde komşu iş yüklerine hizmet etmek üzere geri alacağı belleği tutabilir.
SIG Node her iki konuyu da kubernetes/kubernetes#140246 numaralı issue üzerinden takip ediyor. Bu sınırlamalar sizi etkiliyorsa iş yükünüzü anlatmak için en doğru yer o issue.
Sırada ne var?
Memory QoS için bir sonraki hedef GA’ya terfi. Beta kullanıcılarından gelen geri bildirimler, bu adımdan önce yapılacak düzenlemeleri şekillendirecek. Sorunla karşılaşırsanız hataları kubernetes/kubernetes issue takipçisine bildirebilirsiniz.
Özelliği SIG Node yürütüyor. Katkıda bulunmak veya geri bildirim vermek isteyenler için Slack’te #sig-node kanalı, e-posta listesi ve düzenli SIG Node toplantıları var.
Operatörler için özet
- v1.37’ye yükseldiğinizde
MemoryQoSgate’i açık gelir, ama varsayılan yapılandırma hiçbir cgroup değeri yazmaz. - Kısıtlama istiyorsanız
memoryThrottlingFactoralanını açıkça yazmalısınız; örtük0.9varsayılanı kalktı. - Katmanlı koruma için
memoryReservationPolicy: TieredReservationgerekir ve bu ayar düğümdeki tüm podları etkiler. - Özelliği kapatırken çakışan alanları yapılandırmadan temizlemezseniz
kubeletyapılandırmayı reddeder. - Bunların hepsi cgroup v2 kullanan Linux düğümleri için geçerli.
Kaynaklar ve İleri Okuma
- Kubernetes v1.37: Memory QoS Graduates to Beta (orijinal duyuru)
- KEP-2570: Memory QoS
- Pod Quality of Service Classes
- Managing Resources for Containers
- Kubernetes cgroups v2 desteği
- Linux kernel cgroup v2 dokümantasyonu
- SIG Node topluluk sayfası
- Kubernetes v1.36 Memory QoS: Katmanlı Bellek Koruması
- Kubernetes v1.36 Pod-Level In-Place Resize







Yorum gönder