GCP Artifact Registry Kurulum ve Kullanımı
Konteyner tabanlı geliştirme dünyasında, Docker Hub’a her şeyi atmak artık yetmiyor. Güvenlik politikaları, ağ gecikmeleri, erişim kontrolü ve maliyet optimizasyonu gibi konular söz konusu olduğunda kendi özel registry’ine ihtiyaç duyuyorsun. GCP Artifact Registry tam da burada devreye giriyor. Google’ın Container Registry’nin halefi olan bu servis, sadece Docker image’larıyla sınırlı kalmayıp Maven, npm, Python paketleri ve daha fazlasını da barındırabiliyor. Bu yazıda sıfırdan kurulumdan production ortamında kullanıma kadar her şeyi ele alacağız.
Artifact Registry Nedir ve Neden Kullanmalısın?
Google Cloud’da çalışıyorsan ve CI/CD pipeline’ın varsa, image’larını nerede sakladığın kritik bir karar. Artifact Registry’nin öne çıkan avantajlarına bakalım:
- Bölgesel depolama: Image’larını deployment bölgenine yakın tutarak pull sürelerini düşürürsün
- IAM entegrasyonu: Google Cloud’un IAM sistemiyle tam entegrasyon, servis hesapları üzerinden granüler erişim kontrolü
- Vulnerability scanning: Otomatik güvenlik açığı taraması
- Multi-format destek: Docker, Helm, Maven, npm, Python, Apt, Yum paketleri
- VPC Service Controls: Ağ katmanında izolasyon imkanı
- Artifact Registry vs Container Registry: Container Registry deprecated sürecine girdiği için yeni projelerde Artifact Registry kullanman gerekiyor
Eskiden gcr.io adresini kullanıyordun, şimdi REGION-docker.pkg.dev formatına geçiş yapıyoruz.
Ön Gereksinimler
Başlamadan önce şunların hazır olması gerekiyor:
- Aktif bir GCP projesi
gcloudCLI kurulu ve authenticate edilmiş- Docker kurulu (image işlemleri için)
- Yeterli IAM izinleri (
roles/artifactregistry.adminveya proje sahibi)
gcloud versiyonunu kontrol edelim:
gcloud version
gcloud auth list
gcloud config get-value project
Eğer aktif proje ayarlı değilse:
gcloud config set project YOUR_PROJECT_ID
Artifact Registry API’yi Aktifleştirme
İlk adım olarak Artifact Registry API’sini projen için etkinleştirmen gerekiyor:
# API'yi aktifleştir
gcloud services enable artifactregistry.googleapis.com
# Aktifleştiğini doğrula
gcloud services list --enabled --filter="name:artifactregistry"
API aktifleştirme birkaç dakika sürebilir. Bu süreçte başka bir terminal açıp Docker kurulumunu kontrol edebilirsin.
İlk Repository’yi Oluşturma
Artifact Registry’de image’lar doğrudan bir “repository” içinde saklanır. Container Registry’den farklı olarak, burada önce repository oluşturman gerekiyor.
# Temel Docker repository oluşturma
gcloud artifacts repositories create my-docker-repo
--repository-format=docker
--location=europe-west1
--description="Production Docker images"
# Repository listesini görüntüle
gcloud artifacts repositories list
Repository oluştururken dikkat etmen gereken parametreler:
- –repository-format: docker, maven, npm, python, apt, yum seçenekleri mevcut
- –location: Bölgesel (europe-west1) veya çok bölgeli (europe, us, asia) olabilir
- –description: İnsan tarafından okunabilir açıklama, ekip çalışmasında önemli
- –immutable-tags: Tag’lerin üzerine yazılmasını engeller, production için kritik
- –kms-key: Customer-managed encryption key için KMS key adı
Bir de multi-region repository oluşturalım, enterprise senaryolarda bu çok işe yarıyor:
# Multi-region repository
gcloud artifacts repositories create global-images
--repository-format=docker
--location=europe
--description="Globally distributed images"
--immutable-tags
Docker Authentication Yapılandırması
Repository’yi oluşturduk, şimdi Docker’ın bu registry’ye push/pull yapabilmesi için kimlik doğrulamasını ayarlamamız gerekiyor.
# gcloud credential helper'ı Docker'a ekle
gcloud auth configure-docker europe-west1-docker.pkg.dev
# Birden fazla bölge için virgülle ayırarak ekleyebilirsin
gcloud auth configure-docker
europe-west1-docker.pkg.dev,us-central1-docker.pkg.dev,asia-east1-docker.pkg.dev
Bu komut ~/.docker/config.json dosyasını günceller. Dosyanın içeriğine bakalım:
cat ~/.docker/config.json
CI/CD ortamlarında servis hesabı kullanarak authenticate olmak daha güvenli:
# Servis hesabı JSON key'i ile authenticate ol
cat service-account-key.json | docker login
-u _json_key
--password-stdin
https://europe-west1-docker.pkg.dev
Image Push ve Pull İşlemleri
Şimdi gerçek işe gelelim. Önce basit bir örnek yapalım:
# Mevcut bir image'ı tag'le
docker pull nginx:latest
docker tag nginx:latest europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/my-docker-repo/nginx:latest
# Registry'ye push et
docker push europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/my-docker-repo/nginx:latest
# Image listesini görüntüle
gcloud artifacts docker images list
europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/my-docker-repo
# Belirli bir image'ın tag'lerini listele
gcloud artifacts docker images list
europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/my-docker-repo/nginx
--include-tags
Artifact Registry’deki tam image path formatı şu şekilde: LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG
Gerçek Dünya Senaryosu: Microservice CI/CD Pipeline
Diyelim ki bir e-ticaret uygulamanın microservice’lerini yönetiyorsun. Aşağıdaki Dockerfile ve pipeline yapısını düşün:
# Örnek uygulama build ve push scripti
#!/bin/bash
PROJECT_ID=$(gcloud config get-value project)
REGION="europe-west1"
REPO="production-images"
SERVICE_NAME="order-service"
GIT_SHA=$(git rev-parse --short HEAD)
BRANCH=$(git rev-parse --abbrev-ref HEAD)
REGISTRY="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO}"
# Image'ı iki tag ile push et: git SHA ve latest
docker build -t "${REGISTRY}/${SERVICE_NAME}:${GIT_SHA}"
-t "${REGISTRY}/${SERVICE_NAME}:latest"
./services/order-service/
docker push "${REGISTRY}/${SERVICE_NAME}:${GIT_SHA}"
docker push "${REGISTRY}/${SERVICE_NAME}:latest"
echo "Pushed: ${REGISTRY}/${SERVICE_NAME}:${GIT_SHA}"
Bu yapıda git SHA ile tag’lemek, hangi commit’in production’da çalıştığını izlemeni sağlar. latest tag’i ise hızlı deploy için kullanışlı.
IAM ve Erişim Yönetimi
Artifact Registry’nin en güçlü yanlarından biri IAM entegrasyonu. Farklı ekiplere, servis hesaplarına ve ortamlara göre erişim kontrolü yapabilirsin.
# Bir servis hesabına okuma izni ver (GKE node pool için idealdir)
gcloud artifacts repositories add-iam-policy-binding my-docker-repo
--location=europe-west1
--member="serviceAccount:gke-nodes@YOUR_PROJECT_ID.iam.gserviceaccount.com"
--role="roles/artifactregistry.reader"
# CI/CD servis hesabına yazma izni ver
gcloud artifacts repositories add-iam-policy-binding my-docker-repo
--location=europe-west1
--member="serviceAccount:ci-cd-runner@YOUR_PROJECT_ID.iam.gserviceaccount.com"
--role="roles/artifactregistry.writer"
# Mevcut IAM policy'yi görüntüle
gcloud artifacts repositories get-iam-policy my-docker-repo
--location=europe-west1
Builtin roller şunlar:
- roles/artifactregistry.reader: Sadece okuma, GKE node’ları ve production sunucuları için
- roles/artifactregistry.writer: Okuma ve yazma, CI/CD runner’ları için
- roles/artifactregistry.repoAdmin: Repository yönetimi, DevOps ekibi için
- roles/artifactregistry.admin: Tam kontrol, sadece güvenilir admin hesapları için
Vulnerability Scanning Yapılandırması
Artifact Registry, Container Analysis API ile entegre çalışarak otomatik güvenlik taraması yapabilir:
# Container Scanning API'yi etkinleştir
gcloud services enable containerscanning.googleapis.com
# Vulnerability'leri listele
gcloud artifacts docker images list-vulnerabilities
europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/my-docker-repo/nginx:latest
--format="table(vulnerability.effectiveSeverity, vulnerability.cvssScore, resource.uri)"
# Sadece kritik açıkları filtrele
gcloud artifacts docker images list-vulnerabilities
europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/my-docker-repo/nginx:latest
--filter="vulnerability.effectiveSeverity=CRITICAL"
Bu bilgileri CI/CD pipeline’ında kullanarak kritik açık içeren image’ların production’a geçmesini engelleyebilirsin. Örneğin Cloud Build adımına şu kontrolü ekleyebilirsin:
# Kritik vulnerability kontrolü (CI/CD scripti olarak kullan)
#!/bin/bash
IMAGE_PATH="europe-west1-docker.pkg.dev/${PROJECT_ID}/my-docker-repo/${IMAGE_NAME}:${TAG}"
CRITICAL_COUNT=$(gcloud artifacts docker images list-vulnerabilities
"${IMAGE_PATH}"
--filter="vulnerability.effectiveSeverity=CRITICAL"
--format="value(vulnerability.cvssScore)" | wc -l)
if [ "${CRITICAL_COUNT}" -gt "0" ]; then
echo "HATA: ${CRITICAL_COUNT} kritik guvenlik acigi bulundu!"
echo "Deploy islemi durduruldu."
exit 1
fi
echo "Guvenlik taramasi gecti. Deploy devam ediyor..."
Cleanup Politikaları ve Maliyet Yönetimi
Üretken bir ortamda image’lar hızla birikir ve depolama maliyetleri artmaya başlar. Artifact Registry’nin cleanup policy özelliği bunu otomatize etmeni sağlar:
# Cleanup policy JSON dosyası oluştur
cat > cleanup-policy.json << 'EOF'
[
{
"name": "delete-old-images",
"action": {"type": "Delete"},
"condition": {
"olderThan": "2592000s",
"tagState": "TAGGED",
"tagPrefixes": ["dev-", "test-"]
}
},
{
"name": "keep-minimum-versions",
"action": {"type": "Keep"},
"mostRecentVersions": {
"keepCount": 5
}
}
]
EOF
# Cleanup policy'yi uygula
gcloud artifacts repositories set-cleanup-policies my-docker-repo
--location=europe-west1
--policy=cleanup-policy.json
# Mevcut cleanup policy'leri görüntüle
gcloud artifacts repositories list-cleanup-policies my-docker-repo
--location=europe-west1
Bu yapılandırmayla dev- ve test- prefix’li 30 günden eski tag’li image’lar otomatik silinir, ama her image için en az 5 versiyon saklanır. Production image’larına dokunulmaz.
GKE ile Entegrasyon
GKE cluster’ın Artifact Registry’den image çekebilmesi için Workload Identity veya node servis hesabı izinlerini doğru yapılandırman gerekiyor:
# GKE cluster'ın servis hesabını bul
gcloud container clusters describe my-cluster
--zone=europe-west1-b
--format="value(nodeConfig.serviceAccount)"
# Bu servis hesabına registry reader izni ver
NODE_SA="your-node-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com"
gcloud artifacts repositories add-iam-policy-binding my-docker-repo
--location=europe-west1
--member="serviceAccount:${NODE_SA}"
--role="roles/artifactregistry.reader"
# Kubernetes deployment manifest örneği
cat > deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
spec:
containers:
- name: order-service
image: europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/my-docker-repo/order-service:abc1234
ports:
- containerPort: 8080
EOF
kubectl apply -f deployment.yaml
Terraform ile Infrastructure as Code
Ekip olarak çalışıyorsan, repository’leri Terraform ile yönetmek çok daha mantıklı:
# main.tf örneği - bash olarak gösteriyoruz ama bu Terraform HCL
cat > main.tf << 'EOF'
resource "google_artifact_registry_repository" "my_repo" {
location = "europe-west1"
repository_id = "production-images"
description = "Production Docker images managed by Terraform"
format = "DOCKER"
docker_config {
immutable_tags = true
}
cleanup_policies {
id = "delete-dev-images"
action = "DELETE"
condition {
older_than = "2592000s"
tag_prefixes = ["dev-", "test-", "pr-"]
}
}
cleanup_policies {
id = "keep-minimum-versions"
action = "KEEP"
most_recent_versions {
keep_count = 10
}
}
}
resource "google_artifact_registry_repository_iam_member" "ci_writer" {
location = google_artifact_registry_repository.my_repo.location
repository = google_artifact_registry_repository.my_repo.name
role = "roles/artifactregistry.writer"
member = "serviceAccount:ci-runner@${var.project_id}.iam.gserviceaccount.com"
}
EOF
# Terraform workflow
terraform init
terraform plan
terraform apply
Terraform ile yönetilen infrastructure’da yanlışlıkla manuel değişiklik yapılmasının önüne geçebilir, tüm konfigürasyonu Git’te takip edebilirsin.
Monitoring ve Alerting
Artifact Registry aktivitelerini Cloud Monitoring ile takip etmek iyi bir pratik:
# Son aktiviteleri görüntüle
gcloud logging read
'resource.type="audited_resource" AND resource.labels.service="artifactregistry.googleapis.com"'
--limit=20
--format="table(timestamp, protoPayload.methodName, protoPayload.authenticationInfo.principalEmail)"
# Storage kullanımını kontrol et
gcloud artifacts repositories describe my-docker-repo
--location=europe-west1
--format="yaml(sizeBytes)"
Sık Karşılaşılan Sorunlar ve Çözümler
“Permission denied” hatası alıyorsun:
# Token'ını yenile
gcloud auth login
gcloud auth configure-docker europe-west1-docker.pkg.dev
# Servis hesabı kullanıyorsan
gcloud auth activate-service-account --key-file=key.json
gcloud auth configure-docker europe-west1-docker.pkg.dev
Image push çok yavaş: Bölge seçimine dikkat et. Türkiye’den push/pull yapıyorsan europe-west1 (Belçika) veya europe-west3 (Frankfurt) genellikle en hızlı seçenek.
“Repository not found” hatası: Registry URL formatını kontrol et. Format mutlaka LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE:TAG şeklinde olmalı.
# Doğru format kontrolü
echo "europe-west1-docker.pkg.dev/my-project-123/my-docker-repo/my-app:v1.0.0"
# ^LOCATION ^PROJECT_ID ^REPO_NAME ^IMAGE ^TAG
Sonuç
Artifact Registry, GCP ekosisteminde ciddi bir Docker ve paket yönetimi ihtiyacını karşılayan, güvenli ve ölçeklenebilir bir çözüm. Özellikle IAM entegrasyonu, bölgesel depolama ve vulnerability scanning özellikleri production ortamları için vazgeçilmez.
Başlangıç için şu adımları takip et: API’yi aktifleştir, bölgesel bir repository oluştur, IAM izinlerini servis hesapları üzerinden yapılandır, cleanup policy’lerini mutlaka ekle. Container Registry kullanıyorsan migration için Google’ın resmi araçları mevcut, geçişi erken yap çünkü Container Registry deprecated sürecine girdi.
Terraform ile repository’lerini kod olarak yönetmek uzun vadede sana çok zaman kazandıracak. CI/CD pipeline’ınla entegre ettiğinde vulnerability scanning katmanını da eklemeyi ihmal etme. Güvenli deployment, hızlı deployment kadar önemli.
