Kubernetes v1.37 Memory QoS Beta: Ne Değişti?

Kubernetes v1.37’de Memory QoS Beta’ya geçti ve feature gate varsayılan olarak açık geliyor. Ancak kubelet, yapılandırmada değer vermedikçe cgroup’lara memory.high/min/low yazmıyor; davranış yükseltmede korunuyor.

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 konteynerlerinde memory.high tabanlı kısıtlamayı etkinleştirir (örneğin 0.9). Varsayılan değeri null, yani kısıtlama yok.
  • memoryReservationPolicy: TieredReservation olarak ayarlandığında memory.min ve memory.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:

  • kubelet yapılandırma dosyanızda açıkça bir memoryThrottlingFactor değeri varsa, bu değer yükseltmede korunur ve kısıtlama önceki gibi çalışır.
  • Yapılandırmanızda bu alan yoksa, kubelet yeni null varsayılanını kullanır ve memory.high yazmayı 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 MemoryQoS gate’i açık gelir, ama varsayılan yapılandırma hiçbir cgroup değeri yazmaz.
  • Kısıtlama istiyorsanız memoryThrottlingFactor alanını açıkça yazmalısınız; örtük 0.9 varsayılanı kalktı.
  • Katmanlı koruma için memoryReservationPolicy: TieredReservation gerekir ve bu ayar düğümdeki tüm podları etkiler.
  • Özelliği kapatırken çakışan alanları yapılandırmadan temizlemezseniz kubelet yapılandırmayı reddeder.
  • Bunların hepsi cgroup v2 kullanan Linux düğümleri için geçerli.

Kaynaklar ve İleri Okuma

Bu yazı yapay zeka (büyük dil modelleri) ile hazırlanmış, insan editör tarafından incelenmiştir. İçerik üretim sürecimiz.
Aşkın KILIÇ

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için YouTube ve GitHub hesaplarımı takip edin.

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

4 Yorum

  1. Feature gate açık gelse de kubelet’in kendi kendine cgroup değerlerini yazmaması iyi düşünülmüş, upgrade sonrası sürpriz yaşamak istemeyiz. Peki memory.high için önerdiğiniz bir throttling factor değeri var mı, prod’da denemeden önce merak ettim.

  2. Feature gate’in açık gelip de default davranışın değişmemesi iyi düşünülmüş, upgrade sonrası sürpriz yaşamak istemezdik açıkçası. Peki memory.high değerini production’da açmayı deneyen var mı, throttling tarafında nasıl davranıyor merak ettim.

  3. Feature gate açık gelip de kubelet’in cgroup’lara bir şey yazmaması iyi düşünülmüş, yükseltme sırasında sürpriz OOM davranışları yaşamak istemezdik. Peki memory.high değerini production’da denemek için önerdiğiniz bir başlangıç oranı var mı, yoksa workload’a göre mi ayarlamak lazım?

  4. Feature gate açık gelmesine rağmen kubelet’in varsayılan olarak cgroup’lara yazmaması iyi düşünülmüş, yükseltme sırasında sürpriz yaşamak istemezdik açıkçası. Bizim clusterda memory.high değerini ayarlamayı deneyeceğim, throttling davranışı nasıl olacak merak ediyorum. Bu arada şu yazınız da işime yaramıştı: Microsoft

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

✉

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Kategoriler
Ara
Paylaş
WhatsApp
İçindekiler
← GitHub Advanced Security Zorun...
AI Kod Yazmayı Değiştirdi: Öğr... →
📩

Gitmeden önce!

Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

📬 Haftalık bülten: Teknoloji + AI haberleri
Beni Takip Et Yeni Azure / AI / DevOps yazılarını GitHub ve RSS üzerinden takip edin.