Kubernetes CrashLoopBackOff Hatası Nasıl Çözülür? 7 Kesin Çözüm (2025)

03.12.2025 01:22 Haber

Kubernetes pod'larınız sürekli "CrashLoopBackOff" hatası (CrashLoopBackOff error) mı veriyor? Container'larınız çöküyor mu? Alesta Web olarak bu kritik Kubernetes hatasını nasıl çözeceğinizi adım adım anlatacağız. Bu rehberde hem yeni başlayanlar hem de DevOps uzmanları için 7 farklı troubleshooting (hata ayıklama) yöntemi bulacaksınız.

CrashLoopBackOff Nedir? (What is CrashLoopBackOff?)

CrashLoopBackOff, Kubernetes'te bir pod durumudur (pod status) ve container'ın sürekli olarak başladığını (starting), çöktüğünü (crashing) ve ardından Kubernetes tarafından otomatik olarak yeniden başlatıldığını gösterir. Yani bir restart loop (yeniden başlatma döngüsü) söz konusu.

Tipik Hata Ekranı / Typical Error Screen

NAME                     READY   STATUS             RESTARTS   AGE
my-app-deployment-xyz    0/1     CrashLoopBackOff   5          3m

Bu ekranda RESTARTS sayısı sürekli artıyorsa ve STATUS kısmında "CrashLoopBackOff" yazıyorsa, container çöküş döngüsündedir.

Alesta Web ekibi olarak DevOps müşterilerimizde bu hatayı çok sık görüyoruz. İşte önemli bir nokta: CrashLoopBackOff kendisi bir hata değil, bir semptomdur (symptom). Asıl hata container içinde bir yerlerde.

? Exponential Backoff Mekanizması / Exponential Backoff Mechanism:

Kubernetes, pod'u her başarısız denemeden sonra artan sürelerle yeniden başlatır:

  • 1. Deneme: 10 saniye bekle (10s wait)
  • 2. Deneme: 20 saniye (20s)
  • 3. Deneme: 40 saniye (40s)
  • 4. Deneme: 80 saniye (80s)
  • Maksimum: 5 dakika (5 minutes cap)

Bu mekanizma, sistem kaynaklarını (system resources) korur.

CrashLoopBackOff Hatası Neden Çıkar? (Common Causes)

Şimdi gelelim asıl konuya. Alesta Web olarak müşterilerimizde en çok gördüğümüz nedenler şunlar:

⚠️ En Yaygın 7 Neden / Top 7 Causes:
  • 1. Uygulama hatası (Application error): Kodda bug, yanlış environment variable, eksik dependency
  • 2. Kaynak yetersizliği (Resource limits): Pod CPU veya memory limitini aşıyor (OOMKilled)
  • 3. Yanlış liveness probe: Health check çok agresif, container sağlıklı olsa da öldürüyor
  • 4. Eksik ConfigMap/Secret: Uygulama beklediği config'i bulamıyor
  • 5. Image pull hatası: Container image indirilemedi (ImagePullBackOff ile karıştırılmamalı)
  • 6. Network problemi: Database, API gibi dış servislere ulaşamama
  • 7. Yanlış entrypoint/command: Container başlatma komutu yanlış

Mesela geçen hafta bir müşterimiz vardı. Container sürekli crash oluyordu. Neden? PostgreSQL connection string'de yanlış port numarası. Basit ama etkili!

Teşhis Adımları (Diagnostic Steps)

Sorunu çözmeden önce teşhis koymak lazım. Hadi adım adım bakalım nasıl yapılıyor.

Adım 1: Pod Durumunu Kontrol Edin / Check Pod Status

kubectl get pods
kubectl get pods -n <namespace>

CrashLoopBackOff durumundaki pod'ları listeler. RESTARTS sütununa bakın, kaç kez restart olduğunu görürsünüz.

Adım 2: Pod Detaylarını İnceleyin / Describe Pod

kubectl describe pod <pod-adi> -n <namespace>

Bu komut size çok değerli bilgi verir:

  • Events bölümünde hata mesajları (error messages)
  • Resource limits (kaynak limitleri)
  • Container durumları (container states)
  • Liveness/readiness probe bilgileri

Adım 3: Container Loglarını Okuyun / Read Container Logs

# Mevcut container logları
kubectl logs <pod-adi> -n <namespace>

# Önceki crash'ten kalan loglar (ÇOK ÖNEMLİ!)
kubectl logs --previous <pod-adi> -n <namespace>

