Ulaşım
- Adres:Batıkent Mh. 8910 Sk. 6. Etap 1H No: 18 Yeni Toki Eyyübiye / Şanlıurfa (Yeni Alım Satım Karşısı)
- Telefon:0 (545) 528 88 93
- eMail: info@alestaweb.com
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, 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.
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.
Kubernetes, pod'u her başarısız denemeden sonra artan sürelerle yeniden başlatır:
Bu mekanizma, sistem kaynaklarını (system resources) korur.
Şimdi gelelim asıl konuya. Alesta Web olarak müşterilerimizde en çok gördüğümüz nedenler şunlar:
Mesela geçen hafta bir müşterimiz vardı. Container sürekli crash oluyordu. Neden? PostgreSQL connection string'de yanlış port numarası. Basit ama etkili!
Sorunu çözmeden önce teşhis koymak lazım. Hadi adım adım bakalım nasıl yapılıyor.
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.
kubectl describe pod <pod-adi> -n <namespace>
Bu komut size çok değerli bilgi verir:
# 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.
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ı? ✓
İlk ve en önemli adım: logları detaylı incelemek. Çünkü %90 hata logda yazıyor.
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.
Alesta Web deneyimlerimize göre, logda görülen en yaygın hatalar:
Container, bellek veya CPU limitini aşarsa Kubernetes onu öldürür (kills the container). Bu da CrashLoopBackOff'a yol açar.
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.
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
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.
Uygulama bir ConfigMap veya Secret bekliyor ama bulamıyorsa crash olur. Basit ama çok yaygın bir hata.
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
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.
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!
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!
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!
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ı!
Alesta Web tavsiyesi: İkisini de kullanın ama farklı path'lerde!
Uygulamanız database, Redis, API gibi dış servislere bağlıysa ve bunlara ulaşamazsa crash olur.
# 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.
Ö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ü!
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.
Bazen sorun container image'inde (container görüntüsünde) veya başlatma komutunda.
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 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!
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
Yukarıdaki yöntemler çözmezse işte gelişmiş debug teknikleri.
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.
# 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.
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.
spec: restartPolicy: Always # Default - sürekli restart # restartPolicy: OnFailure # Sadece hata durumunda # restartPolicy: Never # Hiç restart etme
CrashLoopBackOff varsa "Always" veya "OnFailure" olmalı.
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 ✓
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.
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:
kubectl logs --previous) - En kritik adım (most critical step)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:
© 2025 AlestaWeb - Tüm hakları saklıdır. | Kubernetes CrashLoopBackOff solution | Pod crash loop error fix | Container troubleshooting guide | kubectl debugging tutorial