Kubernetes Kaynak Limitlerinde Yaygın Yanlış Kanılar

Çoklu Ortam Farklılıklarının Yönetimi



Kubernetes kümelerinde kaynak limitleri her pod için işlemci tüketimini kontrol altında tutan temel bir mekanizmadır. Bu yapılandırmalar sayesinde bir uygulama cluster içindeki diğer uygulamaları etkilemeden hizmet verebilir. Operasyon ekibi bu değerleri doğru tanımladığında atıl kaynaklar önlenir ve küme kararlılığı artar. Limit tanımlanmayan pod node üzerindeki tüm serbest kaynakları tüketebilir, bu da diğer iş yüklerinde performans düşüşüne yol açabilir. Kurumsal ortamlarda limitler zorunlu kabul edilir. Doğru yapılandırma için önce uygulamanın normal ve maksimum yük profili analiz edilmeli. Bu analiz metrik araçlarıyla yapıldığında sonuçlar daha tutarlı olur. Ayrıca namespace düzeyinde ResourceQuota ve sınır aralığı nesneleriyle genel değerler belirlenebilir. Böylece ekipler kendilerine ait iş yükleri için tutarlı sınırlarla çalışır. Sonuç olarak limit yönetimi, kapasite kontrolü ile güvenilirliği birlikte sağlayan sürekli bir çalışmadır.


Kubernetes'te istek değerleri ile limit değerleri arasındaki ayrım kaynak dağıtımının temelini oluşturur. İstekler, zamanlayıcının (scheduler) bir pod için rezerve ettiği minimum kaynak miktarıdır. Scheduler, düğüm seçerken bu değerlere bakar ve yalnızca yeterli serbest kapasiteye sahip node'lara yerleştirme yapar. Limits ise bir pod'un aşamayacağı üst sınırı belirler. İşlemci için bu sınır aşıldığında süreç yavaşlatılır, ancak kapatılmaz. Bellek için ise limit aşıldığında süreç OOMKilled durumuna düşerek öldürülür. İstekler ile limits aynı miktara eşitlendiğinde konteyner Guaranteed hizmet kalitesi sınıfına dahil olur. Farklı değerler tanımlandığında patlayabilir sınıf oluşur. Hiçbir sınır tanımlanmadığında en iyi çaba sınıfı geçerli olur ve bu pod kaynak baskısında ilk tahliye adayı olur. Bu nedenle hangi tür sınıfın seçileceğine iş yükünün önceliğine göre karar verilmeli. Önemli veritabanları için Guaranteed sınıf, toplu işler için esnek sınıf uygun olabilir. Her iki miktarın da anlaşılması kapasite ve performans dengesini sağlıklı kurmak için şarttır.


CPU limitlerinin ayarlanması servisin davranışına göre yapılmalıdır. İşlemci birimi milicpu cinsinden ifade edilir ve 1000m değeri tek bir core'a karşılık gelir. İlk olarak uygulamanın boşta ve yoğun yük altındaki CPU kullanımı ölçülmeli. Prometheus gibi araçlarla alınan metrikler p99 yüzdelik değerleri üzerinden yorumlanır. Sınır değeri çoğunlukla bu zirve tüketimin biraz üzerinde tutulur. Aşırı kısıtlayıcı bir limit gecikmelere ve bekleme sürelerinin uzamasına neden olur. Gereksiz geniş bir limit ise küme kapasitesinin boşa kullanılmasına yol açar. Birçok ekip CPU limitini tamamen kaldırıp yalnızca istek değerine dayanır. Bu yaklaşım boş kapasite kullanımı sağlasa da diğer iş yüklerinde sorunlu etkilere yol açabilir. Test ortamlarında farklı limit değerleri denenerek ideal nokta bulunmalıdır. Bu aşamada üretime yakın trafik örnekleri kullanıldığında sonuçlar önemli ölçüde değerli olur. Son olarak limitler, uygulama sürümleri güncellendikçe tekrar değerlendirilmelidir.


Bellek limitlerinin hesaplanması CPU'ya kıyasla daha kritik bir süreçtir, çünkü bellek sıkıştırma yapılamaz bir kaynaktır. Sınır aşıldığında kernel OOM Killer devreye girer ve süreci öldürür. Dolayısıyla bellek limiti güvenli ama gerçekçi belirlenmelidir. Hesaplamaya başlamadan önce uygulamanın yığın ve stack kullanımı ayrıntılı analiz edilmelidir. JVM tabanlı uygulamalarda heap boyutu ile pod'un toplam RAM'i arasında dengeli bir boşluk bırakılmalıdır. Node ve Python uygulamalarında RAM sızıntıları uzun süre çalıştıkça limit aşımına yol açabilir. Bu sebeple sürekli izleme ile kullanım grafiği takip edilmelidir. Küme içinde çalışma kümesi bellek metriği örneğin metrikler, gerçek kullanımı isabetli yansıtır. Sınır değeri çoğunlukla zirve kullanımın yüzde on beş fazlasında tutulur. Ancak gereğinden fazla büyük limitler node belleğinin boşa edilmesine yol açar. Üretim koşulları değiştikçe hesaplamanın tekrar yapılması önerilir.