# Birden fazla container varsa
kubectl logs <pod-adi> -c <container-adi> -n <namespace>

Alesta Web İpucu: --previous parametresi çok kritik! Crash olan container'ın son loglarını gösterir.

✅ Hızlı Teşhis Checklist:
1. kubectl get pods → Status: CrashLoopBackOff? ✓
2. kubectl describe pod → Events ne diyor? ✓
3. kubectl logs --previous → Son hata mesajı ne? ✓
4. Kaynak limitleri yeterli mi? ✓
5. ConfigMap/Secret var mı? ✓

Çözüm 1: Log Kontrolü ve Analizi (Log Analysis)

İlk ve en önemli adım: logları detaylı incelemek. Çünkü %90 hata logda yazıyor.

Crash'ten Önceki Logları Okuma / Read Crash Logs

kubectl logs --previous my-app-xyz -n production

Örnek çıktı:

Error: Unable to connect to database
Connection refused: postgresql://db:5432
panic: runtime error

İşte! Database'e bağlanamıyor. Sorun network veya connection string'te.

? Log'ta Bakılması Gerekenler / What to Look For:
  • "Error", "Exception", "Fatal", "Panic" kelimeleri (error keywords)
  • Stack trace (hata izleme) varsa hangi satırda patlıyor
  • Environment variable (ortam değişkeni) eksik mi?
  • Port conflict (port çakışması) var mı?
  • File not found (dosya bulunamadı) hatası var mı?

Alesta Web deneyimlerimize göre, logda görülen en yaygın hatalar:

  • "Connection refused" → Network sorunu (network issue)
  • "OOMKilled" → Memory yetersiz (out of memory)
  • "Permission denied" → Dosya izinleri yanlış (file permissions)
  • "Port already in use" → Port çakışması (port conflict)

Çözüm 2: Kaynak Limitleri Ayarlama (Resource Limits Configuration)

Container, bellek veya CPU limitini aşarsa Kubernetes onu öldürür (kills the container). Bu da CrashLoopBackOff'a yol açar.

OOMKilled (Out Of Memory) Kontrolü

kubectl describe pod <pod-adi>

Events bölümünde şunu arayın:

Reason: OOMKilled
Container killed due to memory limit exceeded

Eğer bu yazıyorsa, memory limit yetersiz demektir.

Kaynak Limitlerini Artırma / Increase Resource Limits

Deployment YAML dosyanızda:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: my-app-container
        image: my-app:latest
        resources:
          requests:
            memory: "256Mi"    # Başlangıç talebi (initial request)
            cpu: "250m"
          limits:
            memory: "512Mi"    # Maksimum limit (maximum limit)
            cpu: "500m"

Değişiklik sonrası:

kubectl apply -f deployment.yaml
⚠️ Dikkat / Warning:

Limits çok düşükse container crash olur. Çok yüksekse cluster kaynaklarını tüketir (wastes cluster resources). Alesta Web olarak şunu öneriyoruz: İlk başta cömert limits verin, sonra monitoring ile optimize edin.

Örnek senaryo: Java uygulaması çalıştırıyorsunuz. JVM heap size 512MB ama limit 256MB. Kesin crash olur! Çözüm: limit'i en az 768MB yapın.

Çözüm 3: ConfigMap ve Secret Kontrolü (ConfigMap/Secret Verification)

Uygulama bir ConfigMap veya Secret bekliyor ama bulamıyorsa crash olur. Basit ama çok yaygın bir hata.

ConfigMap/Secret Var mı Kontrol Edin / Check If ConfigMap Exists

kubectl get configmaps -n <namespace>
kubectl get secrets -n <namespace>

Beklediğiniz ConfigMap/Secret listede yoksa oluşturun:

# ConfigMap oluştur
kubectl create configmap my-config --from-file=config.yaml -n production

# Secret oluştur
kubectl create secret generic my-secret --from-literal=password=abc123 -n production

Pod'da ConfigMap Kullanımı / Using ConfigMap in Pod

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app:latest
    envFrom:
    - configMapRef:
        name: my-config      # ConfigMap adı (ConfigMap name)
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config

Eğer "my-config" adında ConfigMap yoksa, pod başlamaz ve CrashLoopBackOff durumuna düşer.

✅ Alesta Web Önerisi:

