Kubernetes'te resource requests ve limits nasıl çalışır? OOMKilled ve CPU throttling sorunlarını nasıl teşhis edersiniz?
Cevap
- requests: scheduler'ın pod'u yerleştirirken garanti ettiği kaynak. Node seçimi buna göre yapılır.
- limits: container'ın aşamayacağı üst sınır.
resources:
requests:
cpu: "500m" # yarım çekirdek
memory: "512Mi"
limits:
memory: "512Mi" # bellek limiti = request (önerilen)
# cpu limiti bilinçli olarak yokBellek ve CPU farklı davranır
| Limit aşılırsa | |
|---|---|
| Bellek (sıkıştırılamaz) | Container kernel OOM killer tarafından öldürülür: OOMKilled, exit code 137 |
| CPU (sıkıştırılabilir) | Container öldürülmez, throttle edilir: CFS kotası dolunca periyodun geri kalanında bekletilir |
OOMKilled teşhisi
kubectl describe pod order-api-7d9f # Last State: Terminated, Reason: OOMKilled
kubectl top pod order-api-7d9fSebepler: gerçek bellek sızıntısı veya runtime'ın limiti bilmemesi. JVM'de -Xmx'i limite eşitlemek hatadır çünkü heap dışında metaspace, thread stack ve direct buffer da bellek kullanır; -XX:MaxRAMPercentage=75 gibi bir oran kullanın. Node.js'te --max-old-space-size'ı limitin altında ayarlayın. .NET ve modern JVM'ler cgroup limitini otomatik algılar.
CPU throttling teşhisi
Belirti: CPU kullanımı ortalamada düşük görünür ama p99 gecikme yüksektir. Çok thread'li bir uygulama 100ms'lik CFS periyodunun kotasını ilk birkaç ms'de tüketip kalan süre bekletilir.
container_cpu_cfs_throttled_periods_total / container_cpu_cfs_periods_totalBu oran yüksekse (ör. %20+) throttling vardır. Çözümler: CPU limitini artırmak veya kaldırmak (birçok ekip yalnızca CPU request kullanır), runtime'ın thread sayısını CPU kotasına göre ayarlamak.
QoS sınıfları
- Guaranteed: tüm container'larda request = limit (CPU ve bellek). Node baskısında en son tahliye edilir.
- Burstable: request var, limit farklı veya yok.
- BestEffort: hiçbiri yok; ilk tahliye edilen.
Request'leri gerçek kullanıma göre ayarlamak için Prometheus geçmiş verisi veya Vertical Pod Autoscaler önerileri kullanılır.
İlgili Docker & DevOps soruları
- Distributed tracing nasıl çalışır? Trace context servisler arasında nasıl taşınır ve OpenTelemetry'nin rolü nedir?
- Observability nedir? Log, metric ve trace arasındaki fark nedir ve her biri ne için kullanılır?
- Rolling update, blue-green ve canary deployment stratejileri arasındaki farklar nelerdir?
- Ortam değişkenleri ve secret'lar (şifre, API anahtarı) güvenli şekilde nasıl yönetilir?
- CI/CD nedir? Tipik bir backend CI/CD pipeline'ının aşamaları nelerdir?
- İyi bir Dockerfile nasıl yazılır? Multi-stage build ne işe yarar?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.