Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Kubernetes Deployment ve ReplicaSet: Label'lar, Rolling Update, Rollout Geçmişi ve Geri Alma
Deployment pod'larını label selector ile tanır, her pod template'i için bir ReplicaSet yaratır ve rolling update'i maxSurge, maxUnavailable ve minReadySeconds ile yürütür. Dört replica'lık rollout'u saniye saniye izliyor, var olmayan bir tag'in progressDeadlineSeconds'a takılmasını, rollout undo'nun Git'le yarattığı farkı, pause ile tek rollout'u, change-cause tuzağını ve immutable image tag'lerini gerçek çıktılarla görüyoruz.
Jenkins'te Parallel, Matrix, input ve Deploy Stage'leri
Aynı paketi önce staging'e, agent'sız bir input onayından sonra production'a sshagent, rsync ve systemctl ile deploy ediyoruz; Lockable Resources eşzamanlılığı, milestone ise sırayı çözer. Health check'li deploy script'i, eski build'in yeniden sonra deploy ettiği gerçek kilit çıktısı, inversePrecedence, failFast, Node 22/24 matrix'i ve IIS için app_offline.htm yapısı.
Uçtan Uca Zero-Downtime: Bookstore'u GitHub Actions ile Blue-Green ve Canary Deploy Etmek
Serinin bütün parçaları tek bir GitHub Actions workflow'unda: image'ı bir kez build et, migration gate'i ve expand migration bundle'ı, boştaki renge deploy, preview'den smoke test, %10 ve %50 canary gate'leri, tam geçiş ve manuel rollback job'ı. act ile yerelde koşulan pipeline başarıdan önce dört kez düştü: Down()'ı tarayan gate, act'in artifact v7 uyumsuzluğu, eski renge bakan preview ve yetersiz canary trafiği.
Rollback mı Roll Forward mı? Geri Alma Planı, Kill Switch ve Otomatik Geri Dönüş Kriterleri
Geri dönüşün dört yolu var: kill switch, artifact rollback, roll forward ve etkiyi sınırlamak; seçim flag'e, önceki artifact'ın hazırlığına ve şemanın uyumuna bağlı. Atomik symlink switch, Down migration'ın kolonu geri getirip 300.004 ismi getirememesi, merge commit'in git revert'ü, %20 hatalı sürümü 10 sn'de geri alan otomatik tetikleyici (85 istekten 18'i hata), runbook template'i ve DORA ile ölçüm.
Feature Flag'ler: Deploy'u Release'ten Ayırmak, Microsoft.FeatureManagement ve OpenFeature
Feature flag kodu deploy edip davranışı bir config değişikliğiyle release etmeyi sağlar. Microsoft.FeatureManagement 4.8 ile targeting (1000 kullanıcıda %10,1, kullanıcıya sabit), variant'lar, minimal API'de WithFeatureGate ve 0,4 sn'de etkili olan kill switch; Angular'da signal tabanlı flag service ve test edilmiş structural directive; OpenFeature'ın preview provider'ında targeting'li boolean flag'in false dönmesi ve flag borcu.
Migration'ların Deploy'daki Yeri: Expand-Contract, EF Core Migration Bundle ve Geriye Uyumlu Şema
Bir kolonu iki sürüm yan yana çalışırken güvenle bölmek üç deploy ister: ekle ve çift yaz, yeni kolonlara geç, eskiyi kaldır. PostgreSQL'de 300.000 satırla gerçek koşular: v1 ve v2'nin aynı şemada birlikte çalışması, CONCURRENTLY index'in transaction hatası, Npgsql'in transaction'a bağlı migration kilidi yüzünden paralel bundle'larda deadlock, 8 sn kilitleyen UPDATE yerine 135 ms'lik batch'ler ve DROP COLUMN'u durduran review gate.
Canary Release: Trafiği Yüzdeyle Açmak, Metrik ile Karar Vermek ve Otomatik Analiz
Canary yeni sürümü trafiğin küçük bir payıyla çalıştırır ve aynı anda çalışan control ile karşılaştırarak karar verir. Nginx'te weight (900/100, yapışkan değil), split_clients ile kullanıcıya yapışan canary ve boş anahtar tuzağı, 1.30'un sticky cookie'si; 4.000 istekte %4,80'e %0 fark ama 19 istekte anlamsız sonuç, WAIT/ABORT/PROMOTE veren gate, Gateway API weight'leri ve Argo Rollouts'un hatalı sürümü otomatik durdurması.
Blue-Green Deployment: Nginx ile İki Environment, App Service Slot'ları ve Anında Geri Dönüş
Blue-green yeni sürümü boştaki ortama kurup smoke test'ten geçirir ve trafiği tek reload ile çevirir; geri dönüş de aynı reload'dur. Nginx'te preview portu, sürüm kontrollü smoke test, switch ve geri dönüşte hatasız probe, reload sırasında blue'da tamamlanan 4 sn'lik istek; App Service slot swap'ının warm-up ve slot setting tuzakları, Kubernetes'te Service selector değişimi ve ortak veritabanının getirdiği sınır.
Rolling Deployment: Sunucuları Sırayla Güncellemek, Kubernetes'te maxSurge ve maxUnavailable
Rolling deployment filoyu parça parça günceller; doğru yapılırsa kesinti olmaz ama iki sürüm bir süre yan yana yaşar. Nginx arkasında üç instance: naif script 90 GET'in 2'sini düşürdü, drain + readiness kontrollü script 237 GET ve 90 POST'u hatasız geçirdi. Kubernetes'te maxSurge/maxUnavailable ve minReadySeconds seçimi, progressDeadlineSeconds aşılınca otomatik geri dönüş olmadığı ve rolling'in uygun olmadığı durumlar.
Zero-Downtime'ın Ön Koşulları: Graceful Shutdown, Readiness, Stateless Uygulama ve Geriye Uyumluluk
Hiçbir deployment stratejisi, kapanırken işini bitirmeyen ve hazır olduğunu doğru söylemeyen bir uygulamayı kurtaramaz. Gerçek koşularla: ShutdownTimeout 2 sn'ye inince 5 sn'lik istek RST ile kopuyor, Docker'ın 1 sn'lik bekleme süresi 137 (SIGKILL) üretiyor, readiness drain sırasında 503 dönerken API 200 vermeye devam ediyor, ayrı Data Protection key ring'i CryptographicException fırlatıyor ve silinen Angular chunk'ı ChunkLoadError'a dönüşüyor.
Deploy ve Release Farkı: Downtime Neden Olur ve Deployment Stratejileri Haritası
Deploy kodun ortama kurulması, release kullanıcının yeni davranışı görmesidir; ikisini ayırabilen ekip riski böler. Nginx arkasındaki tek container'lı recreate deploy'unda 12 istek 2,5 saniye içinde hata aldı. Downtime'ın beş kaynağı, recreate, rolling, blue-green, canary, shadow, A/B ve feature flag'in haritası, karar tablosu ve risk = blast radius × tespit süresi hesabı.
GitHub Actions ile Deploy 2: Kendi Linux Sunucuna SSH, Docker Image ve GHCR
Image'ı GitHub Actions'ta bir kez build edip GHCR'a push'la, sunucuya SSH ile yalnızca digest'i gönder; sunucu Docker Compose ile çeker ve yeniden başlatır. metadata-action, build-push-action ve gha cache backend'i (28 sn'den 4 sn'ye), actions/attest, known_hosts pin'leme ve host key değişince ne olduğu, .env.previous ile rollback; act ile gerçek koşu.