İçeriğe Atla
Mustafa Erbay
Yaşam · 8 dk okuma · görüntülenme Read in English

CI/CD Deployment Stratejileri: Hız mı, Güvenlik mi?

CI/CD pipeline'larında hız ve güvenlik arasındaki dengeyi kurarken yapılan stratejik seçimleri ve bu seçimlerin gerçek dünyadaki etkilerini inceliyorum.

100%

Giriş: Hız ve Güvenlik Arasındaki İnce Çizgi

CI/CD pipeline’ları, yazılım geliştirme süreçlerimizin bel kemiği haline geldi. Bir yandan pazara hızlı ürün sürmek isterken, diğer yandan da sistemlerimizin güvenliğini en üst düzeyde tutmak zorundayız. Bu iki hedef, çoğu zaman birbirine zıt gibi görünse de, aslında birbiriyle uyumlu hale getirilebilir. Ancak bu uyumu sağlamak, stratejik kararlar ve doğru deployment yöntemlerinin seçilmesini gerektirir.

Bu yazıda, CI/CD dünyasındaki hız ve güvenlik arasındaki bu hassas dengeyi kendi deneyimlerimden yola çıkarak ele alacağım. Farklı deployment stratejilerinin getirdiği trade-off’ları, somut örneklerle açıklayarak, hangi durumda neyin daha mantıklı olabileceği üzerine bir bakış açısı sunacağım. Bu, sadece bir teknoloji yazısı değil, aynı zamanda bir yaşam biçimi, bir “olur o kadar” felsefesiyle harmanlanmış bir kariyer yorumu olacak.

Blue-Green Deployment: Hızlı Geri Dönüşün Anahtarı

Blue-Green deployment, production ortamında iki aynı ortamın (Green ve Blue) bulundurulması prensibine dayanır. Aktif olan ortamda kullanıcı trafiği devam ederken, diğer ortamda yeni versiyon deploy edilir. Testler başarıyla tamamlandıktan sonra, trafik aniden yeni versiyona yönlendirilir. Bu stratejinin en büyük artısı, herhangi bir sorunla karşılaşıldığında saniyeler içinde eski versiyona geri dönebilme yeteneğidir.

Bir üretim ERP’sinde, özellikle de finansal modüller söz konusu olduğunda, her türlü kesintinin maliyeti çok yüksektir. Bir keresinde, yeni bir özellik deploy etmek için Blue-Green stratejisini kullandık. Yeni versiyonu “Blue” ortamına aldık, kapsamlı testler yaptık. Her şey yolundaydı. Trafiği “Green”den “Blue”ya çevirme işlemi neredeyse anında tamamlandı. Ancak, anlık bir veri tutarsızlığı fark edildi. Sorun, yeni versiyonun belirli bir arka plan göreviyle çakışmasından kaynaklanıyordu. Trafiği hızlıca tekrar eski “Green” ortama çektiğimizde, kesinti çok kısa sürdü. Bu, normalde saatlerce sürebilecek bir rollback ve hata ayıklama sürecini önlemiş oldu. Bu tür stratejiler, özellikle kritik sistemlerde “olur o kadar” yaklaşımının ne kadar önemli olduğunu gösteriyor.

Canary Deployment: Kademeli Geçişin Güvenliği

Canary deployment, yeni versiyonun önce küçük bir kullanıcı grubuna sunulması prensibine dayanır. Eğer bu küçük grup olumlu geri bildirimler verirse ve sistemde herhangi bir hata gözlemlenmezse, versiyon kademeli olarak daha geniş kitlelere yayılır. Bu, olası sorunların tüm kullanıcı tabanını etkilemeden önce tespit edilmesini sağlar.

Kendi geliştirdiğim ve Türkiye’deki anonim veri platformu projemizde, kullanıcı sayımız başlangıçta düşüktü. Ancak, sistem büyüdükçe ve daha fazla veri işlemeye başladığımızda, her deploy’un riskini en aza indirmek istedim. Bir keresinde, veri işleme motorunda önemli bir güncelleme yapmam gerekiyordu. Canary deployment kullanarak, yeni versiyonu önce kullanıcıların küçük bir kısmına açtım. İlk gün boyunca sistem metriklerini ve hata loglarını yakından izledim. Redis tarafında bir bellek davranışında ince bir anomali tespit ettim. Bu durumu kullanıcıların geneline yayılmadan önce fark edip düzeltebildim. Bu erken tespit, potansiyel bir veri kaybını veya sistem çöküşünü engelledi.