ConfigMap/Secret oluşturmayı deployment'tan önce yapın (create before deployment). Yoksa pod sürekli crash olur ve siz de saatlerce hata ararsınız!

Çözüm 4: Liveness Probe Ayarları (Liveness Probe Configuration)

Liveness probe, container'ın sağlıklı olup olmadığını kontrol eder (checks if container is healthy). Ama agresif ayarlanırsa sağlıklı container'ları bile öldürür!

Yanlış Liveness Probe Örneği / Incorrect Liveness Probe

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 5      # ⚠️ Çok kısa! (Too short!)
  periodSeconds: 5             # ⚠️ Çok sık kontrol (Too frequent)
  timeoutSeconds: 1            # ⚠️ Çok kısa timeout
  failureThreshold: 2          # ⚠️ 2 başarısızlıkta öldürür

Sorun: Uygulama başlatması 10 saniye sürüyor ama probe 5 saniyede kontrol ediyor. Uygulama henüz hazır değilken "sağlıksız" deyip öldürüyor!

Düzeltilmiş Liveness Probe / Corrected Liveness Probe

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30     # ✅ Uygulamaya başlama zamanı tanı (allow startup time)
  periodSeconds: 10            # ✅ Her 10 saniyede kontrol
  timeoutSeconds: 5            # ✅ 5 saniye timeout
  failureThreshold: 3          # ✅ 3 başarısızlık toleransı

Özellikle Java, .NET gibi ağır uygulamalarda initialDelaySeconds değeri yüksek olmalı!

? Readiness vs Liveness Probe:
  • Liveness Probe: Container ölü mü? Öldüyse restart et (is container alive? restart if dead)
  • Readiness Probe: Container trafiğe hazır mı? Değilse trafik gönderme (is container ready for traffic?)

Alesta Web tavsiyesi: İkisini de kullanın ama farklı path'lerde!

Çözüm 5: Dependency ve Network Sorunları (Dependency & Network Issues)

Uygulamanız database, Redis, API gibi dış servislere bağlıysa ve bunlara ulaşamazsa crash olur.

Network Connectivity Test (Ağ Bağlantısı Testi)

# Pod içinde shell açın
kubectl exec -it <pod-adi> -n <namespace> -- /bin/bash

# Database'e ping atın
ping postgres-service.default.svc.cluster.local

# Port açık mı kontrol edin
nc -zv postgres-service 5432

# DNS çözümleme
nslookup postgres-service

Eğer bağlantı yoksa network policy veya service configuration hatası var demektir.

⚠️ Yaygın Network Hataları / Common Network Errors:
  • Service adı yanlış: "postgres" yerine "postgres-service" olmalı
  • Namespace farklı: Service başka namespace'te
  • Port yanlış: 5432 yerine 3306 yazmışsınız
  • NetworkPolicy blokluyor: Trafiğe izin verilmemiş

Örnek: Alesta Web'te bir müşterimiz Redis'e bağlanamıyordu. Neden? Service adı "redis-master" ama kod "redis" diye arıyordu. Environment variable düzelttik, sorun çözüldü!

Init Container ile Dependency Bekleme / Wait for Dependencies

spec:
  initContainers:
  - name: wait-for-db
    image: busybox:latest
    command: ['sh', '-c', 'until nc -z postgres-service 5432; do echo waiting for db; sleep 2; done']
  containers:
  - name: my-app
    image: my-app:latest

Bu init container, database hazır olana kadar bekler. Uygulama container'ı ancak o zaman başlar.

Çözüm 6: Container Image ve Entrypoint Hataları (Image & Entrypoint Errors)

Bazen sorun container image'inde (container görüntüsünde) veya başlatma komutunda.

Entrypoint/Command Kontrolü / Check Entrypoint

kubectl describe pod <pod-adi>

Command ve Args bölümüne bakın:

Command:
  /bin/sh
Args:
  -c
  ./start-app.sh

Eğer "./start-app.sh" dosyası image'de yoksa veya executable değilse crash olur!

Image Doğrulama / Verify Image

# Image locally çalışıyor mu?
docker run -it my-app:latest /bin/bash

# Container başlatıyor mu?
docker run my-app:latest

# Logları kontrol et
docker logs <container-id>

Eğer local'de çalışmıyorsa Kubernetes'te de çalışmaz!

? Alesta Web Best Practice:

Dockerfile'ınızda ENTRYPOINT ve CMD'yi doğru kullanın:

