GCP Compute Engine ile Sanal Makine Oluşturma ve Yönetimi

Google Cloud Platform’da sanal makine yönetimi, bulut altyapısının temel taşlarından birini oluşturuyor. GCP Compute Engine, AWS EC2 veya Azure VM’ye kıyasla daha esnek fiyatlandırma ve bazı durumlarda daha iyi network performansı sunuyor. Bu yazıda sıfırdan bir VM oluşturmaktan başlayıp, günlük operasyonlarda işine yarayacak pratik komutlara kadar her şeyi ele alacağız.

GCP CLI Kurulumu ve Kimlik Doğrulama

Herşeyden önce gcloud CLI aracını kurmamız gerekiyor. Bu araç olmadan GCP’de verimli çalışmak neredeyse imkansız. GUI her şeyi yapabiliyor ama tekrarlanabilir, scriptlenebilir bir ortam istiyorsanız CLI şart.

# Linux'ta gcloud SDK kurulumu
curl https://sdk.cloud.google.com | bash
exec -l $SHELL

# Kurulumu doğrula
gcloud version

# Kimlik doğrulama
gcloud auth login

# Proje ayarla
gcloud config set project YOUR_PROJECT_ID

# Mevcut konfigürasyonu görüntüle
gcloud config list

Eğer birden fazla GCP projesiyle çalışıyorsanız, konfigürasyon profilleri hayat kurtarıyor. Örneğin dev, staging ve prod ortamları için ayrı profiller tutmak, yanlış ortamda komut çalıştırma riskini ciddi ölçüde azaltıyor.

# Yeni konfigürasyon profili oluştur
gcloud config configurations create production
gcloud config configurations create staging

# Profiller arası geçiş
gcloud config configurations activate production

# Mevcut profilleri listele
gcloud config configurations list

VM Oluşturma: Temel Senaryolar

Basit Bir VM Oluşturma

En temel kullanım senaryosundan başlayalım. Bir web uygulaması için standart bir VM oluşturuyorsunuz diyelim.

# Temel bir VM oluştur
gcloud compute instances create web-server-01 
    --project=my-project-id 
    --zone=europe-west1-b 
    --machine-type=e2-medium 
    --image-family=ubuntu-2204-lts 
    --image-project=ubuntu-os-cloud 
    --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'

Bu komutta dikkat edilmesi gereken bazı kritik noktalar var. --tags parametresi firewall kuralları için kullanılıyor, dolayısıyla doğru tag’leri baştan belirlemek sonradan baş ağrısı yaşatmıyor. --metadata=startup-script ise VM ilk açıldığında otomatik çalışacak scripti tanımlıyor, bu özellikle immutable infrastructure yaklaşımı benimsiyorsanız çok işe yarıyor.

Machine Type Seçimi

GCP’nin machine type ailelerini doğru anlamak, hem performans hem de maliyet optimizasyonu açısından kritik.

  • e2 serisi: Genel amaçlı, maliyet odaklı. Dev ve test ortamları için ideal
  • n2 serisi: Dengeli performans, production workload’ları için uygun
  • c2 serisi: Compute yoğun işler, yüksek frekanslı CPU gerektiren uygulamalar
  • m2 serisi: Bellek yoğun uygulamalar, SAP HANA gibi in-memory veritabanları
  • a2 serisi: GPU tabanlı makine öğrenmesi ve HPC workload’ları
# Mevcut machine type'ları listele
gcloud compute machine-types list --zones=europe-west1-b

# Belirli bir aile için filtrele
gcloud compute machine-types list 
    --zones=europe-west1-b 
    --filter="name:e2-*"

Preemptible ve Spot VM’ler

Maliyet optimizasyonu konusuna gelince, preemptible VM’ler (ya da yeni adıyla Spot VM’ler) ciddi tasarruf sağlayabiliyor. Standart fiyatın yüzde 60-91 arası indirim söz konusu. Tabi GCP bunları istediği zaman geri alabildiği için kesintisiz çalışması gereken kritik servisler için uygun değil.

# Preemptible VM oluştur
gcloud compute instances create batch-worker-01 
    --zone=europe-west1-b 
    --machine-type=n2-standard-4 
    --image-family=debian-11 
    --image-project=debian-cloud 
    --preemptible 
    --no-restart-on-failure 
    --maintenance-policy=TERMINATE