Kaynak isteklerinin isabetli ayarlanması, cluster planlamasının sağlıklı çalışması için kritik öneme sahiptir. İstek değeri gereğinden az girildiğinde scheduler pod'u fazla dolu düğümlere yerleştirir, bu da kararlılık sorunlarına neden olur. Çok yüksek tanımlandığında ise düğümler fiilen kullanılmadığı halde bile kapasitesi tükenmiş gözükür. Bu durum küme verimliliğini düşürür ve gereksiz bulut maliyeti oluşturur. Doğru bir ilk değer için geçmiş metrikler incelenmeli ve ortalama kullanım seviyesine yakın bir istek tanımlanmalıdır. Dikey pod ölçekleyici örneğin araçlar öneri sunabilir ve bu öneriler başlangıç yapılandırma için değerlendirilebilir. Horizontal Pod Autoscaler ile birlikte kullanılırken çatışmalara dikkat edilmelidir. Bunun yanında ad alanı seviyesinde LimitRange tanımlandığında unutulmuş istekler kendiliğinden doldurulabilir. Düzenli gözden geçirme ile değerler uygulama değişimlerine uyumlu güncel tutulmalıdır.


Kubernetes kümelerinde kaynak limitlerini doğru belirlemek için öncelikle QoS sınıflarını derinlemesine anlamak gerekir. Bir pod Burstable sınıfına, tanımlanan request ve limit değerlerine göre atanır. Pod içindeki her container için request ve limit eşit tanımlanırsa pod Guaranteed kabul edilir ve bellek baskısı altında en son sonlandırılan grup olur. Yalnızca request tanımlanmış veya request ile limit farklı olan pod'lar Burstable sınıfına girer ve kaynak fazlasını kullanabilir. Hiçbir request veya limit belirtilmeyen pod'lar en düşük öncelikli sınıfa düşer ve node üzerinde kaynak sıkıştığında ilk tahliye edilen adaylar arasında yer alır. Bu ayrım, kritik servisleri korumak için temel bir araçtır. Doğru sınıflandırma yapıldığında, yoğun yük altında bile önemli uygulamaların kesintisiz çalışması sağlanabilir. Üretim ortamında her iş yükünün önem derecesine göre QoS sınıfı bilinçli biçimde seçilmelidir. Aksi halde beklenmeyen tahliyeler ve performans düşüşleri sık rastlanan hale gelir. Ekipler bu sınıfları, ilgili manifestolarda açıkça tanımlayarak tutarlı bir davranış elde edebilir. Ayrıca node kapasitesinin bu sınıfların toplam talebini karşılayacak şekilde planlanması gerekir. Son olarak, QoS kararlarının izlenmesi için metrikler ve uyarılar kurulmalı ve düzenli gözden geçirilmelidir.


LimitRange nesnesi, bir namespace içindeki container ve pod'lar için varsayılan request ve limit değerlerini tanımlamanın etkili bir yoludur. Geliştiriciler manifestolarında kaynak belirtmeyi atladığında bile, LimitRange devreye girerek her container'a makul değerler atar. Böylece BestEffort sınıfında kalan pod sayısı minimize edilebilir. Bu nesne ile minimum ve maksimum sınırlar da zorunlu kılınabilir. Örneğin bir container'ın belleği belirli bir üst sınırı aşarsa, API sunucusu isteği engeller. Bu yaklaşım, aşırı kaynak tahsisini sınırlar ve küme genelinde adil dağılım sağlar. LimitRange, request ile limit oranını da kısıtlayabilir ve böylece aşırı taahhüt sorununu azaltır. Varsayılan değerler seçilirken uygulamaların tipik kullanım profilleri göz önünde bulundurulmalıdır. Çok düşük değerler sık OOMKill olaylarına, çok yüksek değerler ise kaynak israfına yol açar. Bu nedenle ekipler, LimitRange değerlerini periyodik olarak güncellemeli ve uygulamaların gerçek davranışıyla karşılaştırmalıdır. Ayrıca farklı ortamlar için, örneğin geliştirme ve üretim namespace'leri için, ayrı LimitRange tanımları hazırlanabilir. Bu esneklik, kaynak yönetimini hem kolaylaştırır hem de tutarlılığı destekler.