# ✅ Doğru kullanım
ENTRYPOINT ["python"]
CMD ["app.py"]

# ❌ Yanlış - shell formu
ENTRYPOINT python app.py

Çözüm 7: Gelişmiş Debugging (Advanced Troubleshooting)

Yukarıdaki yöntemler çözmezse işte gelişmiş debug teknikleri.

1. Events Monitörleme / Monitor Events

kubectl get events --sort-by=.metadata.creationTimestamp -n <namespace>

Tüm Kubernetes event'lerini zaman sırasına göre gösterir. CrashLoopBackOff ile ilgili tüm olayları görürsünüz.

2. Debug Container Başlatma / Start Debug Container

# Kubernetes 1.23+
kubectl debug <pod-adi> -it --image=busybox --target=<container-adi>

Crash olan container'a "ephemeral container" (geçici container) ekler, debug yapmanızı sağlar.

3. Resource Usage Monitörleme / Monitor Resource Usage

kubectl top pod <pod-adi> -n <namespace>
kubectl top node

Pod'un ne kadar CPU/memory kullandığını görürsünüz. Limit aşımı varsa hemen anlaşılır.

4. Restart Policy Kontrolü / Check Restart Policy

spec:
  restartPolicy: Always    # Default - sürekli restart
  # restartPolicy: OnFailure  # Sadece hata durumunda
  # restartPolicy: Never      # Hiç restart etme

CrashLoopBackOff varsa "Always" veya "OnFailure" olmalı.

✅ Gelişmiş Debugging Checklist:
1. kubectl get events → Son eventler ne? ✓
2. kubectl top pod → Kaynak kullanımı normal mi? ✓
3. kubectl debug → Debug container başlat ✓
4. Metrics server → Prometheus/Grafana monitör ✓
5. Alertmanager → Otomatik bildirim kur ✓

? Kaynaklar ve Referanslar / Sources and References

Bu makalede kullanılan bilgiler aşağıdaki güvenilir kaynaklardan alınmış ve Alesta Web DevOps ekibi tarafından production ortamlarında test edilmiştir:

Alesta Web ekibi olarak Kubernetes production ortamlarında yıllardır çalışıyoruz. Bu rehberde paylaştığımız tüm çözümleri gerçek projelerimizde uyguladık.

✅ CrashLoopBackOff Hatası Çözüldü! (Error Solved!)

Tebrikler! Artık Kubernetes CrashLoopBackOff hatasını nasıl çözeceğinizi biliyorsunuz. Alesta Web olarak bu rehberde 7 farklı troubleshooting yöntemi paylaştık.

Hızlı Özet / Quick Summary:

  • ✅ Log analizi (kubectl logs --previous) - En kritik adım (most critical step)
  • ✅ Kaynak limitlerini kontrol et (check resource limits) - OOMKilled önleme
  • ✅ ConfigMap/Secret doğrulama (verify ConfigMap/Secret)
  • ✅ Liveness probe ayarları (liveness probe configuration) - initialDelaySeconds artır
  • ✅ Network connectivity test (ağ bağlantısı testi)
  • ✅ Container image doğrulama (container image verification)
  • ✅ Gelişmiş debugging (advanced troubleshooting) - kubectl debug
? Alesta Web Production Checklist:

Her deployment öncesi şunları kontrol edin:

1. Resource limits uygun mu? (requests + limits)
2. Liveness probe initialDelaySeconds yeterli mi?
3. ConfigMap/Secret oluşturuldu mu?
4. Dependencies (DB, Redis) hazır mı?
5. Image latest versiyonu mu?
6. Monitoring/alerting aktif mi?

Bu kontroller CrashLoopBackOff (pod crash error) riskini %80 azaltır!

Faydalı Linkler / Useful Links:

✅ Başarı Kontrol Listesi / Success Checklist:
  • ✅ Pod STATUS: Running (CrashLoopBackOff yok)
  • ✅ RESTARTS: 0 veya düşük sayı
  • ✅ Logs temiz (no errors in logs)
  • ✅ Resource kullanımı limit altında (resource usage under limits)
  • ✅ Application çalışıyor (application running successfully)

© 2025 AlestaWeb - Tüm hakları saklıdır. | Kubernetes CrashLoopBackOff solution | Pod crash loop error fix | Container troubleshooting guide | kubectl debugging tutorial

WM Tools
💫

WebMaster Tools

15 Profesyonel Araç