GCP Cloud CLI ile Sanal Makine Yönetimi

Google Cloud’da sanal makine yönetimi söz konusu olduğunda, konsol üzerinden tıkla-bırak yapmak başlangıç için güzel olsa da işler büyüyünce bu yaklaşım sürdürülemez hale gelir. Onlarca VM’i yönetiyorsanız, düzenli snapshot alıyorsanız ya da CI/CD pipeline’larınızda VM operasyonları varsa, gcloud CLI aracı hayat kurtarır. Bu yazıda GCP’nin komut satırı aracını kullanarak VM yönetiminin tüm inceliklerini ele alacağız.

Kurulum ve Yapılandırma

Öncelikle gcloud CLI’yi sisteminize kurmanız gerekiyor. Google Cloud SDK paketini kurduğunuzda gcloud komutu da beraberinde geliyor.

# Linux/macOS için kurulum
curl https://sdk.cloud.google.com | bash
exec -l $SHELL

# Kurulumu doğrula
gcloud version

# Windows için Chocolatey ile
choco install gcloudsdk

Kurulum sonrası ilk yapmanız gereken şey kimlik doğrulaması ve proje yapılandırması:

# Google hesabıyla giriş yap
gcloud auth login

# Uygulama varsayılan kimlik bilgilerini ayarla (servisler için önemli)
gcloud auth application-default login

# Mevcut projeleri listele
gcloud projects list

# Çalışmak istediğin projeyi ayarla
gcloud config set project proje-id-buraya

# Varsayılan bölge ve zone ayarla (her komuta eklemek zorunda kalmamak için)
gcloud config set compute/region europe-west1
gcloud config set compute/zone europe-west1-b

# Yapılandırmayı doğrula
gcloud config list

Pro tip: Farklı projelerle çalışıyorsanız gcloud config configurations ile birden fazla yapılandırma profili oluşturabilirsiniz. Bu sayede gcloud config configurations activate prod diyerek hızlıca ortam değiştirebilirsiniz.

İlk VM Oluşturma

Temel VM oluşturma komutu basit görünse de parametrelerin ne işe yaradığını bilmek kritik:

# Basit bir VM oluştur
gcloud compute instances create web-server-01 
  --machine-type=e2-medium 
  --image-family=debian-12 
  --image-project=debian-cloud 
  --zone=europe-west1-b 
  --boot-disk-size=50GB 
  --boot-disk-type=pd-ssd 
  --tags=http-server,https-server 
  --metadata=startup-script='#!/bin/bash
    apt-get update
    apt-get install -y nginx
    systemctl enable nginx
    systemctl start nginx'

Sık kullandığınız parametreleri açıklayalım:

  • –machine-type: VM’in CPU ve RAM profilini belirler. e2-medium genellikle dev ortamlar için yeterli, production için iş yüküne göre seçin
  • –image-family: Hangi işletim sistemi ailesini kullanacağınızı belirtir, otomatik olarak en güncel imajı seçer
  • –image-project: İmajın bulunduğu GCP projesi. Debian için debian-cloud, Ubuntu için ubuntu-os-cloud
  • –boot-disk-size: Boot disk boyutu, varsayılan 10GB genellikle yetersiz kalır
  • –boot-disk-type: pd-standard (HDD), pd-ssd (SSD), pd-balanced arasında seçim yapın
  • –tags: Firewall kuralları bu tag’lere göre uygulanır, kritik öneme sahiptir
  • –metadata: VM’e özel metadata veya startup script ekler

Mevcut VM’leri Listeleme ve Sorgulama

Bir ortamda ne var ne yok görmek için:

# Tüm VM'leri listele
gcloud compute instances list

# Belirli bir zone'daki VM'leri filtrele
gcloud compute instances list --filter="zone:europe-west1-b"

# Çalışan VM'leri filtrele
gcloud compute instances list --filter="status=RUNNING"

# Belirli bir tag'e sahip VM'leri bul
gcloud compute instances list --filter="tags.items=http-server"

# Özel sütunlarla çıktı al (script'lerde çok işe yarar)
gcloud compute instances list 
  --format="table(name,zone,machineType,status,networkInterfaces[0].accessConfigs[0].natIP)"

# JSON formatında detaylı bilgi
gcloud compute instances describe web-server-01 
  --zone=europe-west1-b 
  --format=json

Gerçek dünya senaryosu: Sabah işe geldiğinizde geceleri otomatik kapatılması gereken dev VM’lerden hangilerinin hala çalıştığını bulmak istiyorsunuz. Bunun için şöyle bir komut işinizi görür:

# Belirli bir label'a sahip çalışan VM'leri bul
gcloud compute instances list 
  --filter="labels.environment=dev AND status=RUNNING" 
  --format="value(name,zone)"

VM Başlatma, Durdurma ve Yeniden Başlatma

Günlük operasyonların en sık kullanılanları:

# VM'i durdur (disk korunur, ücretlendirilmezsiniz ama disk için ücret devam eder)
gcloud compute instances stop web-server-01 --zone=europe-west1-b

# VM'i başlat
gcloud compute instances start web-server-01 --zone=europe-west1-b

# VM'i yeniden başlat
gcloud compute instances reset web-server-01 --zone=europe-west1-b

# Birden fazla VM'i aynı anda durdur
gcloud compute instances stop web-server-01 web-server-02 db-server-01 
  --zone=europe-west1-b

# Async modda çalıştır (komutu beklemeden devam et)
gcloud compute instances stop web-server-01 
  --zone=europe-west1-b 
  --async

Maliyet optimizasyonu için sıklıkla başvurulan bir senaryo: Mesai saatleri dışında dev/test VM’lerini kapatmak. Bunun için Cloud Scheduler + Cloud Functions kombinasyonu kullanılsa da basit cron senaryoları için şöyle bir script hazırlayabilirsiniz:

#!/bin/bash
# dev-vm-shutdown.sh - Cron ile çalıştırılacak script

PROJECT="my-project-id"
ZONE="europe-west1-b"

# Dev etiketli tüm çalışan VM'leri bul ve durdur
gcloud compute instances list 
  --project=$PROJECT 
  --filter="labels.environment=dev AND status=RUNNING" 
  --format="value(name,zone)" | 
while read name zone; do
  echo "Durduruluyor: $name ($zone)"
  gcloud compute instances stop $name 
    --zone=$zone 
    --project=$PROJECT 
    --quiet
done

echo "Tüm dev VM'ler durduruldu: $(date)"

SSH Bağlantısı

GCP’nin en güzel özelliklerinden biri, SSH key yönetimiyle uğraşmadan direkt bağlanabilmek:

# Direkt SSH bağlantısı
gcloud compute ssh web-server-01 --zone=europe-west1-b

# Farklı kullanıcıyla bağlan
gcloud compute ssh username@web-server-01 --zone=europe-west1-b

# Uzak komut çalıştır (bağlanmadan)
gcloud compute ssh web-server-01 
  --zone=europe-west1-b 
  --command="sudo systemctl status nginx"

# Dosya kopyala (SCP benzeri)
gcloud compute scp local-file.conf web-server-01:/etc/myapp/ 
  --zone=europe-west1-b

# VM'den dosya al
gcloud compute scp web-server-01:/var/log/app.log ./logs/ 
  --zone=europe-west1-b

# Tüm bir dizini kopyala
gcloud compute scp --recurse ./config-files/ web-server-01:/home/admin/ 
  --zone=europe-west1-b

IAP (Identity-Aware Proxy) ile SSH: Eğer VM’inizin public IP’si yoksa (ve olmamalıdır production’da), IAP tunnel üzerinden bağlanabilirsiniz:

# IAP tunnel üzerinden SSH
gcloud compute ssh web-server-01 
  --zone=europe-west1-b 
  --tunnel-through-iap

# IAP tunnel'ı port forwarding için kullan (örn: veritabanına bağlanmak)
gcloud compute start-iap-tunnel web-server-01 5432 
  --local-host-port=localhost:5432 
  --zone=europe-west1-b

Bu son komut özellikle production veritabanlarına güvenli erişim için çok kullanışlı. Public IP vermeden, sadece IAP üzerinden erişim sağlıyorsunuz.

Disk Yönetimi

VM’lere disk eklemek, boyutlandırmak ve yönetmek:

# Yeni bir persistent disk oluştur
gcloud compute disks create data-disk-01 
  --size=100GB 
  --type=pd-ssd 
  --zone=europe-west1-b

# Diski VM'e ekle
gcloud compute instances attach-disk web-server-01 
  --disk=data-disk-01 
  --zone=europe-west1-b

# Read-only olarak birden fazla VM'e ekle (paylaşımlı okuma için)
gcloud compute instances attach-disk web-server-02 
  --disk=data-disk-01 
  --mode=ro 
  --zone=europe-west1-b

# Disk boyutunu artır (küçültemezsiniz, dikkat!)
gcloud compute disks resize data-disk-01 
  --size=200GB 
  --zone=europe-west1-b