Canary deployment, özellikle büyük ve karmaşık sistemlerde, üretim ortamında yeni özellikleri güvenli bir şekilde test etmek için mükemmel bir yöntemdir. Bu strateji, olası riskleri dağıtarak, geliştirme ve operasyon ekiplerine daha fazla güven verir.

Rolling Deployment: Sürekliliğin Sağlandığı Yöntem

Rolling deployment, sunucuların gruplar halinde güncellenmesi prensibine dayanır. Bir grup sunucu güncellenirken, diğerleri trafiği karşılamaya devam eder. Bu sayede, deployment sırasında sistemin tamamen devre dışı kalması önlenir. Her grup güncellendikten sonra, bir sonraki gruba geçilir. Bu yöntem, nispeten basit bir yapıya sahiptir ve genellikle ek altyapı maliyeti gerektirmez.

Birden fazla Nginx instance’ının trafiği karşıladığı bir kurulumda, reverse proxy güncellemesi için rolling deployment doğal bir tercihtir: instance’lar tek tek güncellenir, her adımda log’lar ve CPU kullanımı kontrol edilir, sorun görülmezse bir sonrakine geçilir. Böylece süreç kademeli ilerler ve sistem güncelleme boyunca kesintisiz hizmet vermeye devam eder. Bu, özellikle bireysel geliştiriciler veya küçük ekipler için, “olur o kadar” mantığıyla hareket ederken kesintisiz hizmet sunmanın pratik bir yoludur.

Bu yöntem, basitliği ve maliyet etkinliği nedeniyle birçok senaryoda tercih edilebilir. Ancak, yüksek trafikli ve anlık tutarlılığın kritik olduğu durumlarda, diğer stratejiler daha uygun olabilir.

Feature Flags: Kontrollü Dağıtımın Gücü

Feature flag (veya feature toggle), kodun belirli bir bölümünü çalışma zamanında etkinleştirmemizi veya devre dışı bırakmamızı sağlayan bir tekniktir. Bu sayede, henüz tamamlanmamış veya riskli görünen özellikleri production’a deploy edebiliriz, ancak kullanıcıların erişimine kapalı tutabiliriz. Özellik hazır olduğunda veya riskler anlaşıldığında, bayrak değiştirilerek özellik aktif hale getirilir.

Bir üretim firmasının ERP’sinde, yeni bir tedarik zinciri entegrasyon modülü geliştiriyorduk. Bu modül, birden fazla dış sistemle etkileşimde bulunuyordu ve hata yapma olasılığı yüksekti. Modülü tamamen deploy etmek yerine, bir feature flag arkasına gizledik. Böylece, kod production’a deploy edildi ancak sadece belirli test kullanıcıları veya dahili ekipler tarafından aktif edilebiliyordu. Bu kontrollü ortamda sistemin performansını ve dış sistemlerle olan etkileşimini bir süre izledik. Dış servislerle ilgili beklenmedik bir sınırlama (rate limiting) sorunu tespit ettik. Bu sorunu, tüm üretim sistemini etkilemeden, sadece feature flag’ı aktif olan sınırlı kullanıcı grubuyla çözebildik. Bu, “olur o kadar” yaklaşımının yazılım geliştirme sürecine nasıl entegre edilebileceğinin harika bir örneğidir.

Feature flag’lar, deployment hızını artırırken güvenliği sağlayan güçlü bir araçtır. Geliştirme ekiplerinin daha rahat deney yapmasını ve riskleri kontrollü bir şekilde yönetmesini sağlar.

Hız mı, Güvenlik mi? Pragmatik Bir Yaklaşım

Sonuç olarak, CI/CD deployment stratejileri arasında bir seçim yapmak, “hız mı, güvenlik mi?” sorusuna net bir cevap vermek anlamına gelmez. Bu, hangi durumun, hangi riskin ve hangi iş hedeflerinin söz konusu olduğuna bağlı olarak değişen karmaşık bir dengeleme eylemidir. Blue-Green, hızlı geri dönüş gerektiren kritik sistemler için idealdir. Canary, riskleri yayarak kademeli geçişi mümkün kılar. Rolling deployment, basitlik ve süreklilik sunar. Feature flag’lar ise, kodun kendisini kontrol altına almamızı sağlar.

Benim için “olur o kadar” felsefesi, tam da bu noktada devreye giriyor. Her zaman en karmaşık veya en pahalı çözüme atlamak yerine, mevcut durumu, risk iştahını ve elde etmek istediğimiz sonucu göz önünde bulundurarak en pragmatik yolu seçmek önemlidir. Bir keresinde, mobil uygulamamın Android sürümünde yaptığım bir güncelleme için Play Store’a deploy süreci, metadata reddi nedeniyle günlerce uzamıştı. Bu durum, bana “hız” kavramının sadece bizim kontrolümüzde olmadığını ve dış etkenlere karşı da hazırlıklı olmamız gerektiğini öğretmişti.

