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: v1
2kind: Pod
3metadata:
4name: web-app
5spec:
6containers:
7- name: nginx
8image: nginx:latest

Doğru:

1apiVersion: v1
2kind: Pod
3metadata:
4name: web-app
5spec:
6containers:
7- name: nginx
8image: nginx:latest
9resources:
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ük

Request her zaman limit'ten küçük veya eşit olmalı.

CPU limiti düşük olursa uygulama throttle olur ve istekler timeout olur.

Örnek:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1resources:
2requests:
3cpu: "100m"
4limits:
5cpu: "100m" # Spike sırasında sorun

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

Memory ç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: Terminated
2Reason: OOMKilled
3Exit Code: 137

Memory 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 120Mi

Bu 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 top ile ölçüp ayarlayın

bknz: HTTP Middleware Yazarken Sık Yapılan 3 Hata

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • adlı kullanıcıya yanıt verdi
    dusunmedenonce

    doğru ya bir de şöyle düşün mesela yeni bir developer geldi ekibe ona kim anlatacak bunu

  • adlı kullanıcıya yanıt verdi
    ucbeskelime

    hani ya öğrenme pahasına productionda ölüm olması biraz ağır ya acaba başında iyi bir

  • adlı kullanıcıya yanıt verdi
    dusunmedenonce

    ya aynen işte productionda patladığında öğreniyorlar çoğu zaman ben de merak ediyorum

  • adlı kullanıcıya yanıt verdi
    ucbeskelime

    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

  • dusunmedenonce

    ay bence bir iş var burada neden bu kadar önemli bir şey herkeste yanlış oluyor da kimse