Başlık Laboratuvarı / Forum

Kubernetes Olay Kayıtlarında Kaynak Hatalarını Bulma

koray.usta (Member)

ResourceQuota Kullanımında Temel Adımlar



Kubernetes kümelerinde kaynak limitleri, her iş yükünün CPU ve bellek gibi kaynaklardan en fazla ne kadar yararlanabileceğini sınırlayan temel mekanizmalardır. Resource request ile üst sınır (limit) arasındaki fark, Kubernetes planlayıcısının bir pod'u hangi düğüme yerleştireceğini değerlendirirken kritik bir rol oynar. İstek değeri, konteynerin çalışabilmesi için ayrılması gereken minimum kaynağı ifade ederken, limit değeri ise bu kaynağın geçilemeyeceği üst sınırı gösterir. CPU ölçüleri genellikle millicore cinsinden ifade edilirken, bellek değerleri mebibyte veya gibi ikili birimlerle tanımlanır. Bu kavramları iyi kavramak, cluster'ın kararlılığı için olmazsa olmazdır. Limitsiz bırakılan konteynerler, bir düğümün tüm kaynaklarını tüketerek diğer iş yüklerini aksatabilir ve aynı düğümdeki uygulamalarda beklenmedik yavaşlamalara neden olabilir. Bu nedenle her ekip kaynak tanımlarını dikkatle ele almalı ve sürecin baştan itibaren planlanmasına özen göstermelidir.


Kaynak limitlerinin doğru ayarlanması, bir kümenin hem performansı hem de güvenilirliği açısından ciddi faydalar sağlar. Doğru yapılandırılmış istekler sayesinde zamanlayıcı pod'ları daha dengeli yerleştirir ve düğümler gereksiz yüklenmeden çalışır. Limitler ise bir uygulamanın bellek sızıntısı yaşaması durumunda, tüm düğümün kilitlenmesini engelleyerek hasarı tek bir pod'la kısıtlar. Bellek limiti aşıldığında düğüm ajanı konteyneri OOMKilled durumuyla durdurur ve yeniden başlatma politikası devreye girer. Böylece operasyon ekipleri sorunu erken fark edip müdahale edebilir. Ayrıca boşa harcanan kapasite azalır, bulut maliyetleri kontrol altına alınır ve kapasite planlaması daha net hale gelir. Kaynak tüketiminin şeffaf olması, ölçeklendirme kararlarını veriye dayalı almayı da mümkün kılar. Sonuç olarak doğru ayarlanmış limitler, hem de finansal açıdan kazanç sağlayan vazgeçilmez bir disiplindir.


Kaynak limitlerini adım adım uygulamak için önce mevcut iş yükünün davranışını gözlemlemek gerekir. Uygulamayı önce kısıtlamasız veya geniş bir yapılandırmayla çalıştırıp normal ve yoğun dönemlerdeki kullanımı kaydetmek en sağlıklı yoldur. Metrics Server ya da Prometheus gibi çözümlerle CPU ve bellek değerleri birkaç gün süresince toplanmalıdır. Elde edilen veriler üzerinden request değeri, tipik kullanımın biraz hafifçe yukarısında seçilirken, üst sınır değeri maksimum kullanımın güvenli bir payla ötesinde belirlenebilir. Bellek için üst sınır ile request arasındaki farkın aşırı açılmaması, beklenmedik OOM olaylarını azaltır. CPU tarafında ise sıkı limitler throttling'e yol açabileceğinden dikkatli davranılmalıdır. Ayarlar YAML dosyalarında resources bölümü altına yazılır ve Kustomize gibi yönetim araçlarıyla ortam bazında yönetilir. Son olarak LimitRange nesneleriyle namespace düzeyinde varsayılanlar tanımlanarak standart sağlanır.


Kaynak limitlerini verimli biçimde yönetmek için birkaç temel araç ve kaynak hazır bulundurulmalıdır. komut satırı aracı ile describe komutları düğüm düzeyinde anlık bilgi verir, metrik toplayıcı ise CPU kullanımını cluster'a entegre şekilde izlemeyi sağlar. Prometheus ve Grafana ile geçmişe dönük eğilimler incelenebilir ve uyarı kuralları oluşturulabilir. Goldilocks gibi çözümler Vertical Pod Autoscaler önerilerini özetleyerek uygun değerleri tespit etmeye yardımcı olur. resmi dokümantasyonu, Resource Management bölümü temel kaynak olarak önemlidir. Ekipte ortak bir etiketleme politikası ve ad alanı bazlı kota planı oluşturulmalıdır. Bu altyapı yapılmadan yapılan limitler çoğu zaman tahmine dayalı kalır.


Kubernetes'e yeni başlayanlar için ilk öncelikli tavsiye, kaynak tanımlarını asla boş bırakmamaktır. Her bir deployment için en azından temel bir istek ve limit değeri tanımlanmalı, ilk değerler muhafazakâr tutularak gözlem sonuçlarına göre güncellenmelidir. Bellek limitlerini çok sıkı tutmak, servisin sürekli yeniden başlamasına neden olabileceğinden dikkatli olunmalıdır. CPU limitlerinde ise throttling etkisini gözlemlemek için container_cpu_cfs_throttled metrikleri kontrol edilebilir. Başlangıçta Burstable veya Guaranteed QoS sınıflarının farkını anlamak, hangi iş yükünün hangi önceliğe sahip olduğunu belirlemeye yardımcı olur. Küçük bir ortamda denemeler yapmak, kalıcı sisteme geçmeden evvel önemli bilgiler kazandırır. Ekip içinde değerlerin neden belirlendiğine dair dokümantasyon tutmak, gelecekte yapılacak güncellemeleri hızlandırır. Unutulmamalıdır ki kaynak ayarları sabit değildir ve periyodik gözden geçirme ister.


Kubernetes kümelerinde kaynak limitlerini belirlerken en önemli noktalardan biri, requests kavramlarının birbirinden farklı düşünülmesidir. Gereğinden düşük bir CPU veya bellek limiti, uygulamanın beklenmedik biçimde yavaşlamasına yol açabilir. Öte yandan aşırı tanımlanmış limitler, düğüm kapasitesinin israf edici kullanılmasına neden olur. Bellek limiti aşıldığında kapsayıcının OOMKilled durumuna geçmesi özellikle dikkat gerektiren bir senaryodur. Bu nedenle mühendisler her servis için bağımsız ölçümler yapmalı ve değerleri varsayım yerine gözlemlenen verilere dayandırmalıdır. Ayrıca CPU limitlerinin kısıtlama etkisi, yanıt sürelerini fark edilmeden artırabilir. Bu etki, izleme araçları kurulmadan tespit edilmesi zor bir sorundur. Limit değerleri günceller ken trafik örüntülerindeki değişimler de dikkate bulundurulmalıdır. Bir diğer risk, namespace düzeyinde toplu kotaların yanlış kurgulanması durumudur. Bu durumda yeni dağıtımlar beklenmedik biçimde reddedilebilir. Son olarak, geliştirme ortamındaki değerlerin doğrudan canlı ortama taşınması ciddi sürprizlere yol açabilir.


Kaynak yönetiminde çeşitli yaklaşımlar arasında karar yapmak, ekibin ihtiyaçlarına göre değişir. Sabit değerlerle çalışan klasik yöntem, basit olmasına rağmen trafik dalgalanmalarına karşı esnek değildir. Dikey Pod Otomatik Ölçekleyici (VPA), geçmiş kullanım verilerine dayanarak önerilerde bulunur ve manuel düzenleme yükünü azaltır. Yatay Pod Otomatik Ölçekleyici (HPA) ise replika sayısını değiştirerek yükü dağıtır ve genellikle CPU veya özel metrikler üzerinden tetiklenir. Her iki yöntemin birlikte kullanılması özenli bir planlama gerektirir, çünkü birbirlerinin kararlarını etkileyebilirler. Limit Range veya ResourceQuota gibi kural nesneleri ise kurumsal denetimi kolaylaştırır. QoS sınıfları (Guaranteed, Burstable, BestEffort) da öncelik açısından farklı davranışlar sergiler. Hangi yöntemin tercih edileceği ise iş yükünün niteliğine ve önem düzeyine göre değişir.


