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
  • gcloud CLI kurulu ve authenticate edilmiş
  • Docker kurulu (image işlemleri için)
  • Yeterli IAM izinleri (roles/artifactregistry.admin veya 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir