Kapsayıcı teknolojiler, modern yazılım geliştirme ve dağıtım süreçlerinin temelini oluşturmaktadır. Docker ve Kubernetes, bu alandaki en güçlü ve yaygın kullanılan araçlardır. Uygulamaların tutarlı bir şekilde çalışmasını sağlama, kaynak verimliliğini artırma ve dağıtım süreçlerini otomatize etme gibi birçok avantaj sunsalar da, karmaşık yapıları nedeniyle zaman zaman hata kodları ve sorunlarla karşılaşmak kaçınılmazdır. Bu rehber, Docker ve Kubernetes ortamlarında sıkça karşılaşılan hata kodlarını detaylandırmakta, bu hataların temel nedenlerini açıklamakta ve etkili çözüm stratejileri sunmaktadır. Amacımız, geliştiricilerin ve operasyon ekiplerinin bu sorunları hızla teşhis etmelerine ve çözmelerine yardımcı olarak kesintisiz bir iş akışı sağlamaktır.
- 1. Docker Hataları ve Çözüm Stratejileri
- 1.1. 1. Cannot connect to the Docker daemon
- 1.2. 2. Image not found / No such image
- 1.3. 3. Port is already allocated / Bind for <port> failed: port is already in use
- 1.4. 4. Out of memory / Docker build failed with exit code 137
- 2. Kubernetes Hataları ve Çözüm Stratejileri
- 2.1. 1. ImagePullBackOff / ErrImagePull
- 2.2. 2. CrashLoopBackOff
- 2.3. 3. Pending (Pod Durumu)
- 2.4. 4. OOMKilled (Out of Memory Killed)
- 2.5. 5. Evicted (Pod Durumu)
- 3. Genel Sorun Giderme Stratejileri
- 4. Proaktif Önlemler ve En İyi Uygulamalar
- 5. Sonuç
Docker Hataları ve Çözüm Stratejileri
Docker, uygulamaları izole edilmiş kapsayıcılarda çalıştırmak için kullanılan güçlü bir platformdur. Ancak, imaj oluşturma, kapsayıcı çalıştırma veya ağ yapılandırması sırasında çeşitli hatalarla karşılaşılabilir. Bu bölümde, en yaygın Docker hatalarını ve bunların üstesinden gelmek için atılması gereken adımları inceleyeceğiz.
1. Cannot connect to the Docker daemon
Neden: Bu hata genellikle Docker hizmetinin çalışmıyor olması, kullanıcı izinlerinin yetersiz olması veya Docker soketine erişim sorunlarından kaynaklanır.
- Çözüm:
- Docker hizmetini başlatın:
sudo systemctl start dockerveyasudo service docker startkomutlarını kullanın. - Kullanıcınızı docker grubuna ekleyin:
sudo usermod -aG docker $USERkomutunu çalıştırın ve değişikliğin etkili olması için oturumu kapatıp tekrar açın veya sistemi yeniden başlatın. - Soket yolunu kontrol edin:
DOCKER_HOSTortam değişkeninin doğru ayarlandığından emin olun. Varsayılan olarakunix:///var/run/docker.sockolmalıdır.
- Docker hizmetini başlatın:
2. Image not found / No such image
Neden: İstenen Docker imajı yerel depoda bulunamıyor veya belirtilen isim/etiket (tag) yanlış. Bu, genellikle bir yazım hatası veya imajın henüz çekilmemiş olmasından kaynaklanır.
- Çözüm:
- İmaj adını ve etiketini dikkatlice kontrol edin. Küçük/büyük harf duyarlılığına dikkat edin.
docker imageskomutu ile yerel imajlarınızı listeleyin ve aradığınız imajın mevcut olduğundan emin olun.- İmajı Docker Hub’dan veya başka bir kayıt defterinden çekin:
docker pull <image_name>:<tag>. Örneğin:docker pull nginx:latest. - Özel bir kayıt defteri kullanıyorsanız,
docker login <registry_url>komutu ile kimlik doğrulamasını yaptığınızdan emin olun.
3. Port is already allocated / Bind for <port> failed: port is already in use
Neden: Kapsayıcının ana bilgisayar üzerinde yayınlamaya çalıştığı port (-p parametresi ile belirtilen) zaten başka bir uygulama veya kapsayıcı tarafından kullanılıyor. Bu, genellikle başka bir hizmetin aynı port üzerinde çalışması durumunda ortaya çıkar.
- Çözüm:
- Kullanılan portu değiştirmeyi deneyin:
docker run -p <yeni_ana_bilgisayar_portu>:<kapsayıcı_portu> <image>. Örneğin, 80 yerine 8080 kullanın. - Portu kullanan süreci bulun ve durdurun: Linux için
sudo lsof -i :<port>veyasudo netstat -tulpn | grep :<port>, Windows içinnetstat -ano | findstr :<port>komutlarını kullanın. Ardından ilgili süreci sonlandırın. - Mevcut çalışan kapsayıcıların port eşleşmelerini kontrol edin:
docker pskomutu ile hangi kapsayıcıların hangi portları kullandığını görebilirsiniz.
- Kullanılan portu değiştirmeyi deneyin:
4. Out of memory / Docker build failed with exit code 137
Neden: Kapsayıcı veya Docker derleme işlemi sırasında sistem kaynakları (özellikle RAM) tükeniyor. Exit code 137, genellikle bir sürecin işletim sistemi tarafından “Out of Memory Killer” (OOM Killer) tarafından sonlandırıldığını gösterir.
- Çözüm:
- Docker’a daha fazla bellek ayırın: Docker Desktop kullanıyorsanız, ayarlar menüsünden Docker Engine’e ayrılan bellek miktarını artırın.
- Kapsayıcı için bellek sınırlarını artırın:
docker run -m <bellek_miktarı> <image>komutu ile kapsayıcıya daha fazla bellek tahsis edin (örneğin,-m 2g). - Uygulamanızın bellek tüketimini optimize edin: Uygulama kodunuzda bellek sızıntıları olup olmadığını kontrol edin veya daha verimli algoritmalar kullanın.
- Derleme sırasında büyük dosyaları önbelleğe almayı veya daha küçük baz imajları kullanmayı düşünün. Multi-stage builds (çok aşamalı derlemeler) bu konuda oldukça etkilidir.
Kubernetes Hataları ve Çözüm Stratejileri
Kubernetes, kapsayıcılı uygulamaları otomatik olarak dağıtmak, ölçeklendirmek ve yönetmek için tasarlanmış güçlü bir orkestrasyon platformudur. Kubernetes’in karmaşık yapısı, Pod zamanlama, ağ iletişimi veya kaynak yönetimi gibi çeşitli hata senaryolarına yol açabilir. Bu bölümde, en sık karşılaşılan Kubernetes hatalarını ve bunların üstesinden gelmek için kullanılabilecek stratejileri ele alacağız.
1. ImagePullBackOff / ErrImagePull
Neden: Kubernetes, Pod’un çalıştırması gereken kapsayıcı imajını çekemiyor. Bu, yanlış imaj adı, yanlış etiket, kayıt defteri kimlik doğrulama sorunları, ağ sorunları veya kayıt defterinin erişilemez olması gibi çeşitli nedenlerden kaynaklanabilir.
- Çözüm:
- İmaj adını ve etiketini kontrol edin:
kubectl describe pod <pod_adı>komutunun çıktısındaki “Events” bölümünü inceleyin. Genellikle burada hatanın nedeni açıkça belirtilir. - Kayıt defteri erişimini doğrulayın: Özel bir kayıt defteri kullanıyorsanız, Pod tanımınızda
imagePullSecrets‘ın doğru yapılandırıldığından ve geçerli kimlik bilgilerini içerdiğinden emin olun. - Ağ bağlantısını kontrol edin: Kubernetes düğümlerinin kayıt defterine erişip erişemediğini doğrulayın. Bir düğümden
curl <registry_url>komutu ile test yapabilirsiniz. - İmajın varlığını doğrulayın: Kayıt defterinde imajın belirtilen ad ve etiketle gerçekten mevcut olduğundan emin olun.
- İmaj adını ve etiketini kontrol edin:
2. CrashLoopBackOff
Neden: Pod içindeki bir kapsayıcı sürekli olarak başlıyor, kısa bir süre çalışıyor ve ardından çöküyor. Bu genellikle uygulama içindeki bir hata, yanlış yapılandırma, eksik bağımlılıklar, kaynak yetersizliği veya sağlık kontrolü (liveness probe) başarısızlığı gibi nedenlerden kaynaklanır.
- Çözüm:
- Pod loglarını kontrol edin:
kubectl logs <pod_adı>komutu ile mevcut logları,kubectl logs --previous <pod_adı>komutu ile de önceki çalıştırmanın loglarını inceleyin. Bu genellikle sorunun kök nedenini ortaya çıkarır. - Pod olaylarını inceleyin:
kubectl describe pod <pod_adı>komutunun “Events” bölümü, kapsayıcının neden çöktüğüne dair ipuçları verebilir (örneğin, OOMKilled). - Uygulama kodunu ve yapılandırmasını kontrol edin: Ortam değişkenleri, mount edilen birimler, başlangıç komutları veya uygulama içi yapılandırma dosyaları hatalı olabilir.
- Kaynak isteklerini ve limitlerini gözden geçirin: Pod’a yeterli CPU ve bellek ayrıldığından emin olun. Yetersiz kaynaklar, uygulamanın çökmesine neden olabilir.
- Liveness ve Readiness Problarını gözden geçirin: Probların doğru yapılandırıldığından ve uygulamanın durumunu doğru yansıttığından emin olun.
- Pod loglarını kontrol edin:
3. Pending (Pod Durumu)
Neden: Pod, bir düğüme atanmayı bekliyor ve başlatılamıyor. Bu durum genellikle kümede uygun kaynak olmaması (CPU, bellek), düğüm seçici kısıtlamaları (nodeSelector, affinity), taints ve tolerations veya persistent volume sorunlarından kaynaklanır.
- Çözüm:
- Pod olaylarını inceleyin:
kubectl describe pod <pod_adı>komutunun “Events” bölümü, Pod’un neden zamanlanamadığına dair bilgiler içerir (örneğin, “FailedScheduling” mesajı ve nedeni). - Küme kaynaklarını kontrol edin:
kubectl get nodesvekubectl describe node <node_adı>komutları ile düğümlerdeki boş kaynakları (CPU, bellek) kontrol edin. Yetersiz kaynak varsa yeni düğüm eklemeyi düşünün. - Kaynak isteklerini ve limitlerini azaltın: Pod’un istediği kaynaklar mevcut düğümlerdeki boş kaynaklardan fazlaysa, Pod zamanlanamaz. İstekleri gerçekçi seviyelere çekin.
- NodeSelector veya tolerations’ı kontrol edin: Pod’un belirli bir düğüme atanmasını zorlayan kısıtlamaları gözden geçirin. Yanlış yapılandırma Pod’un zamanlanmasını engelleyebilir.
- PersistentVolumeClaim durumunu kontrol edin: Eğer Pod bir PVC’ye ihtiyaç duyuyorsa, PVC’nin
Bounddurumda olduğundan ve ilgili PersistentVolume’un (PV) mevcut olduğundan emin olun.
- Pod olaylarını inceleyin:
4. OOMKilled (Out of Memory Killed)
Neden: Pod içindeki bir kapsayıcı, kendisine ayrılan bellek limitini aştığı için işletim sistemi (OOM Killer) tarafından sonlandırıldı. Bu, genellikle uygulama içinde bir bellek sızıntısı veya yetersiz bellek limitleri nedeniyle olur. Kubernetes, Pod’u yeniden başlatmaya çalışır, bu da CrashLoopBackOff durumuna yol açabilir.
- Çözüm:
- Pod loglarını ve olaylarını inceleyin:
kubectl logs <pod_adı>vekubectl describe pod <pod_adı>komutları ile bellek tüketiminin ne zaman arttığını ve OOMKilled olayını gözlemleyin. - Uygulamanın bellek tüketimini analiz edin: Uygulamanızın gerçek bellek ihtiyacını belirlemek için performans izleme araçları kullanın.
- Bellek limitlerini artırın: Pod tanımındaki
resources.limits.memorydeğerini artırın. Ancak bu sadece geçici bir çözüm olabilir; asıl sorun uygulamadaki bellek sızıntısı veya verimsiz bellek kullanımı olabilir. - Uygulamanızı optimize edin: Bellek tüketimini azaltacak kod optimizasyonları yapın veya daha az bellek tüketen alternatif kütüphaneler/çerçeveler kullanın.
- Pod loglarını ve olaylarını inceleyin:
5. Evicted (Pod Durumu)
Neden: Düğümdeki kaynak yetersizliği (disk alanı, bellek) veya düğümün sağlıksız durumu (örneğin, ağ bağlantısı sorunları) nedeniyle Kubernetes tarafından bir Pod düğümden çıkarıldı. Kubernetes, kümenin kararlılığını sağlamak için bu tür Pod’ları tahliye eder.
- Çözüm:
- Düğüm kaynaklarını kontrol edin:
kubectl describe node <node_adı>komutu ile disk alanı, bellek ve diğer kaynak kullanımını inceleyin. ÖzellikleAllocatableveCapacitydeğerlerine bakın. - Gereksiz Pod’ları kaldırın: Düğümdeki diğer Pod’ların kaynak tüketimini azaltın veya bunları başka düğümlere taşıyın.
- Düğümün sağlığını iyileştirin: Düğümdeki gereksiz dosyaları temizleyin, disk alanını genişletin veya düğümdeki sistem kaynaklarını artırın.
- Pod’ların kaynak isteklerini ve limitlerini gözden geçirin: Aşırı kaynak talep eden Pod’ları optimize edin veya daha gerçekçi sınırlar belirleyin.
- Kubelet yapılandırmasını kontrol edin: Kubelet’in tahliye eşiklerini (eviction thresholds) gözden geçirin.
- Düğüm kaynaklarını kontrol edin:
Genel Sorun Giderme Stratejileri
Hem Docker hem de Kubernetes ortamlarında sorun giderme süreçlerini hızlandıracak evrensel yaklaşımlar mevcuttur. Bu stratejiler, hangi teknolojiyi kullanıyor olursanız olun, sorunların kök nedenini bulmanıza yardımcı olacaktır.
- Logları İnceleyin: En önemli ilk adımdır. Uygulamanın ne yaptığını, nerede takıldığını veya neden çöktüğünü anlamanın birincil yoludur.
- Docker için:
docker logs <container_id_or_name> - Kubernetes için:
kubectl logs <pod_name>, önceki çalıştırmanın logları içinkubectl logs --previous <pod_name>
- Docker için:
- Olayları Kontrol Edin: Kubernetes’te
kubectl describe <resource_type> <resource_name>komutu (özellikle Pod’lar için) “Events” bölümünde değerli bilgiler sunar. Bu olaylar, bir Pod’un neden zamanlanamadığı, çekilemediği veya sonlandırıldığı gibi bilgileri içerir. - Kaynak Kullanımını İzleyin: CPU, bellek, disk ve ağ kullanımını düzenli olarak takip edin. Kaynak darboğazları birçok hatanın temel nedeni olabilir.
- Docker için:
docker stats - Kubernetes için:
kubectl top pods,kubectl top nodes(Metrics Server’ın kurulu olması gerekir)
- Docker için:
- Yapılandırmayı Doğrulayın: YAML dosyalarınızın veya Dockerfile’larınızın sözdizimsel olarak ve mantıksal olarak doğru olduğundan emin olun. Küçük bir yazım hatası bile büyük sorunlara yol açabilir.
- Ağ Bağlantısını Test Edin: Kapsayıcılar veya Pod’lar arası iletişimi, dış ağ bağlantısını kontrol edin (
ping,telnet,curlgibi temel ağ araçlarıyla). DNS çözümleme sorunları da yaygın bir hatadır. - Versiyon Uyumluluğunu Kontrol Edin: Docker motoru, Kubernetes sürümü, kubelet, kube-proxy ve uygulamalarınızın bağımlılıkları arasında uyumsuzluklar sorunlara yol açabilir. Her zaman resmi dokümantasyonu kontrol edin.
- Topluluk Kaynaklarından Yararlanın: Stack Overflow, Kubernetes GitHub sorunları, Docker forumları ve diğer çevrimiçi topluluklar, benzer sorunlarla karşılaşmış diğer kullanıcıların deneyimlerini ve çözümlerini barındırır.
Proaktif Önlemler ve En İyi Uygulamalar
Hataları oluşmadan önce önlemek, kesintisiz ve verimli bir operasyon için kritik öneme sahiptir. Aşağıdaki en iyi uygulamalar, kapsayıcı ortamlarınızın daha sağlam olmasını sağlayacaktır:
- Sağlık Kontrolleri (Health Checks) Uygulayın: Kubernetes’te
livenessProbevereadinessProbekullanarak uygulamalarınızın sağlıklı olup olmadığını düzenli olarak kontrol edin ve sağlıksız Pod’ları otomatik olarak yeniden başlatın veya trafikten çıkarın. Bu, uygulama çöküşlerinin etkisini azaltır. - Kaynak İstekleri ve Limitleri Tanımlayın: Pod’larınız için CPU ve bellek
requests(istekler) velimits(limitler) belirleyerek kaynak çekişmesini önleyin ve OOMKilled durumlarını azaltın. Doğru kaynak yönetimi, küme kararlılığı için hayati öneme sahiptir. - Küçük ve Optimize Edilmiş İmajlar Kullanın: Küçük imajlar, güvenlik açıklarını azaltır, çekme sürelerini kısaltır ve disk alanından tasarruf sağlar. Çok aşamalı derlemeler (multi-stage builds) bu konuda oldukça etkilidir.
- Merkezi Loglama ve İzleme Sistemleri: Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana) gibi araçlarla logları ve metrikleri merkezi olarak toplayarak sorunları daha hızlı tespit edin ve proaktif olarak müdahale edin.
- CI/CD Boru Hatlarını Otomatize Edin: Test edilmiş ve güvenilir imajların dağıtımını sağlayarak insan hatasını minimize edin ve dağıtım süreçlerini hızlandırın. Otomatik testler, hataları üretim ortamına ulaşmadan yakalar.
- Güvenlik En İyi Uygulamalarını Takip Edin: Kapsayıcıları root olmayan kullanıcılarla çalıştırın, imajları düzenli olarak güvenlik açıkları için tarayın ve güncel tutun. Minimum ayrıcalık ilkesini uygulayın.
- Düzenli Güncellemeler ve Yama Yönetimi: Docker ve Kubernetes bileşenlerini en son kararlı sürümlerde tutmak, bilinen hatalardan ve güvenlik açıklarından korunmanıza yardımcı olur. Yama ve yükseltme planlarınız olsun.
Sonuç
Docker ve Kubernetes, modern altyapıların vazgeçilmez bileşenleridir ve sağladıkları esneklik ve verimlilikle iş süreçlerini dönüştürmektedirler. Ancak, bu güçlü araçların potansiyelini tam olarak kullanmak, karşılaşılan hata kodlarını anlamayı ve etkili çözüm stratejileri geliştirmeyi gerektirir. Bu rehberde ele alınan yaygın hatalar ve çözüm yöntemleri, sorun giderme yeteneklerinizi güçlendirecek ve daha sağlam, güvenilir kapsayıcı tabanlı sistemler oluşturmanıza yardımcı olacaktır. Unutmayın, her hata bir öğrenme fırsatıdır ve sürekli pratik yaparak ve bilgi birikiminizi artırarak, konteyner teknolojileri dünyasında uzmanlaşabilirsiniz. Kapsayıcı ortamlarınızda karşılaştığınız zorluklar ne olursa olsun, doğru araçlar ve metodolojilerle her zaman bir çözüm bulabilirsiniz.