En iyi strateji, genellikle bu yöntemlerin bir kombinasyonunu kullanmaktan geçer. Örneğin, bir özelliği feature flag arkasında deploy edip, ardından canary ile yavaşça yayabilir ve son olarak blue-green ile tam geçiş yapabilirsiniz. Önemli olan, her adımda ne yaptığınızı bilmek, olası trade-off’ları anlamak ve sürekli olarak metrikleri izleyerek öğrenmektir.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Sıkça Sorulanlar

Bu makale ile ilgili okurların sorduğu yaygın sorular.

Blue‑Green deployment'ı CI/CD pipeline'ıma nasıl ekleyebilirim ve hangi araçları tercih etmeliyim?
Ben, Blue‑Green deployment'ı pipeline'ıma entegre ederken öncelikle Terraform ve AWS CloudFormation ile iki paralel ortam (blue ve green) tanımladım. CI aşamasında GitHub Actions kullanarak artefaktı oluşturup, aynı iş akışı içinde hem blue hem green ortamına aynı Docker imajını deploy ettim. Test aşamasını Cypress ve Postman ile otomatikleştirerek, green ortamındaki testler başarılı olduğunda Route 53 weighted routing ile trafiği anlık olarak blue’dan green’e yönlendirdim. Geri dönüş için ise aynı DNS kaydını eski ortamına geri çeviriyorum; bu sayede neredeyse anında eski sürüme dönmek mümkün oluyor. Bu araçlar, altyapıyı kod olarak yönetme ve hızlı trafik geçişi sağlama açısından ideal.
Blue‑Green ile Canary deployment arasındaki en büyük avantaj ve dezavantaj nedir, hangi senaryoda birini diğerine tercih etmeliyim?
Benim deneyimime göre Blue‑Green'in en büyük avantajı tam geri dönüş süresi; bir sorun çıktığında saniyeler içinde eski ortamı devreye alabiliyorum. Dezavantajı ise iki tam üretim ortamı tutmanın maliyeti ve kaynak tüketimi. Canary ise daha düşük maliyetle, yeni sürümü kademeli olarak %5‑10 kullanıcıya sunarak riskleri dağıtıyor; ancak geri dönüş süreci daha karmaşık ve izleme gerektiriyor. Finansal sistemlerde, kesintisiz hizmet kritik olduğunda Blue‑Green tercih ederim; ancak trafiğin yüksek olduğu SaaS ürünlerinde maliyeti kontrol altında tutmak için Canary daha uygundur.
Deploy sırasında bir hata alırsam geri dönüş sürecini nasıl yönettim ve kaç deneme gerekir?
Bir kez production’da bir veri migrasyonu sırasında schema hatasıyla karşılaştığımda, önceden tanımladığım rollback scripti ve Terraform state dosyasını kullanarak eski altyapıyı kısa sürede geri getirdim. Geri dönüş sürecini otomatikleştirmek için pipeline’da “if‑failure” adımı ekliyorum; bu adım başarısız olursa hemen önceki stabil sürüme geçişi başlatıyor. Kaç deneme gerektiği projenin karmaşıklığına bağlı, ama ben genellikle test, staging ve canary aşamalarından geçtikten sonra production’a geçiyorum. Böyle bir strateji, hatayı erken yakalamamı ve büyük bir kesintiyi önlememi sağladı.
CI/CD hız odaklı olduğunda güvenlik gerçekten ayrı bir adım mı, yoksa güvenliği hızdan bağımsız tutmak mümkün mü?
Ben, CI/CD’de güvenliği hızdan bağımsız bir adım olarak düşünmek yerine, güvenliği pipeline’ın her aşamasına entegre etmeyi tercih ediyorum. Örneğin, kod taraması için SonarQube, container imajı taraması için Trivy ve bağımlılık denetimi için Dependabot’u CI aşamasına ekliyorum; bu adımlar sadece birkaç saniye ekliyor ama güvenlik açığını erken yakalıyor. Ayrıca, Blue‑Green stratejisinde rollback mekanizması sayesinde bir güvenlik sorunu ortaya çıktığında hızlıca eski sürüme dönülebiliyor. Sonuçta, güvenliği ayrı bir aşama olarak görmek yerine, otomatikleştirerek hız kaybını minimuma indirmek mümkün.
ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Yeni yazılardan haberdar olun

Yeni içerikler ve teknik notlar e-postanıza gelsin.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar