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 yok

Bellek 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-7d9f

Sebepler: 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_total

Bu 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.

  1. Distributed tracing nasıl çalışır? Trace context servisler arasında nasıl taşınır ve OpenTelemetry'nin rolü nedir?ZorDocker & DevOpsBackend
  2. Observability nedir? Log, metric ve trace arasındaki fark nedir ve her biri ne için kullanılır?KolayDocker & DevOpsBackend
  3. Rolling update, blue-green ve canary deployment stratejileri arasındaki farklar nelerdir?OrtaDocker & DevOpsBackend
  4. Ortam değişkenleri ve secret'lar (şifre, API anahtarı) güvenli şekilde nasıl yönetilir?OrtaDocker & DevOpsBackend
  5. CI/CD nedir? Tipik bir backend CI/CD pipeline'ının aşamaları nelerdir?OrtaDocker & DevOpsBackend
  6. İyi bir Dockerfile nasıl yazılır? Multi-stage build ne işe yarar?OrtaDocker & DevOpsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle