Detailed view of fiber optic cables connected to a server rack, showcasing modern technology.

Bir e-ticaret şirketinde 6 region’a yayılan AKS cluster’larını besleyen container registry mimarisi kurduk. Başlangıçta tek bir Standard tier ACR vardı West Europe’ta; her cluster image’leri buradan çekiyordu. Black Friday öncesi yapılan load test’te Singapore cluster’ının pod scheduling’i image pull yüzünden 12-18 saniye sürüyordu, fail rate %3’ü buluyordu. Premium’a geçtik, geo-replication açtık, ACR Tasks ile build pipeline kurduk, image signing ekledik. Bu yazı o yolculuğun pratik notları.

SKU Seçimi: Premium Sadece Geo-replication İçin Değil

Özellik Basic Standard Premium
Aylık baz ücret ~$5 ~$20 ~$167
Storage included 10 GB 100 GB 500 GB
Read/write throughput Düşük Orta Yüksek
Webhooks 2 10 500
Geo-replication Yok Yok Var
Private link Yok Yok Var
Customer-managed keys (CMK) Yok Yok Var
Content trust / Notation signing Yok Yok Var
Token-based auth (repo scope) Yok Yok Var

Multi-region production için Premium şart. Tek region dev/test için Standard yeter. Basic’i sadece kişisel proje veya öğrenme için. Sahada gördüğüm hata: “ACR ucuzdur” varsayımıyla Standard alınması, sonra private link gerekince Premium’a yeniden deploy gerekmesi (in-place upgrade var ama kurulum konfigürasyonu yeniden yapılandırma istiyor).

Geo-replication: Manifest Replication, Layer Lazy Pull

Premium’da bir ACR’ı birden fazla region’a replike edebiliyorsun. Önemli detay: ACR replication “manifest” seviyesinde, layer’lar pull edildiği zaman replike oluyor (lazy). İlk pull yavaş, sonraki pull’lar hızlı.

# Premium ACR oluştur
az acr create -n shopacr -g rg-acr-prod -l westeurope --sku Premium

# Geo-replication ekle
az acr replication create -n shopacr -r westeurope2 -g rg-acr-prod
az acr replication create -n shopacr -r northeurope -g rg-acr-prod
az acr replication create -n shopacr -r southeastasia -g rg-acr-prod
az acr replication create -n shopacr -r eastus -g rg-acr-prod
az acr replication create -n shopacr -r japaneast -g rg-acr-prod

Pull-time bir push edilen image’i bir replica’da pull etmek için ACR DNS akıllı yönlendirme yapıyor: client en yakın region’dan çeker. Singapore AKS cluster’ı shopacr.azurecr.io’yu çözünce southeastasia replica’sına gider.

Geo-replication maliyeti her region için ayrı baz ücret + storage. 6 region × ~~167 USD = ~~1.000 USD/ay sadece replication için. Karşılığında image pull süresi 12-18 saniyeden 2-3 saniyeye indi, fail rate sıfırlandı.

Storage Maliyeti: 500 GB Sandığından Hızlı Doluyor

Premium 500 GB included; üzeri 0.10 USD/GB/ay. CI/CD pipeline her commit için image build edip push ediyorsa bu hızla yığılıyor. Sigorta projesinde 6 ay sonra 2.3 TB’a çıkmıştık (~~180 USD/ay storage).

Çözüm: retention policy ve untagged manifest cleanup:

# Untagged manifestleri 7 günden eski olanları sil (Soft delete enable et önce)
az acr config retention update -n shopacr --status enabled --days 7 --type UntaggedManifests

# Tagged old image'leri purge için ACR Tasks
az acr task create 
  --name purge-old-tags 
  --registry shopacr 
  --cmd "acr purge --filter 'shop/.*:.*' --ago 30d --keep 10 --untagged" 
  --schedule "0 2 * * *" 
  --context /dev/null

Bu task her gece “shop/” başlayan repo’larda 30 günden eski tag’leri siliyor, son 10’unu koruyor, untagged’leri temizliyor. Storage 2.3 TB’tan 600 GB’a indi.

ACR Tasks: Cloud-Side Build Pipeline

ACR Tasks’in iki tipi var:

  • Quick task: Tek seferlik build, lokal Docker yerine. az acr build komutu.
  • Multi-step task: YAML tanımlı, multiple steps (build, test, push, deploy webhook trigger).

Quick task örneği:

az acr build 
  --registry shopacr 
  --image shop/cart-service:v1.4.7 
  --file Dockerfile 
  --platform linux/amd64,linux/arm64 
  .

Multi-platform build (amd64 + arm64) ACR Tasks ile bedava (sadece build dakikası ücretli, ilk 100 dakika/ay free). Lokal’de buildx ile aynısını yapmak yarım saat sürer; ACR Tasks’te 4-6 dakikada biter.

Trigger’lar:

  • Source code commit (GitHub, Azure Repos): main’e push olunca otomatik build.
  • Base image update: Eğer Dockerfile’da FROM mcr.microsoft.com/dotnet/aspnet:8.0 kullanıyorsan, base image güncellendiğinde ACR otomatik yeniden build edip yeni tag push ediyor. CVE patch otomasyonu için altın özellik.
  • Schedule: Cron benzeri, gece purge gibi tekrarlı işler.

Image Signing: Notation ile Supply Chain Security