Gerçek hayatta bir e-ticaret şirketinde kampanya dönemlerinde yaşanan tek olay, bu konunun önemini açık biçimde göstermektedir. Ekip, ödeme servisinin bellek limitini olağan trafik ölçümlerine göre belirlemişti ve kampanya sırasında pod'lar sürekli yeniden başlatılmaya başladı. Sorunun nedeni incelendiğinde, ani artan istek sayısının bellek tüketimini öngörülenin üzerine çıkardığı anlaşıldı. Ekip, HPA yapılandırmasını gözden geçirerek kısa sürede ek replikalar eklenebilecek şekilde düzenledi. Bir diğer örnekte, veri işleme yapan bir iş kümesi gece saatlerinde devreye giriyordu ve gündüz kullanılmayan kaynaklar israf gidiyordu. VPA önerileri temel alınarak limitler düşürüldü ve maliyetlerde ciddi bir azalma sağlandı. Bu türden deneyimler, teorik bilginin pratikte hangi şekilde uygulandığını gösteren değerli vakalardır.


Kaynak limitlerinin uzun vadeli etkileri, sadece anlık performansla sınırlı kalmaz. Doğru yapılandırılmış limitler, kümenin istikrarını artırır ve operasyon ekibinin gece çağrılarını azaltır. Buna karşılık sürekli güncellenmeyen değerler zamanla teknik borç biriktirir. Uygulamalar geliştikçe kaynak profilleri de evrilir, bu nedenle periyodik gözden geçirme süreçleri kurumsal bir disiplin haline getirilmelidir. Sürdürülebilirlik açısından bakıldığında, gereksiz kaynak tüketimi hem maliyeti hem de karbon ayak izini büyütür. Bu sebeple kaynak verimliliği, yalnızca mühendislik olmayıp aynı zamanda çevresel bir görev olarak ele alınmalıdır. Ekiplerin deneyim paylaşımını teşvik eden kültürler, bu alanda daha istikrarlı sonuçlar elde eder.


İleri seviye çalışmalarda kaynak yönetimi, kendiliğinden işleyen sistemler ve gözlemlenebilirlik araçlarıyla birlikte değerlendirilmelidir. Prometheus ve Grafana gibi çözümler ile kullanım grafiklerinin analizi, limit kararlarını veri odaklı hale getirir. Yük testleri, üretime çıkmadan önce limitlerin yeterliliğini doğrulamak için kritik bir aşamadır. Bazı organizasyonlar kaynak talebi ile gerçek kullanım arasındaki farkı izleyen özel paneller oluşturur. Politika motorları, örneğin OPA Gatekeeper, limit tanımı olmadan dağıtımları önleyerek standardı korur. Sonuç olarak, kaynak limitleri sabit bir yapılandırma değil, sürekli ölçülen ve geliştirilen dinamik bir yapıdır. Bu bütüncül yaklaşımı benimseyen kurumlar, hem performans hem de bütçe açısından sürdürülebilir kazanımlar sağlar.


Kubernetes kaynak limitlerinin çekirdek mantığı


Kubernetes kümelerinde her pod için CPU ve bellek isteği ile limiti ayrı ayrı tanımlanır. Talep değeri zamanlayıcının (scheduler) düğüm seçimini yönlendiren temel değerdir. Limit ise konteynerin çalışma anında aşabileceği en yüksek kullanımı belirler. Bu iki değer dengeli kurgulanmadığında küme genelinde kapasite israfı veya beklenmedik kesintiler görülebilir. Özellikle canlı ortamlarında her servisin gerçek ihtiyacını test etmeden değer atamak ciddi sorunlara yol açar. Bu nedenle öncelikle metrik toplama araçlarıyla fiili kullanım verisi elde. Ayrıca QoS sınıfları (Guaranteed, Burstable, BestEffort) request ve limit eşitliğine göre belirlenir, bu da tahliye (eviction) önceliğini doğrudan etkiler.


Kaynak limitlerinde sık yapılan sorunlu uygulamalar


Çok rastlanan hata, limit değerini hiç belirtmemek veya tüm servislere aynı sabit değeri uygulayıp geçmektir. Bu durumda bir pod, düğümün kalan belleğini tüketerek diğer podları olumsuz etkileyebilir. Bir diğer sık görülen aksaklık, bellek limitini çok düşük seçmek ve uygulamanın sürekli OOMKilled olarak yeniden başlamasına sebep olmaktır. CPU limitini gereğinden düşük tutmak ise gecikme (latency) artışına ve fark edilmesi zor performans düşüşlerine yol açabilir. Ayrıca request değerini makul tutmadan düğüm kapasitesinin israf harcanmasına izin vermek, küme maliyetlerini aşırı yükseltir.


Kıdemli pratik yönergeler ile limitleri optimize etmek

Tecrübeli ekipler genellikle ilk aşamada Vertical Pod Autoscaler ile öneri modunda çalışarak gerçek kullanım dağılımını çıkarmayı seçenek eder. Elde edilen veriler ışığında request değerleri, ortalama yük seviyesinin ufak üzerine, limit değerleri ise pik yük anlarını tolere edecek şekilde belirlenir. Bellek için limit ile request arasındaki farkın makul tutulması, OOM riskini azaltır. CPU için ise limit koymadan yalnızca request tanımlamak, çeşitli ekip tarafından önerilen bir yaklaşımdır, zira CPU throttling gecikmelerinin önüne geçer. LimitRange ve ResourceQuota nesneleriyle namespace bazında öntanımlı değerler ve üst sınırlar kural hâline getirilerek tutarlılık sağlanabilir.


Pod kaynak ayarlarının bütçe etkisi ve kapasite planlaması


Request değerleri doğrudan bulut faturasını belirleyen unsurlardır. Bir düğümün altında gereksiz yere fazla request tanımlanmış podlar çalıştığında, scheduler yeni düğüm başlatmaya zorlanır ve küme maliyeti yükselir. Harcama planlaması yapılırken her namespace için toplam request değerlerinin ayrı izlenmesi gerekir. Bunun için OpenCost kullanılarak servis bazında gider dağılımı incelenebilir. Böylece hangi iş yükünün aslında ne kadar altyapı tükettiği açık şekilde görülerek bütçe kararları daha sağlıklı alınır.


Mevsimsel ayarlama ve mevsimsel yük değişimlerine göre limit ayarı


Çok sayıda işletmede trafik belirli dönemlerde belirgin biçimde yükselir; kampanya haftaları, yılbaşı satın almaları veya okul dönemleri bu artışların başlıca örneklerindendir. Bu dönemler için request ve limit değerlerini planlı olarak gözden geçirmek, plansız kesintilerin önüne geçer. Takvimli ölçeklendirme için KEDA gibi araçlarla cron tabanlı artırım yapılabilir, yoğunluk bittikten değerlerin eski hâline çekilmesi temin edilerek maliyet kontrolü sürdürülür. Böylece altyapı ihtiyacı yalnızca gerektiği ölçüde kullanılır.


Sık sorulan sorular ve kısa açıklamalar

Ekiplerin en çok merak ettiği konulardan biri, limitlerin hangi periyotla gözden geçirilmesi gerektiğidir. Ortalama öneri, her büyük sürüm değişikliği ve her üç ayda bir metriklere dönülerek değerlerin revize edilmesidir. Bir diğer çok görülen soru ise bellek limiti koymanın zorunlu olup olmadığıdır; karşılık iş yükünün doğasına göre değişir, ancak bellek tarafında limit genellikle önerilirken CPU tarafında ihtilaflı bir anlayış söz konusudur. Bir diğer konu olarak ölçüm isabeti için en az birkaç hafta boyunca veri toplamak, anlık bir ölçüme dayanarak karar vermekten ciddi oranda güvenilir sonuçlar verir.

Yanıtla
mericates (Kidemli Uye)
Profesyonel bir icerik. Devamini merakla bekliyorum.
Yanıtla
gunes1999 (Aktif Gozlemci)
Uzman bir calisma.
Yanıtla
ediz_patron (Member)
Kubernetes Olay Kayıtlarında Kaynak Hatalarını ile ilgili temiz bir konferans olmus, eline saglik.
Yanıtla
sefa.kurt (Member)
Kubernetes Olay Kayıtlarında Kaynak Hatalarını ile ilgili muhtesem bir arsiv olmus, eline saglik.
Yanıtla
fatma_ucar42 (Member)
Kubernetes Olay Kayıtlarında Kaynak Hatalarını ile ilgili temiz bir gozlem olmus, eline saglik.
Yanıtla

Forumdan Konular