Çoklu Ortam Farklılıklarının Yönetimi
Kubernetes kümelerinde kaynak limitleri her iş yükü için işlemci tüketimini kontrol altında tutan önemli bir mekanizmadır. Bu ayarlar sayesinde bir uygulama cluster içindeki diğer uygulamaları etkilemeden çalışabilir. Sistem yöneticisi bu değerleri doğru tanımladığında kaynak israfı önlenir ve küme kararlılığı güçlenir. Limit tanımlanmayan pod node üzerindeki tüm boş kaynakları kullanabilir, bu da komşu iş yüklerinde gecikmelere yol açabilir. Üretim ortamlarda limitler olmazsa olmaz kabul edilir. Doğru yapılandırma için önce uygulamanın ortalama ve tepe yük profili çıkarılmalıdır. Bu analiz ölçüm araçlarıyla sağlandığında sonuçlar çok daha güvenilir olur. Ayrıca namespace düzeyinde ResourceQuota ve LimitRange nesneleriyle genel değerler atanabilir. Böylece ekipler kendi iş yükleri için tutarlı sınırlarla çalışır. Sonuç olarak limit yönetimi, kapasite kontrolü ile kararlılığı birlikte destekleyen sürekli bir uygulamadır.
Kubernetes'te requests ile limits arasındaki ayrım kaynak planlamasının temelini oluşturur. İstekler, zamanlayıcının (scheduler) bir konteyner için ayırdığı minimum kaynak miktarıdır. Scheduler, düğüm seçerken bu değerlere bakar ve yalnızca yeterli boş kapasiteye sahip düğümlere yerleştirme yapar. Limits ise bir konteynerin geçemeyeceği üst sınırı belirler. CPU için bu sınır aşıldığında süreç throttle edilir, ancak kapatılmaz. Bellek için ise limit aşıldığında konteyner OOMKilled durumuna düşerek öldürülür. İstekler ile limits aynı değere eşitlendiğinde konteyner Guaranteed hizmet kalitesi sınıfına dahil olur. Farklı miktarlar tanımlandığında Burstable sınıf oluşur. Hiçbir değer tanımlanmadığında en iyi çaba sınıfı geçerli olur ve bu pod kaynak baskısında ilk tahliye adayı olur. Dolayısıyla hangi tür sınıfın kullanılacağına iş yükünün kritikliğine göre karar verilmeli. Önemli veritabanları için garantili sınıf, batch işler için esnek sınıf tercih edilebilir. Her iki miktarın da anlaşılması maliyet ve verim dengesini sağlıklı kurmak için şarttır.
CPU limitlerinin tanımlanması servisin davranışına bağlı olarak gerçekleştirilmelidir. İşlemci birimi milicpu cinsinden ifade edilir ve 1000m değeri tek bir core'a karşılık gelir. Öncelikle uygulamanın boşta ve yoğun trafik altındaki CPU kullanımı kaydedilmelidir. Prometheus gibi araçlarla alınan metrikler p99 yüzdelik değerleri üzerinden yorumlanır. Sınır değeri genellikle bu zirve kullanımın biraz üzerinde tutulur. Aşırı kısıtlayıcı bir limit yavaşlamaya ve bekleme sürelerinin artmasına neden olur. Gereksiz geniş bir limit ise küme kapasitesinin verimsiz kullanılmasına yol açar. Birçok ekip CPU limitini hiç kaldırıp yalnızca requests değerine güvenir. Bu yaklaşım boş kapasite kullanımı sağlasa da diğer iş yüklerinde gürültülü etkilere yol açabilir. Test ortamlarında çeşitli limit seviyeleri denenerek ideal nokta bulunmalıdır. Bu aşamada üretime yakın trafik örnekleri kullanıldığında sonuçlar önemli ölçüde anlamlı olur. Son olarak limitler, uygulama sürümleri değiştikçe tekrar değerlendirilmelidir.
Bellek limitlerinin hesaplanması CPU'ya göre daha kritik bir konudur, çünkü bellek sıkıştırma yapılamaz bir kaynaktır. Sınır aşıldığında kernel OOM Killer devreye girer ve konteyneri öldürür. Bu nedenle bellek limiti güvenli ama isabetli ayarlanmalıdır. Hesaba başlamadan önce uygulamanın yığın ve yığın bellek kullanımı ayrıntılı incelenmelidir. Java tabanlı servislerde heap boyutu ile konteynerin toplam RAM'i arasında makul bir pay bırakılmalıdır. Node.js ve Python uygulamalarında RAM sızıntıları uzun süre çalıştıkça limit ihlaline yol açabilir. Bu yüzden uzun süreli izleme ile kullanım grafiği takip edilmelidir. Kubernetes içinde container_memory_working_set_bytes örneğin metrikler, fiili kullanımı doğru gösterir. Sınır değeri genellikle zirve tüketimin yüzde on beş fazlasında tutulur. Fakat aşırı büyük limitler düğüm belleğinin boşa edilmesine neden olur. Ortam değişkenleri farklılaştıkça hesaplamanın yeniden yapılması önerilir.
Kaynak isteklerinin doğru ayarlanması, küme zamanlamasının sağlıklı çalışması için kritik öneme sahiptir. Requests değeri çok düşük tanımlandığında zamanlayıcı pod'u fazla yoğun düğümlere atar, bu da kararlılık sorunlarına neden olur. Gereğinden fazla tanımlandığında ise düğümler fiilen kullanılmadığı halde bile kapasitesi tükenmiş gözükür. Bu olgu küme verimliliğini azaltır ve gereksiz bulut maliyeti doğurur. Doğru bir başlangıç için tarihsel metrikler değerlendirilmeli ve ortalama kullanım değerine yakınsak bir istek belirlenmelidir. Dikey pod ölçekleyici örneğin araçlar öneri sunabilir ve bu tavsiyeler ilk ayar için değerlendirilebilir. Horizontal Pod Autoscaler ile beraber kullanılırken çatışmalara dikkat gösterilmelidir. Ayrıca namespace seviyesinde sınır aralığı tanımlandığında eksik istekler kendiliğinden doldurulabilir. Periyodik değerlendirme ile ayarlar iş yükü 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 BestEffort 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 esnek 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 kaçınılmaz hale gelir. Ekipler bu sınıfları, ilgili manifestolarda açıkça tanımlayarak öngörülebilir bir davranış elde edebilir. Ayrıca node kapasitesinin bu sınıfların toplam talebini kaldırabilecek şekilde planlanması gerekir. Son olarak, QoS kararlarının izlenmesi için metrikler ve uyarılar yapılandırılmalı ve düzenli gözden geçirilmelidir.
LimitRange nesnesi, bir namespace içindeki container ve pod'lar için öntanımlı 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 önler 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 riskini azaltır. Varsayılan değerler seçilirken uygulamaların tipik kullanım profilleri dikkate alınmalıdır. Çok düşük değerler sık OOMKill olaylarına, çok yüksek değerler ise kaynak israfına neden olur. Bu nedenle ekipler, LimitRange değerlerini periyodik olarak gözden geçirmeli 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 sadeleştirir 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 dengeli bir paylaşım sağlar. Bu nesne ile CPU ve bellek toplamları, depolama talepleri ve hatta pod, service veya secret gibi nesne sayıları sınırlanabilir. 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 ideal yaklaşımdır. Kota değerleri belirlenirken geçmiş tüketim verileri ve büyüme tahminleri esas 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 hale getirilebilir.
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 doğrudan 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 dikkat edilmelidir. 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ı önler. Düzenli olarak önerileri inceleyen bir süreç kurmak, uzun vadede en sağlıklı 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 gerçek profilini ortaya koyar. Bu veriler, belirli bir zaman aralığında yüzdelik değerler, özellikle p95 ve p99, olarak analiz edildiğinde anlamlı 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 neden olabileceğ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 biçimde uzatılmalıdır. Elde edilen değerler, deployment sonrası davranışla karşılaştırılarak teyit edilmelidir. Sürekli iyileştirme döngüsü kurulduğunda, kaynak kullanımı hem performans hem de güvenilirlik açısından optimize hale gelir.
Kubernetes CPU ve bellek sınırları hangi yöntemlerle belirlenir
K8s cluster ortamlarında kaynak limitlerini akılcı ayarlamak sistem sağlığı noktasında büyük bir rol taşır. İstekler ve limits kavramları arasında ayrışma tam kavranmadan yapılan ayarlar kesintiye neden açabilir. Zamanlayıcı bileşeni istek rakamlarına dayanarak iş yükü konumlandırması gerçekleştirir. Limits oysa çalışma sürecinde devreye girer. Başlangıç anlamında her bir konteyner açısından ölçülmüş veriler saptamak, kubectl top gibi yöntemlerle gerçek yük bilgilerini incelemek en sağlıklı stratejidir.
Sık yapılan pürüzler nelerdir
Kaynak hususunda başlıca ortaya çıkan hatalardan ilk sırada tanımların asla yapılmamasıdır. Bu şekilde bir tür ortamda tek iş yükü kalan node kapasitesini kullanabilir ve komşu servisleri olumsuz etkileyebilir. Öteki yaygın sorun ise requests tanımlarını gerektiğinden az tutmaktır. Bu ortamda iş yükü node'a çok atanır, bu da bellek tıkanıklığı ile sonlandırma hatalarına neden yol açabilir. Üçüncü yanlış öte yandan tüm uygulamalara tek tip sınırları atamak. Bütün iş yükünün farklı kaynak profili bulunduğu dikkate alınmalıdır.
Tecrübeli öneriler birlikte kaynak iyileştirmesi
Uzman operatörler sıklıkla kaynak konusunda bu yaklaşımı uygular: Öncelikle trafik testleri uygulanır ile toplanan veriler temelinde requests miktarları ortalama talebin bir miktar üzerine yerleştirilir. Sınırlar değerleri oysa pik tüketimi destekleyecek biçimde tanımlanmalıdır. CPU adına limit koymak zaman zaman fazla darboğazlara yol doğurabildiğinden dikkatli davranılmalıdır. Vertical Pod Autoscaler birlikte Yatay ölçekleme aracı ör. bileşenler da bu sürecte değerlerin ilerleyen dönemde ayarlanmış konuma ulaşmasında faydalı olur.
Kota gideri ile maliyet kontrolü
K8s altyapısında kaynak limiti yapılandırmaları doğrudan dijital harcamasına yansır. Aşırı büyük kaynak belirlenmiş bir tür cluster boşta duran kullanılmayan güce harcama yapılmasına sebep getirir. Bu bu yüzden takım maliyet planlarını net şekilde tanımlamalı ile sınır belirlemelerini bu çerçevede planlarla uyumlu biçime dönüştürmelidir. Gider gözlem mekanizmaları birlikte ad alanı düzeyinde değerlendirme sağlamak de hangi bileşenin ne kaynak ayırdığını kavramayı mümkün kılar.
Periyodik yük ve zamanlama yaklaşımları
Pek çok kurumsal uygulama yıl içinde dalgalı bir çeşit yük eğilimine sahip olur. Promosyon aralıkları, tahsilat günleri ya da geçici etkinlikler süresince kota tahminleri baştan öngörülmelidir. Bu tür aralıklar bakımından değişmez limitler yerine olarak programlanmış kapasite değişimi yöntemleri tercih etmek harcamayı kayda değer boyutta kısabilir. Planlayıcı işleri hem de eşdeğer araçlar üzerinden gece vakti saatlerinde düşük güce değişim uygulamak bunun yanında hem de başarım bununla birlikte harcama yönünden değerli sonuçlar doğurabilir.
Yaygın sorulan soru-cevap ve yanıtları
Kubernetes kaynak konusunda en ilgi edilen konulardan biri istek ve sınırlar rakamlarının aynı olarak ayarlanmayacağıdır. Söz konusu yöntem Taahhütlü hizmet düzeyi kategorisini yaratır, fakat tüketim esnekliğini azaltır ciddi oranda azaltabilir. Öteki öteki sorgu bunun yanında limit aşıldığında ne olduğudur. Hafıza tavanı dolduğunda pod genellikle kapatılma durumuna geçer, CPU limiti tükendiğinde ise servis yavaşlatılır ama genellikle durdurulmaz. Bu ayrım sebeple bellek alanı tavanlarının titizlikle tanımlanması şarttır.