Metrics Server ile Anlık Kaynak İzleme
Kubernetes kümelerinde kaynak kısıtları her iş yükü için CPU tüketimini kontrol altında tutan kritik bir mekanizmadır. Bu ayarlar sayesinde bir uygulama sistemdeki diğer bileşenleri etkilemeden çalışabilir. Yönetici bu değerleri dikkatli tanımladığında atıl kaynaklar önlenir ve cluster kararlılığı artar. Limit tanımlanmayan konteyner düğüm üzerindeki tüm kullanılabilir kaynakları tüketebilir, bu da yan iş yüklerinde performans düşüşüne yol açabilir. Gelişmiş ortamlarda limitler zorunlu kabul edilir. Doğru planlama için önce uygulamanın tipik ve zirve yük profili çıkarılmalıdır. Bu analiz ölçüm araçlarıyla sağlandığında sonuçlar daha isabetli olur. Ayrıca ad alanı düzeyinde kota ve LimitRange nesneleriyle genel değerler belirlenebilir. Böylece ekipler kendi iş yükleri için tutarlı sınırlarla çalışır. Sonuç olarak limit yönetimi, maliyet kontrolü ile kararlılığı birlikte güçlendiren sürekli bir çalışmadır.
Kubernetes'te istek değerleri ile limits arasındaki fark kaynak dağıtımının temelini oluşturur. İstekler, zamanlayıcının (scheduler) bir pod için garanti ettiği minimum kaynak miktarıdır. Zamanlayıcı, node seçerken bu istek miktarlarına bakar ve yalnızca yeterli boş kapasiteye sahip node'lara yerleştirme yapar. Limitler ise bir pod'un aşamayacağı üst sınırı belirler. İşlemci için bu sınır aşıldığında süreç throttle edilir, ancak sonlandırılmaz. Bellek için ise limit aşıldığında süreç OOMKilled hatasına düşerek sonlandırılır. İstekler ile limits aynı değere eşitlendiğinde pod Guaranteed hizmet kalitesi sınıfına girer. Farklı miktarlar tanımlandığında patlayabilir sınıf oluşur. Hiçbir sınır tanımlanmadığında BestEffort sınıfı söz konusu olur ve bu pod kaynak baskısında ilk tahliye adayı olur. Dolayısıyla hangi tür sınıfın seçileceğine iş yükünün önceliğine göre karar verilmelidir. Önemli veritabanları için garantili sınıf, batch işler için Burstable sınıf tercih edilebilir. Her iki değerin da kavranması kapasite ve verim dengesini doğru kurmak için şarttır.
CPU limitlerinin tanımlanması iş yükünün davranışına göre gerçekleştirilmelidir. İşlemci birimi milicpu cinsinden ifade edilir ve 1000m değeri tek bir core'a karşılık gelir. İlk olarak uygulamanın düşük yük ve zirve trafik altındaki CPU kullanımı kaydedilmelidir. Prometheus gibi araçlarla alınan veriler p99 yüzdelik değerleri üzerinden yorumlanır. Limit değeri genellikle bu zirve kullanımın biraz yukarısında tutulur. Çok düşük bir limit yavaşlamaya ve kuyruk sürelerinin uzamasına neden olur. Gereksiz geniş bir limit ise cluster kapasitesinin boşa kullanılmasına sebep olur. 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 çeşitli limit seviyeleri denenerek ideal nokta tespit edilmelidir. Bu süreçte gerçek trafik örnekleri kullanıldığında sonuçlar önemli ölçüde değerli olur. Son olarak limitler, servis sürümleri değiştikçe tekrar gözden geçirilmelidir.
Bellek limitlerinin belirlenmesi CPU'ya göre çok daha hassas bir süreçtir, çünkü bellek sıkıştırılamaz bir kaynaktır. Limit aşıldığında kernel OOM Killer devreye girer ve konteyneri öldürür. Dolayısıyla bellek limiti konservatif ama gerçekçi belirlenmelidir. Hesaba başlamak uygulamanın heap ve stack tüketimi ayrıntılı incelenmelidir. Java tabanlı uygulamalarda heap boyutu ile konteynerin toplam belleği arasında makul bir pay bırakılmalıdır. Node.js ve Python uygulamalarında bellek sızıntıları uzun süre çalıştıkça limit ihlaline yol açabilir. Bu sebeple sürekli izleme ile kullanım grafiği takip edilmelidir. Kubernetes içinde container_memory_working_set_bytes gibi 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. Fakat gereğinden fazla büyük limitler node belleğinin israf edilmesine yol açar. Ortam değişkenleri değiştikçe hesaplamanın yeniden yapılması tavsiye edilir.
Kaynak isteklerinin isabetli ayarlanması, küme planlamasının verimli çalışması için vazgeçilmezdir. Requests değeri gereğinden az girildiğinde zamanlayıcı pod'u fazla yoğun düğümlere yerleştirir, bu da performans sorunlarına neden olur. Gereğinden fazla tanımlandığında ise node'lar fiilen kullanılmasa bile kapasitesi tükenmiş gözükür. Bu durum cluster kullanım oranını düşürür ve gereksiz altyapı harcaması doğurur. Doğru bir başlangıç için geçmiş metrikler değerlendirilmeli ve medyan kullanım değerine yakın bir istek tanımlanmalıdır. Vertical Pod Autoscaler gibi mekanizmalar öneri üretebilir ve bu öneriler başlangıç ayar için kullanılabilir. Yatay pod ölçekleyici ile birlikte kullanılırken çakışmalara dikkat gösterilmelidir. Ayrıca namespace seviyesinde LimitRange tanımlandığında unutulmuş istekler otomatik doldurulabilir. Düzenli değerlendirme ile değerler iş yükü gelişimine paralel tutulmalıdır.
Kubernetes kümelerinde resource limit değerlerini doğru belirlemek için öncelikle QoS sınıflarını dikkatli 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 kesin garantili 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 BestEffort 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 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 pratik 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ı azaltılabilir. 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 neden olur. 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ı oluşturulabilir. 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ı 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 kabul edilmez. 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ı kaybeder. Ayrıca kota kullanım oranlarının düzenli izlenmesi, sorunların erken fark 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 otomatik ö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ü ciddi biçimde 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 gözlem 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 tutarlı 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 verimli sonuçları getirir.
Gerçek kullanım verisine dayalı kaynak ayarı, tahminlere değil ölçümlere bağlı 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 isabetli sonuçlar verir. Request değeri genellikle ortalama kullanıma yakın, limit değeri ise tepe yüklere yeterli 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 teyit edilmelidir. Sürekli iyileştirme döngüsü kurulduğunda, kaynak kullanımı hem performans hem de güvenilirlik açısından dengeli hale gelir.
Konteyner orkestrasyon kaynak sınırları nasıl planlanır
Kubernetes üretim altyapısında pod başına kotaları doğru yapılandırmak performans bakımından büyük bir öneme sahip etki üstlenir. İstekler ile limits kavramları arasındaki ayrım açık özümsenmeden hazırlanan yapılandırmalar kesintiye sebep doğurabilir. Zamanlayıcı servisi requests tanımlarına göre konteyner dağıtımı yapar. Sınırlar fakat yürütme zamanında geçerli olur. İlk adım anlamında her konteyner için ölçülmüş ölçümler belirlemek, kubectl top benzeri yöntemlerle canlı yük bilgilerini değerlendirmek en sağlıklı yöntemdir.
Yaygın rastlanan pürüzler nelerdir
Kaynak alanında en çok görülen hatalardan ilk sırada limitlerin baştan tanımlanmamasıdır. Böyle bir yapıda tek iş yükü bütün makine kaynağını kullanabilir ile kalan iş yüklerini durdurabilir. İkinci sık yanılgı ise istek rakamlarını fazla düşük bırakmaktır. Bunun sonucunda koşulda konteyner düğüme aşırı yüklenir, bu da bellek baskısı ile kapanma vakalarına kapı doğurur. Üçüncü hata öte yandan bütün servislere aynı limitleri uygulamak. Tüm bileşenin farklı kaynak ihtiyacı karakteri göz önüne alınmadan göz ardı edilmemelidir.
Tecrübeli püf noktaları ve kota ayarı
Alanında uzman yöneticiler çoğu zaman kota alanında bu yöntemi kullanır: Öncelikle kullanım testleri çalıştırılır sonrasında alınan bulgular doğrultusunda istek miktarları ortalama tüketimin hafifçe ötesine konumlandırılır. Sınırlar rakamları fakat maksimum kullanımı yeterli olacak biçimde belirlenmelidir. CPU adına tavan tanımlamak ara sıra gereksiz darboğazlara neden açabildiğinden temkinli davranılmalıdır. Otomatik dikey ölçekleyici hem de Yatay ölçekleyici ör. sistemler da bu sürecte tanımların süreç içinde optimize duruma gelmesinde yararlı olabilir.
Kaynak yönetimi bütçesi ile gider takibi
K8s ortamlarında kaynak limiti tanımları bizzat cloud faturasına tesir eder. Aşırı büyük kota ayarlanmış bir çeşit altyapı boşta yatan boş alana ödeme yapılmasına sebep getirir. Bu olgu dolayısıyla ekip bütçe planlarını somut şekilde çizmelidir ve sınır kararlarını bu temelde planlarla örtüşen biçime getirilmelidir. Maliyet izleme sistemleri birlikte isim alanı düzeyinde raporlama sağlamak de hangi servisin hangi ölçüde kapasite ayırdığını kavramayı mümkün kılar.
Periyodik iş yükü hem de planlama yaklaşımları
Çeşitli kurumsal servis dönem içinde oynak bir çeşit talep örüntüsüne göre şekillenir. Kampanya aralıkları, hesap kesimi zamanları veya sezonluk programlar sırasında kota projeksiyonları baştan öngörülmelidir. Bu dönemler adına değişmez sınırlar yerine olarak zamanlanmış ölçekleme yöntemleri benimsemek harcamayı dikkat çekici oranda azaltabilir. Cron süreçleri ve benzer mekanizmalar vasıtasıyla akşam vakitlerinde sınırlı boyuta indirim gerçekleştirmek bunun yanında aynı zamanda başarım ile birlikte maliyet yönünden değerli getiriler üretebilir.
Sıkça sorulan sorular ve yanıtlar ile cevapları
Kubernetes kaynak limiti alanında en çok ilgi duyulan meselelerden biri requests ve limits tanımlarının eşit olup tutulmayacağıdır. Bu tür tercih Taahhütlü servis sınıfı grubunu oluşturur, ancak kapasite esnekliğini azaltır kayda değer ölçüde daraltabilir. Diğer bir sık konu de sınır tavana ulaşıldığında ne ortaya çıktığıdır. RAM limiti geçildiğinde uygulama genellikle kapatılma hâline düşer, CPU tavanı dolduğunda oysa konteyner kısıtlanır fakat genellikle kapatılmaz. Bu ayrım nedenle hafıza sınırlarının dikkatle ayarlanması zorunludur.