Kubernetes OOMKilled Hatası Nasıl Çözülür? Exit Code 137 Rehberi (2026)

15.01.2026 20:48 Haber

Kubernetes cluster'ınızda pod'lar sürekli OOMKilled statusuyla mı crash oluyor? Exit Code 137 görüp ne yapacağınızı bilemiyor musunuz? Hiç panik yapmayın! Alesta Web olarak bu Kubernetes memory error sorununu adım adım çözeceğiz. Bu rehberde OOMKilled hatasının nedenlerini, teşhis yöntemlerini ve 6 kesin çözümü bulacaksınız.

OOMKilled Hatası Nedir? (What is OOMKilled Error?)

Alesta Web ekibi olarak Kubernetes ortamlarında en sık karşılaştığımız hatalardan biri OOMKilled statusudur. Peki bu hata tam olarak ne anlama geliyor?

OOMKilled, "Out of Memory Killed" ifadesinin kısaltmasıdır. Linux kernel, bir container'ın kendisine ayrılan memory limitini aştığında bu container'ı zorla sonlandırır. Bu durum Exit Code 137 ile işaretlenir (128 + 9 = SIGKILL sinyali).

Tipik Hata Mesajı / Typical Error Message

$ kubectl get pods
NAME                    READY   STATUS      RESTARTS   AGE
my-app-7b9f8c4d5-x2k4j  0/1     OOMKilled   5          10m

$ kubectl describe pod my-app-7b9f8c4d5-x2k4j
...
Last State:     Terminated
  Reason:       OOMKilled
  Exit Code:    137
  Started:      Wed, 15 Jan 2026 10:30:00 +0300
  Finished:     Wed, 15 Jan 2026 10:32:15 +0300

Kubernetes, cgroups (control groups) adlı Linux kernel özelliğini kullanarak container'ların kaynak kullanımını sınırlar. Her container bir cgroup'a atanır ve bu cgroup'un belirli bir memory limiti vardır. Container bu limiti aşmaya çalıştığında, kernel OOM (Out of Memory) durumu tetikler ve container'ı öldürür.

? Bilgi / Info:

Alesta Web deneyimlerine göre, OOMKilled hatası genellikle yanlış yapılandırılmış memory limit'lerden veya uygulama içindeki memory leak'lerden kaynaklanır. İyi haber şu ki, bu sorun çözülebilir!

OOMKilled Hatası Nedenleri (Common Causes of OOMKilled)

Kubernetes OOMKilled hatasının 4 ana nedeni vardır. Alesta Web olarak bu nedenleri tek tek inceleyelim:

1. Yetersiz Memory Limit (Insufficient Memory Limit)

En yaygın neden budur. Uygulamanız gerçekte ihtiyaç duyduğundan daha düşük bir memory limit ile çalışıyor olabilir. Örneğin, uygulamanız 512MB bellek kullanıyorken limit 256MB olarak ayarlanmışsa, OOMKilled kaçınılmazdır.

2. Memory Leak (Bellek Sızıntısı)

Uygulama kodundaki memory leak'ler zamanla bellek kullanımının artmasına neden olur. Başlangıçta sorunsuz çalışan container, birkaç saat veya gün sonra OOMKilled ile sonlanabilir.

3. Trafik Spike'ları (Traffic Spikes)

Ani trafik artışları, uygulamanın normalden çok daha fazla bellek tüketmesine yol açabilir. Özellikle e-ticaret siteleri ve API servisleri bu durumdan etkilenir.

4. Yanlış JVM Ayarları (Incorrect JVM Settings)

Java uygulamalarında JVM heap size container limit'inden bağımsız çalışabilir. Bu durum container'ın limitini aşmasına neden olur.

⚠️ Dikkat / Warning:

Memory limit'i request'ten çok yüksek tutmak, node'larda overcommitment'a yol açar. Bu durum birden fazla pod'un aynı anda OOMKilled olmasına neden olabilir (cascading failure).

Hatayı Teşhis Etme (How to Diagnose OOMKilled)

Alesta Web olarak OOMKilled hatasını teşhis etmek için kullandığımız komutları paylaşıyoruz:

Adım 1: Pod Durumunu Kontrol Et (Check Pod Status)

# Pod'un son durumunu görüntüle
kubectl describe pod <pod-name> | grep -A 5 "Last State"

# Çıktı örneği:
Last State:     Terminated
  Reason:       OOMKilled
  Exit Code:    137
  Started:      Wed, 15 Jan 2026 10:30:00 +0300
  Finished:     Wed, 15 Jan 2026 10:32:15 +0300

Adım 2: Memory Kullanımını İzle (Monitor Memory Usage)

# Anlık memory kullanımı
kubectl top pod <pod-name>

# Tüm pod'ların memory kullanımı
kubectl top pods --all-namespaces | sort -k4 -h

# Container'ın memory limit'ini görüntüle
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].resources}'

Adım 3: Event'leri Kontrol Et (Check Events)

# Namespace'deki tüm event'ler
kubectl get events --namespace=<namespace> --sort-by='.lastTimestamp'

# OOM ile ilgili event'ler
kubectl get events --field-selector reason=OOMKilling
✅ Alesta Web İpucu / Tip:

Exit Code 137 her zaman OOMKilled anlamına gelmez. Bazen manuel olarak gönderilen SIGKILL (kill -9) de aynı kodu üretir. Ancak kubectl describe çıktısında "Reason: OOMKilled" görüyorsanız, sorun kesinlikle memory ile ilgilidir.

Çözüm 1: Memory Limit Artırma (Increase Memory Limit)

En basit ve hızlı çözüm, container'ın memory limitini artırmaktır. Alesta Web olarak bu yöntemi çoğu durumda öneriyoruz.

Deployment YAML Güncellemesi (Update Deployment YAML)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        resources:
          requests:
            memory: "256Mi"    # Başlangıç isteği
            cpu: "250m"
          limits:
            memory: "512Mi"    # Maksimum limit (artırıldı!)
            cpu: "500m"

Kubectl ile Hızlı Güncelleme (Quick Update with kubectl)

# Mevcut limit'i görüntüle
kubectl get deployment my-app -o jsonpath='{.spec.template.spec.containers[0].resources}'

# Deployment'ı düzenle
kubectl edit deployment my-app

# Veya patch ile güncelle
kubectl patch deployment my-app --type='json' -p='[
  {"op": "replace", "path": "/spec/template/spec/containers/0/resources/limits/memory", "value": "512Mi"}
]'
? Alesta Web Önerisi / Recommendation:

Memory limitini artırmadan önce, uygulamanızın gerçek memory kullanımını en az 24 saat izleyin. Prometheus veya Kubernetes Metrics Server kullanarak peak (en yüksek) değeri belirleyin ve limitinizi bu değerin %20-30 üzerinde tutun.

Çözüm 2: Request ve Limit Dengeleme (Balance Requests and Limits)

Kubernetes best practice'lerine göre, memory limit'i request'e eşit veya yakın tutmalısınız. Alesta Web ekibi olarak bu yaklaşımı şiddetle öneriyoruz.

Önerilen Yapılandırma (Recommended Configuration)

resources:
  requests:
    memory: "512Mi"    # Request = Limit (Best Practice!)
    cpu: "250m"
  limits:
    memory: "512Mi"    # Aynı değer
    cpu: "1000m"       # CPU için limit daha yüksek olabilir

Neden request = limit olmalı?

  • ✅ QoS Class "Guaranteed" olur (en yüksek öncelik)
  • ✅ Node overcommitment riski azalır
  • ✅ Predictable (öngörülebilir) kaynak kullanımı sağlanır
  • ✅ OOMKilled riski minimize edilir
⚠️ Dikkat / Warning:

Request > Limit ayarı Kubernetes tarafından kabul edilmez ve deployment reddedilir. Her zaman request ≤ limit kuralına uyun.

Çözüm 3: Java Uygulamaları İçin Özel Ayarlar (Java Application Settings)

Java uygulamaları container'larda çalışırken özel dikkat gerektirir. Alesta Web olarak Java 10+ sürümlerinde container-aware JVM ayarlarını kullanmanızı öneriyoruz.

Container-Aware JVM Ayarları (Container-Aware JVM Settings)

# Dockerfile içinde JAVA_OPTS ayarı
ENV JAVA_OPTS="-XX:+UseContainerSupport \
               -XX:MaxRAMPercentage=75.0 \
               -XX:InitialRAMPercentage=50.0 \
               -XX:+ExitOnOutOfMemoryError"

# Veya Kubernetes deployment'ta
containers:
- name: java-app
  image: openjdk:17-slim
  env:
  - name: JAVA_OPTS
    value: "-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"
  command: ["java", "$(JAVA_OPTS)", "-jar", "app.jar"]
JVM Flag Açıklama / Description
-XX:+UseContainerSupport Container limitlerini algılar (Java 10+ default)
-XX:MaxRAMPercentage=75.0 Container memory'nin %75'ini heap olarak kullan
-XX:+ExitOnOutOfMemoryError OOM durumunda hızlı restart için çık
✅ Alesta Web Deneyimi / Experience:

Java 8 kullanıyorsanız, -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap flag'lerini eklemeniz gerekir. Ancak mümkünse Java 17+ LTS sürümüne geçmenizi öneriyoruz.

Çözüm 4: Vertical Pod Autoscaler (VPA) Kullanımı

Kubernetes Vertical Pod Autoscaler (VPA), pod'ların CPU ve memory request/limit değerlerini otomatik olarak ayarlar. Alesta Web olarak production ortamlarında VPA kullanımını öneriyoruz.

VPA Kurulumu (VPA Installation)

# VPA'yı cluster'a yükle
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler
./hack/vpa-up.sh

# VPA durumunu kontrol et
kubectl get pods -n kube-system | grep vpa