# Diski VM'den ayır
gcloud compute instances detach-disk web-server-01 
  --disk=data-disk-01 
  --zone=europe-west1-b

# Mevcut diskleri listele
gcloud compute disks list --filter="zone:europe-west1-b"

Snapshot Yönetimi

Yedekleme stratejinizin temel taşı olan snapshot’lar:

# Anlık snapshot al
gcloud compute disks snapshot web-server-01 
  --snapshot-names=web-server-01-$(date +%Y%m%d) 
  --zone=europe-west1-b

# Boot disk dahil tüm disklerin snapshot'ını al
gcloud compute instances describe web-server-01 
  --zone=europe-west1-b 
  --format="value(disks[].source)" | 
tr ';' 'n' | 
while read disk_url; do
  disk_name=$(basename $disk_url)
  echo "Snapshot alınıyor: $disk_name"
  gcloud compute disks snapshot $disk_name 
    --snapshot-names="${disk_name}-backup-$(date +%Y%m%d%H%M)" 
    --zone=europe-west1-b
done

# Mevcut snapshot'ları listele
gcloud compute snapshots list

# Snapshot'tan yeni disk oluştur
gcloud compute disks create restored-disk 
  --source-snapshot=web-server-01-20241215 
  --zone=europe-west1-b

# Eski snapshot'ları temizle (30 günden eski olanlar)
gcloud compute snapshots list 
  --format="value(name,creationTimestamp)" | 
awk -v cutoff="$(date -d '30 days ago' +%Y-%m-%d)" '$2 < cutoff {print $1}' | 
while read snapshot; do
  echo "Siliniyor: $snapshot"
  gcloud compute snapshots delete $snapshot --quiet
done

Machine Type Değiştirme

VM’inizi yükseltmek ya da küçültmek için önce durdurmanız gerekiyor:

# VM'i durdur
gcloud compute instances stop web-server-01 --zone=europe-west1-b

# Machine type değiştir
gcloud compute instances set-machine-type web-server-01 
  --machine-type=e2-standard-4 
  --zone=europe-west1-b

# Tekrar başlat
gcloud compute instances start web-server-01 --zone=europe-west1-b

Metadata ve Label Yönetimi

Label’lar maliyet takibi ve kaynak organizasyonu için kritik:

# Label ekle
gcloud compute instances add-labels web-server-01 
  --labels=environment=production,team=backend,cost-center=engineering 
  --zone=europe-west1-b

# Metadata ekle veya güncelle
gcloud compute instances add-metadata web-server-01 
  --metadata=maintenance-window=sunday,[email protected] 
  --zone=europe-west1-b

# Startup script'i metadata olarak güncelle
gcloud compute instances add-metadata web-server-01 
  --metadata-from-file=startup-script=./startup.sh 
  --zone=europe-west1-b

Firewall Kuralları

VM güvenliği açısından firewall kuralları doğru yapılandırılmalı:

# HTTP trafiğine izin ver (tag bazlı)
gcloud compute firewall-rules create allow-http 
  --direction=INGRESS 
  --priority=1000 
  --network=default 
  --action=ALLOW 
  --rules=tcp:80 
  --source-ranges=0.0.0.0/0 
  --target-tags=http-server

# Belirli bir IP'den SSH'a izin ver
gcloud compute firewall-rules create allow-ssh-office 
  --direction=INGRESS 
  --priority=1000 
  --network=default 
  --action=ALLOW 
  --rules=tcp:22 
  --source-ranges=203.0.113.0/24 
  --target-tags=ssh-allowed

# Mevcut firewall kurallarını listele
gcloud compute firewall-rules list --format="table(name,direction,priority,sourceRanges,targetTags,allowed)"

# Kural sil
gcloud compute firewall-rules delete allow-ssh-office --quiet

Instance Template ve Managed Instance Group

Ölçeklendirme ihtiyacınız varsa template kullanmak şart:

# Instance template oluştur
gcloud compute instance-templates create web-server-template 
  --machine-type=e2-medium 
  --image-family=debian-12 
  --image-project=debian-cloud 
  --boot-disk-size=50GB 
  --boot-disk-type=pd-ssd 
  --tags=http-server,https-server 
  --metadata-from-file=startup-script=./startup.sh 
  --labels=environment=production,role=web

# Managed Instance Group oluştur
gcloud compute instance-groups managed create web-server-group 
  --template=web-server-template 
  --size=3 
  --zone=europe-west1-b

# Otomatik scaling ekle
gcloud compute instance-groups managed set-autoscaling web-server-group 
  --zone=europe-west1-b 
  --min-num-replicas=2 
  --max-num-replicas=10 
  --target-cpu-utilization=0.75 
  --cool-down-period=90

