Kubernetes topluluğu, Linux sistem kaynak yönetimi için kullanılan cgroup v1 desteğini aşamalı olarak sonlandırıyor. v1.35 sürümüyle birlikte varsayılan olarak cgroup v2 zorunluluğu devreye girerken, tam kaldırma işleminin v1.38'de tamamlanması planlanıyor.
Kubernetes ekosistemi, Linux çekirdeğinin temel kaynak yönetim bileşeni olan cgroup (control groups) mimarisinde büyük bir dönüm noktasına ulaşıyor. Uzun süredir sürdürülen geçiş sürecinin ardından, cgroup v1 desteği resmi olarak terk ediliyor ve modern kaynak yönetimi standartları zorunlu hale geliyor.
cgroup v1 Desteğinin Kaldırılması ve Takvim
Linux çekirdeğinde CPU ve bellek gibi sistem kaynaklarını kapsayıcılara tahsis etmek için kullanılan cgroup teknolojisinde, v2 sürümü Kubernetes v1.25'ten bu yana kararlı bir şekilde destekleniyordu. cgroup v1 ise v1.31 sürümünde bakım moduna alınmıştı. Şimdi ise bu eski sürümün tamamen sistem dışı bırakılması için adımlar hızlandırıldı.
Kubernetes v1.35 ile birlikte failCgroupV1 parametresi varsayılan olarak true değerine ayarlanıyor. Bu durum, kubelet'in cgroup v1 çalıştıran düğümlerde (node) varsayılan olarak başlatılamayacağı anlamına geliyor. Sistem yöneticileri geçici bir süre için failCgroupV1: false ayarını yapılandırma dosyasına ekleyerek bu kısıtlamayı baypas edebilse de, KEP-5573 kapsamında yürütülen çalışmalar doğrultusunda bu geri dönüş seçeneğinin Kubernetes v1.38 sürümünde tamamen kaldırılması öngörülüyor. Ayrıca kubeadm ile yönetilen kümelerde SystemVerification ön kontrol mekanizması, kubelet v1.35 ve sonrasında cgroup v1 tespiti durumunda doğrudan hata döndürecek şekilde güncellendi.
Teknik Yenilikler ve Bellek Yönetimi (Memory QoS)
cgroup v2'ye geçiş, yalnızca bir sürüm güncellemesi olmanın ötesinde daha tutarlı bir arayüz ve güçlü kaynak izolasyonu sunuyor. Örneğin, Kubernetes v1.36'da alfa aşamasında güncellenen Memory QoS özelliği, tamamen cgroup v2 bellek denetleyicisine dayanıyor. memory.high mekanizması bellek kısıtlamasını sağlarken, memory.min ve memory.low parametreleri katı ve esnek bellek koruması sunuyor. Bu koruma modeli cgroup v1 altyapısında teknik olarak desteklenmiyor.
Kapsayıcı düzeyindeki OOM (Out-Of-Memory) yönetimi de cgroup v2 düğümlerinde yeniden yapılandırıldı. Kubelet, cgroup v2 üzerinde singleProcessOOMKill değerini varsayılan olarak false tutarak memory.oom.group özelliğini etkinleştiriyor. Böylece bir OOM olayı gerçekleştiğinde, çok süreçli bir kapsayıcının yalnızca tek bir süreci sonlandırılmak yerine, ilgili kapsayıcının tüm süreçleri toplu olarak kapatılıyor. Ayrıca Pressure Stall Information (PSI) desteği, cgroup v2 gereksinimiyle birlikte düğüm, Pod ve kapsayıcı seviyesindeki CPU, bellek ve I/O darboğazlarını Summary API üzerinden doğrudan raporlayabiliyor.
Çalışma Zamanı ve Kaynak Güncellemeleri
Mimari değişiklikler OCI çalışma zamanı katmanına da yansımış durumda. cgroup v1 tarafından kullanılan cpu.shares parametresi, cgroup v2 ile birlikte cpu.weight değerine dönüştürülüyor. crun v1.23 ve runc v1.3.2 gibi güncel OCI çalışma zamanları, bu dönüşümü doğrusal olmayan gelişmiş bir formülle gerçekleştirerek küçük CPU taleplerine daha hassas bir kullanım granülaritesi kazandırıyor.
Bununla birlikte, Pod düzeyindeki kaynakların dikey olarak yerinde ölçeklendirilmesi (in-place vertical scaling) Kubernetes v1.36 ile beta aşamasında varsayılan olarak etkinleştirildi. Bu özelliğin doğru ve tutarlı bir şekilde çalışabilmesi, cgroup v2 tarafından sağlanan hassas toplu zorlama mekanizmalarına dayanıyor.
Geçiş İçin Gereksinimler
Yeni Kubernetes sürümlerine geçiş yapmadan önce sistem yöneticilerinin Linux düğümlerini cgroup v2'ye uyumlu hale getirmesi gerekiyor. Temel gereksinimler arasında Linux çekirdeğinin en az 5.8 sürümünde olması (Memory QoS için 5.9 ve üzeri önerilir), kapsayıcı çalışma zamanının cgroup v2'yi desteklemesi (örneğin otomatik sürücü keşfi için containerd v2.0 veya CRI-O v1.20+) ve hem kubelet hem de çalışma zamanı yapılandırmalarının buna göre ayarlanması yer alıyor.



