mfurkanayhan// çözüm atölyesi
← Yazılar

Altyapı ·

CI'ınız her sabah sessizce ölüyor olabilir — ve loglarda görünmüyor

Hiçbir şey değiştirmediniz. Dün çalışan pipeline bugün alpine:3.19’u çekemiyor. İki megabaytlık bir base layer. Ama Docker Hub servis etmeyi reddediyor.

Sebep sizde değil: ofisinizin çıkış IP’sini paylaşan başka bir ekip, siz kahvenizi almadan günün pull kotasını tüketmiş.

Üç CI runner ve bir geliştirici tek NAT IP üzerinden Docker Hub’a çıkıyor; hepsi aynı 100 pull / 6 saat kotasını paylaşıyor.

Sessizce dolan kota

Docker Hub, kimlik doğrulamasız (anonim) çekimleri IP başına 6 saatte 100 pull ile sınırlıyor. Ücretsiz oturum açmış bir hesapta bu 200’e çıkıyor. Sınır, tek tek geliştiriciye değil, çıkış IP’sine bağlı.

Kritik detay burada: aynı NAT arkasındaki tüm CI runner’ları, tüm Kubernetes node’ları, ofisteki herkes aynı 100’lük kotayı paylaşıyor. Yoğun bir pipeline bunu dakikalar içinde bitirebilir.

Ve “bir pull” sandığınızdan hızlı büyüyor:

  • Multi-stage bir Dockerfile’da her FROM ayrı bir pull sayılır. FROM node:20-alpine + FROM python:3.12-slim = iki pull, daha build başlamadan.
  • Çok mimarili (multi-arch) bir imajda her mimari ayrı pull sayılır.
  • Cache’lenmemiş her soğuk runner, sıfırdan yeni bir istemci gibi davranır.

En kötü kısmı: gürültüsüz patlıyor

Bu hata yüksek sesle çökmüyor. toomanyrequests: You have reached your pull rate limit bir yerde belirir, deploy durur, ama ortada bir stack trace yok. Kod hatası aramaya başlarsınız — oysa sorun kodunuzda değil, komşu ekibin sabah build’lerinde.

Önce: runner doğrudan Docker Hub’a gidiyor ve kota doluyor. Sonra: runner bir registry aynasından çekiyor, Docker Hub’a tek pull düşüyor.

Playbook

  1. Her pull’u kimlik doğrula. En basit kazanç: docker login ile kota IP’den hesaba geçer ve 100’den 200’e çıkar. CI’da bir Docker token’ı yeter.
  2. Pull-through cache / registry mirror kur. Runner’larınız Docker Hub yerine sizin yakınınızdaki bir aynadan çeksin. Aynı imajı gün içinde onlarca kez çekmek tek pull’a düşer.
  3. Kritik imajları kendi registry’nize kopyalayın. Deploy’unuzun ayakta durması, Docker Hub’ın günlük kotasına bağlı kalmasın.

Dürüst nüans

Bu limitler kalıcı ve mantıklı — Docker Hub bir hayır kurumu değil. Amaç limitleri “aşmak” değil, altyapınızı paylaşılan bir dış kotaya bağımlı olmaktan kurtarmak. Mirror kurmak birkaç saatlik iş; ama karşılığında build’leriniz komşu ekibin trafiğinden bağımsız hale gelir.

Özet

  • Anonim pull limiti: IP başına 6 saatte 100 (auth ile 200).
  • Sınır kişiye değil, paylaşılan çıkış IP’sine bağlı.
  • Multi-stage FROM’lar ve multi-arch imajlar pull sayısını sessizce katlar.
  • Çözüm: auth ekle → mirror kur → kritik imajları kendine kopyala.
  • En tehlikeli kısmı: sessizce patlar, kod hatası sanırsınız.

CI’ınız hiç açıklanamayan bir “toomanyrequests” ile durdu mu? Sizde nasıl çözüldü, merak ediyorum.