# Grubun durumunu kontrol et
gcloud compute instance-groups managed list-instances web-server-group 
  --zone=europe-west1-b

Pratik Otomasyon Senaryosu

Gerçek bir operasyon senaryosu olarak haftalık bakım penceresi scripti:

#!/bin/bash
# maintenance-window.sh
# Her Pazar gece yarısı çalışır

set -euo pipefail

PROJECT="my-production-project"
REGION="europe-west1"
SLACK_WEBHOOK="https://hooks.slack.com/services/xxx/yyy/zzz"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/maintenance-${TIMESTAMP}.log"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}

notify_slack() {
  curl -s -X POST $SLACK_WEBHOOK 
    -H 'Content-type: application/json' 
    -d "{"text": "$1"}"
}

log "Bakım penceresi başladı"
notify_slack "Haftalık bakım başlıyor - Snapshot alınıyor"

# Production VM'lerinin snapshot'larını al
gcloud compute instances list 
  --project=$PROJECT 
  --filter="labels.environment=production AND status=RUNNING" 
  --format="value(name,zone)" | 
while read name zone; do
  log "Snapshot alınıyor: $name"
  
  # Boot disk adını al
  boot_disk=$(gcloud compute instances describe $name 
    --zone=$zone 
    --project=$PROJECT 
    --format="value(disks[0].source)" | xargs basename)
  
  # Snapshot al
  gcloud compute disks snapshot $boot_disk 
    --snapshot-names="${name}-weekly-${TIMESTAMP}" 
    --zone=$zone 
    --project=$PROJECT 
    --quiet
    
  log "Snapshot tamamlandı: ${name}-weekly-${TIMESTAMP}"
done

# 60 günden eski snapshot'ları temizle
log "Eski snapshot'lar temizleniyor"
CUTOFF_DATE=$(date -d '60 days ago' +%Y-%m-%dT%H:%M:%S)

gcloud compute snapshots list 
  --project=$PROJECT 
  --filter="name~'weekly' AND creationTimestamp < '${CUTOFF_DATE}'" 
  --format="value(name)" | 
while read snapshot; do
  log "Eski snapshot siliniyor: $snapshot"
  gcloud compute snapshots delete $snapshot 
    --project=$PROJECT 
    --quiet
done

log "Bakım penceresi tamamlandı"
notify_slack "Haftalık bakım tamamlandı - Log: $LOG_FILE"

Sık Karşılaşılan Sorunlar ve Çözümleri

Kota hatası aldığınızda: gcloud compute project-info describe --format="value(quotas)" komutuyla mevcut kotaları görüp artırma talebinde bulunabilirsiniz.

VM’e bağlanamıyorsanız: Önce gcloud compute instances get-serial-port-output web-server-01 --zone=europe-west1-b ile serial port çıktısını kontrol edin. Startup script hataları, disk sorunları burada gözükür.

Yanlışlıkla VM sildiyseniz: Silmeden önce snapshot almak alışkanlık haline getirin. Snapshot varsa gcloud compute disks create ile diski geri yükleyip yeni VM’e bağlayabilirsiniz.

Maliyetler şişiyorsa: gcloud compute instances list --format="value(name,zone,machineType,status)" ile tüm VM’leri listeleyin ve gereksiz çalışanları tespit edin. Label kullanımı olmayan VM’ler için --filter="labels.environment:*" sorgusunun tersine bakabilirsiniz.

Sonuç

gcloud CLI, GCP üzerinde VM yönetimini gerçek anlamda verimli hale getiren araçtır. Konsoldan yapabileceğiniz her şeyi komut satırından yapabilirsiniz; üstelik script’leyebilir, otomatize edebilir ve versiyon kontrolüne alabilirsiniz.

Başlangıç için önerim: önce gcloud config ayarlarını doğru yapın, ardından günlük operasyonlarınız için alias’lar oluşturun. Sık kullandığınız uzun komutları .bashrc veya .zshrc dosyasına alias olarak ekleyin. Zamanla kendi toolbox’ınızı oluşturacaksınız ve VM yönetimi artık dakikalar değil, saniyeler içinde gerçekleşecek.

En önemli alışkanlık ise otomasyona geçmeden önce komutları iyi anlamak. --help bayrağını sık kullanın, --dry-run veya --quiet bayraklarını ne zaman kullanacağınızı bilin ve production ortamına her dokunuşta snapshot almayı ihmal etmeyin.

Bir yanıt yazın

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