ResourceQuota, bir namespace'in tüketebileceği toplam kaynak miktarını sınırlandırarak çok kiracılı kümelerde adaletli bir paylaşım sağlar. Bu nesne ile CPU ve bellek toplamları, depolama talepleri ve hatta pod, service veya secret gibi nesne sayıları kısıtlanabilir. Bir namespace kotası dolduğunda, yeni kaynak talepleri API sunucusu tarafından geri çevrilir. Bu mekanizma, bir ekibin tüm kümeyi ele geçirmesini engeller. ResourceQuota kullanırken, quota kapsamındaki her pod'un request ve limit değerlerini açıkça belirtmesi gerekir, aksi halde talep reddedilir. Bu nedenle LimitRange ile birlikte kullanmak çoğu zaman en iyi yaklaşımdır. Kota değerleri belirlenirken geçmiş tüketim verileri ve büyüme tahminleri temel alınmalıdır. Fazla sıkı kotalar dağıtımları engelleyebilir, fazla gevşek kotalar ise amacını yitirir. Ayrıca kota kullanım oranlarının düzenli izlenmesi, sorunların erken tespit edilmesini sağlar. Kurumsal ortamlarda her ekibin kotası, iş birimi bütçesiyle uyumlu ayarlanabilir.


Vertical Pod Autoscaler, pod'ların geçmiş kullanım verilerine dayanarak request ve limit değerlerini kendiliğinden önermesini veya uygulamasını sağlayan bir bileşendir. VPA, öneri modunda çalıştığında yalnızca tavsiyeler üretir ve bunları kayıt altına alır, böylece ekipler değişiklikleri kendi onaylarına göre uygulayabilir. Auto moduna geçildiğinde ise VPA, pod'ları yeniden oluşturarak değerleri otomatik olarak günceller. Bu yaklaşım, manuel ayarlama yükünü önemli ölçüde azaltır. Ancak pod yeniden başlatmalarının kesinti yaratabileceği unutulmamalıdır. Bu nedenle kritik iş yüklerinde önce öneri modu ile test yapılması önerilir. VPA ile Horizontal Pod Autoscaler birlikte kullanılacaksa, aynı metrik üzerinde çakışma olmamasına özen gösterilmelidir. VPA önerilerinin, uygulamanın ölçeklenme davranışı ile uyumlu olup olmadığı değerlendirilmelidir. Öneri değerlerinin minimum ve maksimum sınırlarını belirlemek, aşırı sapmaları engeller. Düzenli olarak önerileri inceleyen bir süreç kurmak, uzun vadede en verimli sonuçları getirir.


Gerçek kullanım verisine dayalı kaynak ayarı, tahminlere değil ölçümlere dayanan en güvenilir yöntemdir. Prometheus gibi araçlarla toplanan CPU ve bellek metrikleri, uygulamanın fiili profilini ortaya koyar. Bu veriler, belirli bir zaman aralığında yüzdelik değerler, özellikle p95 ve p99, olarak analiz edildiğinde isabetli sonuçlar verir. Request değeri genellikle ortalama kullanıma yakın, limit değeri ise tepe yüklere uygun seçilmelidir. Bellek limitlerinin, CPU limitlerine göre daha dikkatli belirlenmesi gerekir, çünkü bellek aşımı OOMKill ile sonuçlanır. CPU limitlerinin ise bazı durumlarda gereksiz gecikmelere yol açabileceği tartışılmaktadır. Bu nedenle her iş yükü için ayrı bir değerlendirme yapılmalıdır. Ölçüm süreci, farklı trafik dönemlerini, örneğin kampanya veya ay sonu yoğunluğunu, kapsayacak şekilde uzatılmalıdır. Elde edilen değerler, deployment sonrası davranışla karşılaştırılarak doğrulanmalıdır. Sürekli iyileştirme döngüsü kurulduğunda, kaynak kullanımı hem performans hem de güvenilirlik açısından dengeli hale gelir.


K8s kaynak sınırları nasıl ayarlanır


Kubernetes cluster ortamlarında kaynak limitlerini isabetli tanımlamak performans noktasında büyük bir öneme sahip rol sağlar. Requests ile sınırlar ayarları arasındaki farklılık iyi kavranmadan tasarlanan tanımlamalar sorunlara yol açabilir. Scheduler modülü requests değerlerine göre iş yükü konumlandırması sağlar. Sınırlar ancak çalışma anında geçerli olur. Başlangıç biçiminde her bir konteyner adına izlenmiş veriler belirlemek, Prometheus ör. yöntemlerle anlık kullanım bilgilerini değerlendirmek oldukça doğru adımdır.