2026 itibarıyla Microsoft, ACR’da artık Docker Content Trust yerine Notation (Notary v2) öneriyor. Image push edildiğinde key ile imzalanır, AKS pull ederken Ratify policy ile imza doğrulanır.

# Key Vault'ta self-signed signing key oluştur
az keyvault certificate create 
  --vault-name kv-acr-prod 
  --name notation-signing-cert 
  --policy "$(az keyvault certificate get-default-policy)"

# Notation CLI ile imzala
notation sign shopacr.azurecr.io/shop/cart-service:v1.4.7 
  --plugin azure-kv 
  --id "$(az keyvault certificate show -n notation-signing-cert --vault-name kv-acr-prod --query id -o tsv)"

# AKS'de Ratify ile policy enforcement
helm install ratify deislabs/ratify 
  --set akvCertConfig.vaultURI=https://kv-acr-prod.vault.azure.net 
  --set akvCertConfig.cert1Name=notation-signing-cert

Bu setup’tan sonra AKS’de imzasız bir image deploy etmek istersen admission controller bloklar. SBOM ve provenance için bir sonraki adım sigstore/cosign entegrasyonu (deneysel ama olgunlaşıyor).

Private Link: Public Endpoint’i Tamamen Kapat

Premium’da ACR’a Private Endpoint bağlayabilir, public network access’i tamamen kapatabilirsin. Production için strongly recommended.

# Public network access'i kapat
az acr update -n shopacr --public-network-enabled false

# Private endpoint oluştur (her region'da ayrı, geo-replicated için)
az network private-endpoint create 
  --name pe-acr-trwest 
  --resource-group rg-network-prod 
  --vnet-name vnet-hub-prod 
  --subnet snet-pe 
  --private-connection-resource-id $(az acr show -n shopacr -g rg-acr-prod --query id -o tsv) 
  --group-id registry 
  --connection-name acr-pe-trwest

Private DNS zone (privatelink.azurecr.io) kurman lazım. Geo-replicated registry’de her region için ayrı A record (privatelink.azurecr.io.westeurope.data.privatelink.azurecr.io). Manuel kurulumu unutma; “neden Singapore cluster image çekemiyor?” sorusunun cevabı genellikle eksik DNS record.

AKS ile Entegrasyon: Managed Identity vs Service Principal

Eskiden AKS’in ACR’dan pull yapması için service principal kullanırdık. Şimdi Managed Identity standart:

# AKS oluştururken ACR attach
az aks create -n aks-shop-trwest -g rg-aks-prod 
  --enable-managed-identity 
  --attach-acr shopacr 
  --node-resource-group rg-aks-nodes-trwest

# Veya mevcut AKS'e attach
az aks update -n aks-shop-trwest -g rg-aks-prod --attach-acr shopacr

Bu komut arkada AKS kubelet identity’sine ACR’da AcrPull rolü atıyor. Manuel imagePullSecrets yönetmen gerekmiyor.

Cache (Pull-Through Cache): Docker Hub Rate Limit Bypass

Docker Hub anonymous pull rate limit (saatte 100 pull/IP). Production cluster’da bu limit dolar, image pull fail olur. ACR Cache özelliği ile Docker Hub image’lerini ACR üzerinden cache’leyebilirsin:

az acr cache create -r shopacr -n nginx-cache 
  --source-repo "docker.io/library/nginx" 
  --target-repo "cache/nginx"

# Şimdi pull:
docker pull shopacr.azurecr.io/cache/nginx:1.27

İlk pull Docker Hub’dan çeker ve cache’e kaydeder, sonraki pull’lar ACR’dan gelir. Hem rate limit hem de hız sorunu çözülür.

Sahada Düşülen Üç Tuzak

  1. ACR token’ı doğrudan source code’a yazmak: Token expire olduğunda secret rotation acısı başlar. Managed Identity kullan.
  2. Webhook’ları unutmak: ACR’a image push olunca AKS’e haber vermek için webhook kur. Argo CD veya Flux gibi GitOps tool’u image tag güncellemesini takip edip otomatik deploy eder.
  3. Geo-replication’ı write için varsaymak: Replica’lar read-only. Push hep primary region’a olur. Eğer “Singapore’dan push edip Avrupa’ya replike olsun” dersen başka mimari (multi-master setup) gerekir, out-of-box yok.

Sonuç: ACR Bir Storage Değil, Bir Pipeline Bileşeni

Container registry’i basitçe “image dolabı” sanıp Standard’da bırakmak küçük projede sorun değil. Multi-region production, supply chain security, automated CVE patching gibi gereksinimler ortaya çıkınca Premium’un sunduğu özellikler tek tek değer üretiyor. Aylık 1.000-1.500 USD’lik fatura, manuel build pipeline + güvenlik incident’i + image pull yavaşlığı gibi alternatif maliyetlerin yanında ucuz kalıyor.

CloudSpark Cloud üzerinde Kubernetes (CSPK) çalıştırıyorsan, ACR’ın eşdeğeri olarak Harbor veya kendi private registry kurabilirsin; geo-replication için OCI distribution spec ile multi-site mirror tooling var. AKS + ACR kalıbının VHI ekosistemindeki karşılığını standart referans mimarimizde sunuyoruz.

🇹🇷 Türkçe🇬🇧 English🇩🇪 Deutsch🇫🇷 Français🇸🇦 العربية🇷🇺 Русский🇪🇸 Español