Immutable Infrastructure Nedir? Değiştirme, Yeniden Oluştur
Sunucularınıza SSH ile bağlanıp değişiklik mi yapıyorsunuz? Konfigürasyon kayması (drift) mı yaşıyorsunuz? Immutable Infrastructure ile sunuculara dokunmayın — değiştirmek yerine yeniden oluşturun.
Mutable vs Immutable
Mutable (Geleneksel)
Server oluştur → SSH ile bağlan → Güncelle → Yamala → Yapılandır
(aylar sonra sunucu "kardanadam" olur)
Sorun: Sunucu drift — ortamlar birbirinden farklılaşır
Dev: nginx 1.20, node 18, openssl 1.1
Prod: nginx 1.22, node 16, openssl 3.0 ← WTF?
Immutable (Modern)
Image oluştur (nginx + node + app) → Deploy
Güncelleme? → Yeni image oluştur → Eski'yi sil, yeni'yi deploy
(her sunucu aynı image'dan, her zaman temiz)
Nasıl Çalışır?
1. Build: Packer ile golden image oluştur
└─ OS + runtime + app + config = tek image
2. Deploy: Terraform ile altyapıyı kur
└─ Image'dan yeni sunucu başlat
3. Update: Yeni image oluştur + eski sunucuları değiştir
└─ Blue-Green veya Rolling update ile
4. Asla SSH yapma!
Packer ile Golden Image
source "amazon-ebs" "web" {
ami_name = "web-app-{{timestamp}}"
instance_type = "t3.medium"
source_ami = "ami-0abcdef1234567890"
ssh_username = "ubuntu"
}
build {
sources = ["source.amazon-ebs.web"]
provisioner "shell" {
inline = [
"sudo apt-get update",
"sudo apt-get install -y nginx nodejs",
"sudo systemctl enable nginx"
]
}
provisioner "file" {
source = "./app/"
destination = "/var/www/app/"
}
}
Container = Immutable Infrastructure
Docker container'ları doğal olarak immutable'dır:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
docker build → Image (değişmez)
docker run → Container (yeni instance)
Güncelleme → Yeni image build → Eski container'ı sil
Karşılaştırma
| Özellik | Mutable | Immutable | |---------|---------|-----------| | Güncelleme | SSH + patch | Yeni image + deploy | | Drift riski | Yüksek | Yok | | Geri alma | Zor | Önceki image'a dön | | Tekrarlanabilirlik | Düşük | %100 | | Debug | Kolay (SSH) | Log + monitoring gerekli | | Güvenlik | Açık bağlantı noktaları | SSH yok, saldırı yüzeyi küçük |
Pets vs Cattle
| Pets (Evcil Hayvan) | Cattle (Sığır) | |---------------------|----------------| | Her sunucunun adı var | Sunucular numaralı | | Özenle bakılır | Otomatik yönetilir | | Bozulunca tamir edilir | Bozulunca yenisi oluşturulur | | Mutable | Immutable |
Araçlar
| Araç | Rol | |------|-----| | Packer | Image oluşturma | | Docker | Container image | | Terraform | Altyapı provisioning | | Ansible | Image build sırasında yapılandırma | | Kubernetes | Container orkestrasyon |
Zorluklar
- State yönetimi — Veritabanı, dosya depolama immutable değil
- Build süresi — Her değişiklikte yeni image
- Loglama — Sunucu silinince loglar kaybolur → merkezi log
- Debug — SSH yoksa sorun tespiti zorlaşır → observability
Best Practices
- Asla SSH yapmayın — Log ve monitoring ile sorun çözün
- CI/CD pipeline'da image build — Manuel image oluşturmayın
- Merkezi loglama — ELK, Loki, Datadog
- Blue-Green deploy — Geri alma kolaylığı
- Image versiyonlama — Her image'a versiyon ve tarih etiketi
- State'i ayırın — Veritabanı ve dosyalar ayrı yönetilmeli
Sonuç
Immutable Infrastructure, konfigürasyon kaymasını ortadan kaldırır ve her ortamın birebir aynı olmasını garanti eder. Container'lar bu yaklaşımı doğal olarak uygular. Sunuculara dokunmayın — yeniden oluşturun.
Immutable Infrastructure ve DevOps pratiklerini LabLudus platformunda öğrenin.