Sıkça karşılaşılan pürüzler nelerdir


Kaynak meselesinde en karşılaşılan aksaklıklardan ilk sırada sınırların hiç ayarlanmamasıdır. Bu durumda bir tür kümede tek kapsül tüm düğüm kaynağını ele geçirebilir ile öteki servisleri etkileyebilir. Bir diğer sık yanlış buna karşın istek rakamlarını gerektiğinden alt seçmektir. Bu durumda senaryoda iş yükü makineye aşırı sığdırılır, bunun sonucunda işlemci baskısı ile kapanma hatalarına yol doğurur. Diğer sorun ise tüm servislere standart sınırları tanımlamaktır. Her uygulamanın kendine özgü kaynak ihtiyacı özelliği olduğunu unutulmamalıdır.


Profesyonel öneriler ile kaynak yönetimi ayarı

Deneyimli mühendisler çoğu zaman kaynak hususunda bu metodu tercih eder: Önce iş yükü testleri yapılır sonrasında alınan ölçümler ölçüsünde istek miktarları tipik kullanımın hafifçe yukarısına ayarlanır. Sınırlar tanımları fakat yoğun talebi yeterli olacak ölçüde tanımlanmalıdır. CPU bakımından limit belirlemek ara sıra yersiz darboğazlara neden açtığından özenli davranılmalıdır. Otomatik dikey ölçekleyici ve Horizontal Pod Autoscaler benzeri araçlar bununla birlikte bu aşamada ayarların ilerleyen dönemde dengeli hale ulaşmasında yararlı sonuç verir.


Kota harcaması hem de gider yönetimi


Kubernetes altyapısında kota belirlemeleri doğrudan doğruya sanal harcamasına etki eder. Olması gerekenden büyük sınır tanımlanmış bir çeşit ortam atıl yatan boş alana harcama ödenmesine yol açar. Bu sorun sebeple yönetim gider hedeflerini belirgin biçimde belirlemeli ve kota tercihlerini bu hedeflerle örtüşen hale dönüştürmelidir. Masraf kontrol çözümleri birlikte ad alanı düzeyinde analiz uygulamak bunun yanında hangi uygulama iş yükünün ne kaynak harcadığını görmeyi sağlar.


Mevsimsel iş yükü hem de takvim yaklaşımları


Pek çok kurumsal sistem takvim içinde değişken bir çeşit trafik eğilimine bağlıdır. Kampanya dönemleri, faturalama dönemleri ya da geçici organizasyonlar esnasında yük projeksiyonları öncesinden değerlendirilmelidir. Söz konusu aralıklar adına sabit sınırlar yerine zamanlanmış küçültme stratejileri kullanmak bütçeyi dikkat çekici ölçüde düşürebilir. Takvim tabanlı görevleri ve eşdeğer sistemler üzerinden sabah erken dönemlerinde düşük kaynağa geçiş yapmak ayrıca ek olarak performans ve bütçe noktasında faydalı kazanımlar sağlayabilir.


Sıkça yöneltilen soru-cevap ile çözümleri

K8s kaynak limiti konusunda başlıca sorgulama duyulan konulardan biri istek ile limits tanımlarının tek tutulup seçilmeyeceğidir. Böyle bir tercih Guaranteed hizmet düzeyi düzeyini verir, yalnız kapasite uyumluluğunu ciddi oranda daraltabilir. Başka bir öteki merak ayrıca sınır kotaya dayanıldığında hangi gerçekleştiğidir. Hafıza sınırı dolduğunda servis genellikle OOMKilled hâline geçer, CPU limiti dolduğunda ancak servis kısılır fakat sıklıkla sonlandırılmaz. Böylece bu yüzden RAM kotalarının titizlikle tanımlanması zorunludur.

Ilginc bir yaklasim. Bunu deneyecegim kesinlikle.
Kubernetes Kaynak Limitlerinde Yaygın Yanlış ile ilgili anlasilir bir not olmus, eline saglik.
Baya guzel bir konu, tebrikler.
Kubernetes Kaynak Limitlerinde Yaygın Yanlış konusundaki bu pozitif yaklasim cok hosuma gitti.
Konuya hakim biri yazmis. Herkese tavsiye ederim.
Tesekkurler, bilgilendirici bir tecrube.
Kubernetes Kaynak Limitlerinde Yaygın Yanlış ile ilgili kaliteli bir calisma olmus, eline saglik.
Bu konuda daha once hic bu kadar super bir konu okumamistim.

Forumdan Konular