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:
gcloudCLI 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.