VPA Yapılandırması (VPA Configuration)

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Auto"    # Otomatik güncelleme
  resourcePolicy:
    containerPolicies:
    - containerName: '*'
      minAllowed:
        memory: "128Mi"
      maxAllowed:
        memory: "2Gi"
      controlledResources: ["memory"]

VPA Update Modları:

  • Off: Sadece öneri verir, değişiklik yapmaz
  • Initial: Sadece pod oluşturulurken ayarlar
  • Auto: Çalışan pod'ları otomatik günceller (pod restart gerektirir)

Çözüm 5: Memory Leak Tespiti ve Çözümü (Memory Leak Detection)

OOMKilled hatası tekrarlıyorsa, uygulamanızda memory leak olabilir. Alesta Web olarak memory leak tespiti için şu adımları öneriyoruz:

Node.js Uygulamaları İçin (For Node.js Applications)

# Heap snapshot almak için
node --inspect app.js

# Chrome DevTools ile bağlan: chrome://inspect
# Memory tab'ında heap snapshot al

# Veya clinic.js kullan
npm install -g clinic
clinic doctor -- node app.js

Python Uygulamaları İçin (For Python Applications)

# memory_profiler kullan
pip install memory_profiler

# Fonksiyon bazlı profiling
@profile
def my_function():
    # kod buraya

# Çalıştır
python -m memory_profiler app.py

Go Uygulamaları İçin (For Go Applications)

import _ "net/http/pprof"

// pprof endpoint'ini etkinleştir
go func() {
    http.ListenAndServe(":6060", nil)
}()

// Heap profile al
go tool pprof http://localhost:6060/debug/pprof/heap
? Alesta Web İpucu / Tip:

Memory leak'ler genellikle kapatılmayan database connection'lardan, cache'lenmiş ama temizlenmeyen objelerden veya event listener'ların kaldırılmamasından kaynaklanır.

Çözüm 6: Monitoring ve Alerting Kurulumu

OOMKilled hatalarını önlemenin en iyi yolu, proaktif monitoring ve alerting kurmaktır. Alesta Web olarak Prometheus + Grafana stack'ini öneriyoruz.

Prometheus Alert Kuralları (Prometheus Alert Rules)

groups:
- name: kubernetes-memory-alerts
  rules:
  - alert: ContainerMemoryUsageHigh
    expr: |
      (container_memory_usage_bytes / container_spec_memory_limit_bytes) * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Container memory kullanımı %80'i aştı"
      description: "{{ $labels.pod }} pod'u memory limitinin %{{ $value }}'ini kullanıyor"

  - alert: PodOOMKilled
    expr: |
      kube_pod_container_status_last_terminated_reason{reason="OOMKilled"} == 1
    for: 0m
    labels:
      severity: critical
    annotations:
      summary: "Pod OOMKilled ile sonlandı!"
      description: "{{ $labels.pod }} pod'u OOMKilled durumunda"

Grafana Dashboard Query'leri (Grafana Dashboard Queries)

# Memory kullanım yüzdesi
(container_memory_usage_bytes{pod=~"my-app.*"} / container_spec_memory_limit_bytes{pod=~"my-app.*"}) * 100

# OOMKilled event sayısı (son 24 saat)
sum(increase(kube_pod_container_status_last_terminated_reason{reason="OOMKilled"}[24h]))

# Memory kullanım trendi
rate(container_memory_usage_bytes{pod=~"my-app.*"}[5m])
✅ Best Practice / En İyi Uygulama:

Memory kullanımı %70'i geçtiğinde warning, %85'i geçtiğinde critical alert gönderin. Böylece OOMKilled olmadan önce müdahale şansınız olur.

? Kaynaklar ve Referanslar / Sources and References

Bu makalede kullanılan bilgiler aşağıdaki güvenilir kaynaklardan derlenmiştir (information compiled from the following reliable sources):

Alesta Web olarak tüm bilgileri production ortamlarında test ettik ve doğruladık.

✅ Sorun Çözüldü! (Problem Solved!)

Artık Kubernetes OOMKilled hatası (Exit Code 137 memory error) geride kaldı! Alesta Web olarak bu rehberde 6 farklı çözüm yöntemini detaylı şekilde anlattık.

Hızlı Özet / Quick Summary:

  • ✅ OOMKilled = Out of Memory Killed (Exit Code 137)
  • ✅ Memory limit artırma en hızlı çözüm
  • ✅ Request = Limit best practice'i uygulayın
  • ✅ Java uygulamalarında container-aware JVM flags kullanın
  • ✅ VPA ile otomatik scaling yapın
  • ✅ Memory leak tespiti için profiling araçları kullanın
  • ✅ Proaktif monitoring ve alerting kurun

Faydalı Linkler / Useful Links:

© 2026 AlestaWeb - Tüm hakları saklıdır. | alestaweb.com

WM Tools
💫

WebMaster Tools

15 Profesyonel Araç