Kubernetes Resource Limits: CPU ve Memory Ayarlamada Sık Yapılan Hatalar
Kubernetes'te Pod'lar için CPU ve memory limitlerini yanlış ayarlamak, uygulamanızın aniden ölmesine veya çok yavaş çalışmasına neden olur. Bir Pod'un bellek limiti aşarsa OOMKill (Out of Memory) ile öldürülür. CPU limiti aşarsa throttle olur ve yavaşlar. Pek çok ekip bu limitleri hiç ayarlamadan veya çok dar ayarlayarak sorun yaratıyor.
Limit tanımlamadığınızda Pod sınırsız kaynak tüketebilir ve diğer Pod'ları öldürebilir.
Yanlış:
1apiVersion: v12kind: Pod3metadata:4name: web-app5spec:6containers:7- name: nginx8image: nginx:latestDoğru:
1apiVersion: v12kind: Pod3metadata:4name: web-app5spec:6containers:7- name: nginx8image: nginx:latest9resources:10requests:11memory: "128Mi"12cpu: "100m"13limits:14memory: "256Mi"15cpu: "500m"requests = Kubernetes'in Pod'u yerleştirirken ayıracağı minimum kaynak. limits = Pod'un asla aşamayacağı maksimum kaynak.
Bu imkansız bir durum yaratır ve Pod Pending kalır.
1resources:2requests:3memory: "512Mi"4limits:5memory: "256Mi" # Bu hata! Request daha büyükRequest her zaman limit'ten küçük veya eşit olmalı.
CPU limiti düşük olursa uygulama throttle olur ve istekler timeout olur.
Örnek:
1resources:2requests:3cpu: "100m"4limits:5cpu: "100m" # Spike sırasında sorunBu ayarda anlık yük artışında uygulama yavaşlar. Request'i limit'ten düşük tutun:
1resources:2requests:3cpu: "100m"4limits:5cpu: "500m" # Spike'a toleransMemory çok dar olursa Pod aniden öldürülür (OOMKill). Logs'ta görmek için:
1kubectl describe pod web-app | grep -A 5 "Last State"Çıktı:
1Last State: Terminated2Reason: OOMKilled3Exit Code: 137Memory limitini biraz daha yüksek tutun veya uygulama optimizasyonu yapın.
Pod'un gerçek kaynak tüketimini görmek için:
1kubectl top pod web-appÇıktı:
1NAME CPU(cores) MEMORY(bytes)2web-app 45m 120MiBu veriye bakarak request ve limit'i ayarlayın. Actual tüketimin %150'sine kadar limit koyun.
- Request = minimum garantili kaynak
- Limit = asla aşılmayacak maksimum
- Request ≤ Limit kuralını tutun
- CPU limitini request'ten %300-500 daha yüksek tutun
- Memory limitini request'ten %50-100 daha yüksek tutun
- Gerçek tüketimi
kubectl topile ölçüp ayarlayın
5 yorum
doğru ya bir de şöyle düşün mesela yeni bir developer geldi ekibe ona kim anlatacak bunu
hani ya öğrenme pahasına productionda ölüm olması biraz ağır ya acaba başında iyi bir
ya aynen işte productionda patladığında öğreniyorlar çoğu zaman ben de merak ediyorum
belki de kaynaklarda pek anlatılmıyor ya da anlaşılmıyor o yüzden herkes deneme yanılma yoluyla öğreniyor sonra productionda patladığında fark ediyor
ay bence bir iş var burada neden bu kadar önemli bir şey herkeste yanlış oluyor da kimse