# Spot VM oluştur (daha yeni yaklaşım)
gcloud compute instances create ml-training-01 
    --zone=us-central1-a 
    --machine-type=n2-standard-8 
    --image-family=debian-11 
    --image-project=debian-cloud 
    --provisioning-model=SPOT 
    --instance-termination-action=STOP

Gerçek dünya senaryosu: Büyük veri işleme pipeline’ları için preemptible VM’ler kullanıyoruz. İş birden fazla çalıştırma denemesiyle tasarlandığından, VM’nin kesilmesi büyük bir sorun yaratmıyor. Aylık maliyet faturasına baktığımızda bu yaklaşımın yüzde 70’e varan tasarruf sağladığını gördük.

VM Yönetimi ve Günlük Operasyonlar

Temel Yaşam Döngüsü Komutları

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

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

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

# VM'yi sil (dikkatli ol!)
gcloud compute instances delete web-server-01 --zone=europe-west1-b

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

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

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

SSH ile Bağlanma

GCP’nin güzel özelliklerinden biri, SSH key yönetimini büyük ölçüde otomatize etmesi. Manuel key dağıtımıyla uğraşmak zorunda kalmıyorsunuz.

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

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

# Uzaktan komut çalıştır
gcloud compute ssh web-server-01 
    --zone=europe-west1-b 
    --command="sudo systemctl status nginx"

# Port forwarding (local port 8080 -> remote port 80)
gcloud compute ssh web-server-01 
    --zone=europe-west1-b 
    --ssh-flag="-L 8080:localhost:80"

Disk Yönetimi

Production ortamlarında disk yönetimi sık karşılaşılan bir konu. Özellikle veritabanı sunucularında disk doldukça alarm veriyor ve hızlı müdahale gerekiyor.

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

# Diski VM'ye bağla
gcloud compute instances attach-disk web-server-01 
    --disk=data-disk-01 
    --zone=europe-west1-b

# VM içinde diski formatla ve bağla (SSH ile VM'ye girdikten sonra)
# lsblk ile diski bul, genelde /dev/sdb olarak görünür
sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
sudo mkdir -p /mnt/data
sudo mount -o discard,defaults /dev/sdb /mnt/data

# Kalıcı mount için fstab'a ekle
echo UUID=$(sudo blkid -s UUID -o value /dev/sdb) /mnt/data ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab

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

# Mevcut boot diskini boyutlandır (online resize destekleniyor)
gcloud compute disks resize web-server-01 
    --size=100GB 
    --zone=europe-west1-b

Disk resize işlemi GCP tarafında yapıldıktan sonra OS içinde de işlem yapmanız gerekiyor. GCP disk boyutunu artırdı ama Linux bunu hemen görmüyor.

# OS içinde partition ve filesystem'i genişlet
sudo growpart /dev/sda 1
sudo resize2fs /dev/sda1

Ağ Yapılandırması ve Güvenlik

Firewall Kuralları

GCP’de firewall kuralları VM bazında değil, network tag veya servis hesabı bazında uygulanıyor. Bu yaklaşım yönetimi kolaylaştırıyor.

# HTTP trafiğine izin ver
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 erişimine izin ver
gcloud compute firewall-rules create allow-ssh-from-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

# Firewall kuralını sil
gcloud compute firewall-rules delete allow-http

Statik IP Adresi Yönetimi

Production ortamlarında VM’lerin IP adresleri değişmemeli. DNS kayıtları, firewall kuralları, SSL sertifikaları hepsi IP’ye bağlı olduğundan statik IP şart.

# Statik external IP ayır
gcloud compute addresses create web-server-ip 
    --region=europe-west1

# Ayrılan IP adresini görüntüle
gcloud compute addresses describe web-server-ip 
    --region=europe-west1

# VM oluştururken statik IP kullan
gcloud compute instances create web-server-01 
    --zone=europe-west1-b 
    --address=web-server-ip 
    --machine-type=e2-medium 
    --image-family=ubuntu-2204-lts 
    --image-project=ubuntu-os-cloud

# Internal statik IP için
gcloud compute addresses create db-server-internal-ip 
    --region=europe-west1 
    --subnet=default 
    --addresses=10.132.0.100

Instance Template ve Managed Instance Groups

Tek tek VM yönetmek küçük ortamlar için yeterli ama ölçeklenebilir bir yapı kuruyorsanız Instance Template ve Managed Instance Group (MIG) kullanmanız gerekiyor.

# Instance template oluştur
gcloud compute instance-templates create web-server-template 
    --machine-type=e2-medium 
    --image-family=ubuntu-2204-lts 
    --image-project=ubuntu-os-cloud 
    --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'

# Instance template'i listele
gcloud compute instance-templates list

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

# Autoscaling ekle
gcloud compute instance-groups managed set-autoscaling web-server-group 
    --zone=europe-west1-b 
    --min-num-replicas=2 
    --max-num-replicas=10 
    --cpu-utilization-target=0.6

# MIG'e rolling update yap
gcloud compute instance-groups managed rolling-action start-update web-server-group 
    --version=template=web-server-template-v2 
    --zone=europe-west1-b 
    --max-surge=1 
    --max-unavailable=0

Bu son komut özellikle kritik. --max-unavailable=0 demek güncelleme sırasında hiçbir instance’ın kapalı olmayacağını garanti ediyor. --max-surge=1 ise güncelleme sırasında ekstra bir instance açılacağını söylüyor. Zero-downtime deployment için bu parametreler şart.

Snapshot ve Backup Yönetimi

Disk snapshot’ları hem backup hem de VM kopyalama için kullanılıyor. Production’da düzenli snapshot almanız gerekiyor.

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

# Snapshot'ları listele
gcloud compute snapshots list

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

# Otomatik snapshot politikası oluştur
gcloud compute resource-policies create snapshot-schedule daily-backup 
    --region=europe-west1 
    --max-retention-days=7 
    --start-time=02:00 
    --daily-schedule 
    --on-source-disk-delete=keep-auto-snapshots

# Politikayı diske bağla
gcloud compute disks add-resource-policies web-server-01 
    --zone=europe-west1-b 
    --resource-policies=daily-backup

Gerçek dünya notu: Snapshot alırken VM’yi durdurmak zorunda değilsiniz, GCP online snapshot’ı destekliyor. Ama kritik veritabanları için snapshot öncesi flush ve sync yapmakta fayda var, aksi takdirde tutarsız bir veri görüntüsü alabilirsiniz.

İzleme ve Performans Analizi

VM performansını takip etmek için Cloud Monitoring (eski adıyla Stackdriver) kullanıyoruz. Ama bazı şeyleri CLI üzerinden de yapabilirsiniz.

# VM'nin seri port çıktısını görüntüle (boot sorunlarında çok işe yarar)
gcloud compute instances get-serial-port-output web-server-01 
    --zone=europe-west1-b

# Instance metadata'sını görüntüle
gcloud compute instances describe web-server-01 
    --zone=europe-west1-b

# Tüm zone'lardaki VM durumunu özetle
gcloud compute instances list 
    --format="table(name,zone,machineType,status,networkInterfaces[0].accessConfigs[0].natIP)"

# Monitoring için ops agent kur (VM içinde)
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
sudo bash add-google-cloud-ops-agent-repo.sh --also-install
sudo systemctl status google-cloud-ops-agent

Ops Agent kurulumu özellikle önemli. Bu agent olmadan GCP’nin Cloud Monitoring’inde RAM kullanımı, disk I/O gibi detaylı metrikleri göremiyorsunuz. Default olarak sadece CPU ve network gözükür.

Gerçek Dünya: Çok Katmanlı Uygulama Kurulumu

Tipik bir web uygulaması senaryosu: frontend için web sunucuları, backend için uygulama sunucuları ve veritabanı sunucusu.

# Web tier - public erişimli
gcloud compute instances create web-01 
    --zone=europe-west1-b 
    --machine-type=e2-standard-2 
    --image-family=ubuntu-2204-lts 
    --image-project=ubuntu-os-cloud 
    --tags=http-server,https-server,web-tier 
    --network-interface=network=default,subnet=default,address=

# App tier - sadece internal erişim
gcloud compute instances create app-01 
    --zone=europe-west1-b 
    --machine-type=e2-standard-4 
    --image-family=ubuntu-2204-lts 
    --image-project=ubuntu-os-cloud 
    --tags=app-tier 
    --no-address

# DB tier - sadece app tier'dan erişim
gcloud compute instances create db-01 
    --zone=europe-west1-b 
    --machine-type=n2-standard-4 
    --image-family=ubuntu-2204-lts 
    --image-project=ubuntu-os-cloud 
    --tags=db-tier 
    --no-address 
    --boot-disk-size=100GB 
    --boot-disk-type=pd-ssd

# App tier'ın DB'ye erişimine izin ver
gcloud compute firewall-rules create allow-app-to-db 
    --direction=INGRESS 
    --priority=1000 
    --network=default 
    --action=ALLOW 
    --rules=tcp:5432 
    --source-tags=app-tier 
    --target-tags=db-tier

# Web'in app'e erişimine izin ver
gcloud compute firewall-rules create allow-web-to-app 
    --direction=INGRESS 
    --priority=1000 
    --network=default 
    --action=ALLOW 
    --rules=tcp:8080 
    --source-tags=web-tier 
    --target-tags=app-tier

--no-address parametresi dikkat çekici. Bu sayede app ve db sunucularının public IP adresi olmuyor, dolayısıyla internetten direkt erişim mümkün değil. Bu basit ama etkili bir güvenlik katmanı.

Maliyet Optimizasyonu İpuçları

GCP faturası sürpriz yaratabilir. Birkaç kritik nokta:

  • Committed Use Discounts (CUD): 1 veya 3 yıllık taahhüt karşılığında yüzde 37-55 indirim alabilirsiniz. Sabit workload’larınız için kesinlikle değerlendirin
  • Rightsizing: Cloud Monitoring’deki tavsiyeler genelde doğru. Yüzde 10 CPU kullanıyorsa VM’yi küçültün
  • Idle VM’leri durdur: Geceleri ve hafta sonları çalışmayan dev VM’leri durdurmak önemli tasarruf sağlar
  • Snapshot temizliği: Eski snapshot’lar birikerek ciddi depolama maliyeti yaratır, lifecycle policy tanımlayın
  • Region seçimi: us-central1 genelde en ucuz region, Europe ve Asia bölgeleri daha pahalı
# VM'lerin mevcut machine type kullanımını analiz etmek için
gcloud compute instances list 
    --format="table(name,zone,machineType.scope(machineTypes),status)" 
    --filter="status:RUNNING"

# Kullanılmayan disk'leri bul (VM'ye bağlı olmayan)
gcloud compute disks list 
    --filter="-users:*" 
    --format="table(name,zone,sizeGb,type)"

# Kullanılmayan statik IP'leri listele
gcloud compute addresses list 
    --filter="status:RESERVED"

Sonuç

GCP Compute Engine güçlü bir platform ama doğru kullanmak için temel kavramları iyi anlamak gerekiyor. Bu yazıda anlattığımız konuları özetleyecek olursak:

  • gcloud CLI olmadan verimli GCP yönetimi düşünülemez, kurulumu ve konfigürasyon profillerini en baştan düzgün yapın
  • Machine type seçimi hem performans hem maliyet açısından kritik, workload’ınıza göre doğru aileyi seçin
  • Preemptible/Spot VM’ler kesintiye toleranslı workload’larda ciddi tasarruf sağlıyor
  • Network tag tabanlı firewall yönetimi büyük ortamlarda işleri çok kolaylaştırıyor
  • Snapshot politikaları otomatize edin, manuel backup güvenilir değil
  • Production’da MIG kullanmak; scaling, update ve yüksek erişilebilirlik açısından şart
  • Ops Agent kurmadan VM’lerinizi gerçek anlamda izleyemezsiniz

GCP düzenli yeni özellikler ekliyor. Özellikle Spot VM’ler, Tau T2D serisi ve ARM tabanlı instance’lar maliyet/performans dengesi açısından ilgi çekici gelişmeler. Kendi ortamınızdaki iş yüklerini bu seçeneklerle test etmeye değer.

Bir yanıt yazın

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