Uygulama güncellemeleri, her yazılım ekibinin karşılaştığı kaçınılmaz bir süreçtir. Peki, bu güncellemeleri kullanıcı deneyimini kesintiye uğratmadan, sıfır aksaklıkla ve minimum riskle nasıl gerçekleştirebilirsiniz? DigitalOcean Kubernetes Servisi (DOKS) ve güçlü Gateway API entegrasyonu sayesinde, mavi-yeşil dağıtım stratejisiyle bu zorlukların üstesinden gelmek artık çok daha kolay. Bu rehberde, DOKS üzerinde Gateway API kullanarak kesintisiz dağıtımların nasıl yapılacağını adım adım öğrenecek, riskleri minimuma indirecek ve kullanıcı deneyimini iyileştireceksiniz.
Mavi-Yeşil Dağıtım Nedir ve Neden Uygulamanız İçin Önemlidir?
Yazılım dünyasında, yeni özelliklerin devreye alınması veya hataların düzeltilmesi sürekli bir ihtiyaçtır. Ancak bu güncellemeler genellikle beraberinde kesinti, performans düşüşü veya beklenmedik hatalar gibi riskleri de getirir. İşte tam da bu noktada mavi-yeşil dağıtım stratejisi devreye giriyor. Mavi-yeşil dağıtım, uygulamanızın yeni sürümünü (yeşil ortam) mevcut sürümünden (mavi ortam) tamamen izole bir şekilde hazırlamanıza olanak tanıyan, yüksek güvenilirliğe sahip bir dağıtım modelidir. Bu sayede, yeni sürüm tam olarak test edilip doğrulandıktan sonra trafik, mevcut ortamdan yeni ortama kademeli veya anlık olarak yönlendirilir.
Bu stratejinin temelinde, iki özdeş üretim ortamının bulunması yatar: birincisi “mavi” olarak adlandırılan mevcut ve aktif ortam, diğeri ise “yeşil” olarak adlandırılan yeni sürümü barındıran ve henüz trafiğe açılmamış ortamdır. Yeni sürüm yeşil ortamda devreye alınır, kapsamlı bir şekilde test edilir ve tüm fonksiyonların beklendiği gibi çalıştığından emin olunur. Bu testler sırasında mavi ortam aktif kalır ve kullanıcılar herhangi bir kesinti yaşamazlar. Tüm testler başarılı olduğunda, ağ geçidi (Gateway) veya yük dengeleyici (Load Balancer) yapılandırması değiştirilerek tüm kullanıcı trafiği mavi ortamdan yeşil ortama yönlendirilir. Bu geçiş genellikle anlık veya çok hızlı bir şekilde gerçekleşir, bu da kullanıcılar için neredeyse sıfır kesinti anlamına gelir.
Peki, mavi-yeşil dağıtım neden bu kadar önemlidir? Bir e-ticaret sitesi işlettiğinizi düşünün. Yoğun satış dönemlerinde her saniyelik kesinti, binlerce liralık kayıp anlamına gelebilir. Geleneksel dağıtım yöntemlerinde, yeni bir sürüm devreye alınırken uygulamanın bir süreliğine erişilemez hale gelmesi veya performans sorunları yaşanması oldukça olasıdır. Mavi-yeşil dağıtım ile yeni sürümü tamamen ayrı bir ortamda hazırlayıp test edebilir, böylece mevcut canlı sistemi etkilemeden tüm kontrolleri yapabilirsiniz. Herhangi bir sorunla karşılaşıldığında ise trafiği anında tekrar mavi ortama yönlendirerek hızlı bir geri alma (rollback) imkanı elde edersiniz. Bu esneklik, iş sürekliliği açısından kritik bir avantaj sağlar ve dağıtım süreçlerindeki stresi önemli ölçüde azaltır. Ayrıca, bu yaklaşım sayesinde geliştirme ekipleri daha sık ve daha güvenli bir şekilde dağıtım yapabilir, bu da ürünün pazara çıkış süresini (time-to-market) kısaltır ve inovasyonu teşvik eder. Sonuç olarak, mavi-yeşil dağıtım, hem teknik ekipler hem de son kullanıcılar için daha güvenli, daha hızlı ve daha kesintisiz bir deneyim sunar.
DigitalOcean Kubernetes Servisi (DOKS) ve Gateway API’a Yakından Bakış
Modern bulut tabanlı uygulamalar için ölçeklenebilirlik, esneklik ve yönetim kolaylığı hayati öneme sahiptir. Bu bağlamda, DigitalOcean Kubernetes Servisi (DOKS) ve Kubernetes’in yeni nesil ağ geçidi standardı olan Gateway API, mavi-yeşil dağıtım stratejilerini uygulamak için güçlü bir kombinasyon sunar. Her iki teknoloji de, karmaşık dağıtım süreçlerini basitleştirerek geliştiricilere daha fazla kontrol ve otomasyon imkanı tanır.
DOKS Neden Mavi-Yeşil Dağıtımlar İçin İdeal Bir Platform?
DigitalOcean Kubernetes Servisi (DOKS), yönetilen bir Kubernetes hizmetidir. Bu, Kubernetes kümesi altyapısının DigitalOcean tarafından yönetildiği anlamına gelir, böylece siz uygulamanıza odaklanabilirsiniz. DOKS, mavi-yeşil dağıtımlar için çeşitli nedenlerle mükemmel bir seçenektir. İlk olarak, DOKS’un sağladığı kolay ölçeklenebilirlik sayesinde, mavi ve yeşil ortamlar için ayrı kaynakları hızlıca sağlayabilir ve gerektiğinde ölçeklendirebilirsiniz. Yeni bir yeşil ortam kurmak, DOKS’ta birkaç komutla veya birkaç tıklamayla gerçekleşebilir, bu da dağıtım hazırlık süresini önemli ölçüde kısaltır. İkinci olarak, DOKS’un entegre yük dengeleyici (Load Balancer) ve depolama (Storage) çözümleri, mavi-yeşil mimarinin temel taşlarını oluşturur. Uygulama trafiğini ortamlar arasında yönlendirmek için DigitalOcean Load Balancer’lar sorunsuz bir şekilde entegre edilebilirken, kalıcı depolama ihtiyaçları için DigitalOcean Volumes veya Spaces kullanılabilir. Üçüncü olarak, DOKS’un basit ve kullanıcı dostu arayüzü ile güçlü doctl CLI aracı, küme yönetimini ve otomasyonu kolaylaştırır. Bu da CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) süreçlerinizi mavi-yeşil dağıtımlarla entegre etmeyi basitleştirir. Tüm bu özellikler bir araya geldiğinde, DOKS, güvenilir, ölçeklenebilir ve yönetimi kolay bir platform sunarak mavi-yeşil dağıtım stratejilerinin başarıyla uygulanmasına zemin hazırlar. Özellikle küçük ve orta ölçekli işletmeler için maliyet etkinliği ve kullanım kolaylığı açısından büyük avantajlar sunar.
Gateway API Nedir ve Geleneksel Ingress’ten Farkları Nelerdir?
Kubernetes’te dışarıdan gelen trafiği servislere yönlendirmek için uzun süredir Ingress API kullanılıyordu. Ancak Ingress, özellikle karmaşık trafik yönetimi senaryolarında (örneğin, ağırlıklı trafik yönlendirme, gelişmiş URL eşleştirme, çoklu protokol desteği) bazı sınırlamalara sahipti. İşte bu noktada Gateway API, Kubernetes ağ geçidi yönetimi için daha esnek, genişletilebilir ve rol odaklı bir standart olarak ortaya çıktı. Gateway API, Ingress’in yerini almayı hedefleyen yeni nesil bir API’dir ve özellikle mavi-yeşil dağıtımlar gibi karmaşık stratejiler için ideal çözümler sunar.
Gateway API’nin temel bileşenleri şunlardır:
- GatewayClass: Bir Gateway’in davranışını tanımlayan bir şablon. Hangi Gateway kontrolcüsünün kullanılacağını belirtir.
- Gateway: Kümenize dışarıdan gelen trafiği kabul eden ve yönlendiren ağ geçidini temsil eder. Bir yük dengeleyiciye veya kenar yönlendiriciye (edge router) karşılık gelebilir.
- HTTPRoute: HTTP/HTTPS trafiğinin nasıl yönlendirileceğini tanımlar. URL yollarına, başlıklarına veya sorgu parametrelerine göre trafik yönlendirme kuralları belirlemenizi sağlar. Bu, özellikle mavi-yeşil dağıtımlarda trafiği farklı servis versiyonlarına yönlendirmek için kilit öneme sahiptir.
- TCPRoute/TLSRoute/UDPRoute: HTTP dışındaki protokoller için trafik yönlendirme kurallarını tanımlar.
Geleneksel Ingress’ten en önemli farkı, Gateway API’nin rol odaklı bir yaklaşıma sahip olmasıdır. Bu, altyapı operatörleri (GatewayClass, Gateway) ve uygulama geliştiricileri (HTTPRoute) arasında sorumlulukları ayırır. Operatörler ağ altyapısını yönetirken, geliştiriciler kendi uygulamalarının trafik kurallarını bağımsız olarak tanımlayabilirler. Bu ayrım, büyük ve karmaşık organizasyonlarda iş akışlarını basitleştirir ve hata olasılığını azaltır. Ayrıca, Gateway API daha genişletilebilir bir yapıya sahiptir, bu da satıcıların ve topluluğun özel ihtiyaçlara göre kendi eklentilerini geliştirmesine olanak tanır. Mavi-yeşil dağıtımlar için Gateway API, trafiği yüzde bazında veya belirli koşullara göre farklı arka uç servislerine yönlendirme yeteneği sayesinde kesintisiz geçişleri ve hızlı geri almaları çok daha zarif bir şekilde yönetmenizi sağlar.
DOKS Üzerinde Mavi-Yeşil Dağıtım Senaryosu: Adım Adım Kurulum
Artık mavi-yeşil dağıtımın ne olduğunu ve DOKS ile Gateway API’ın sağladığı avantajları biliyoruz. Şimdi bu bilgileri pratik bir senaryo üzerinde uygulayalım. Bu bölümde, DOKS üzerinde basit bir web uygulamasını mavi-yeşil stratejisiyle nasıl dağıtacağımızı adım adım inceleyeceğiz. Amacımız, uygulamanın yeni bir sürümünü canlıya alırken kullanıcıların hiçbir kesinti yaşamamasını sağlamak ve gerektiğinde kolayca eski sürüme dönebilmektir. Bu süreç, Kubernetes YAML dosyaları ve kubectl komutları aracılığıyla gerçekleştirilecektir.
DOKS Kümesi Hazırlığı ve Temel Bileşenlerin Kurulumu
İlk adım, bir DOKS kümesi oluşturmak ve Gateway API kontrolcüsünü kurmaktır. Eğer henüz bir DOKS kümeniz yoksa, DigitalOcean kontrol panelinden veya doctl CLI aracılığıyla kolayca oluşturabilirsiniz. Örneğin, aşağıdaki doctl komutuyla bir küme oluşturulabilir:
doctl kubernetes cluster create my-blue-green-cluster --region nyc1 --version 1.28.2-do.0 --node-pool name=worker-pool,size=s-2vcpu-4gb,count=2
Kümeniz hazır olduğunda, kubectl yapılandırmasını güncellemeyi unutmayın. Daha sonra, Gateway API’nin Kubernetes kümenizde çalışabilmesi için Custom Resource Definitions (CRD’ler) ve bir Gateway kontrolcüsü yüklemeniz gerekir. Bu örnekte, popüler bir Gateway API kontrolcüsü olan NGINX Gateway API kontrolcüsünü kullanacağımızı varsayalım. Kurulum adımları genellikle kontrolcünün resmi belgelerinde bulunur. Genel olarak, Gateway API CRD’leri ve ardından kontrolcünün kendisi yüklenir:
# Gateway API CRD'lerini yükleyin (genellikle Kubernetes 1.28+ ile gelir, ancak emin olmak için kontrol edilebilir)
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml
# NGINX Gateway API kontrolcüsünü yükleyin (örnek olarak)
# Bu adımlar kontrolcünün kendi belgelerinden alınmalıdır.
# Örneğin, bir Helm chart ile kurulum:
helm repo add nginx-gateway https://nginxinc.github.io/nginx-gateway-fabric/
helm repo update
helm install nginx-gateway nginx-gateway/nginx-gateway-fabric --namespace nginx-gateway --create-namespace
Kurulum tamamlandıktan sonra, kümenizde bir GatewayClass nesnesinin ve nginx-gateway-fabric gibi bir Gateway kontrolcüsünün çalıştığından emin olun. Aşağıdaki komutlarla kontrol edebilirsiniz:
kubectl get gatewayclass
kubectl get pods -n nginx-gateway
Bu temel kurulumlar tamamlandığında, artık mavi ve yeşil ortamlarımızı dağıtmaya ve trafik yönetimini Gateway API ile yapılandırmaya hazırız. Unutmayın ki Gateway API’nin farklı uygulamaları (örneğin, Istio, GKE Gateway) farklı kurulum adımlarına sahip olabilir, bu nedenle kullandığınız kontrolcünün belgelerini dikkatlice incelemeniz önemlidir. DOKS üzerinde bu kontrolcülerin sorunsuz çalışması, platformun esnekliğini ve uyumluluğunu göstermektedir. Bu hazırlık süreci, mavi-yeşil dağıtımın sorunsuz bir şekilde ilerlemesi için sağlam bir zemin oluşturur ve gelecekteki dağıtımların daha hızlı ve güvenilir olmasını sağlar.
Uygulama Dağıtımı ve Trafik Yönetimi: Mavi ve Yeşil Ortamları Oluşturma
Kümemizi ve Gateway API kontrolcümüzü hazırladığımıza göre, şimdi sıra uygulamamızı dağıtmaya geldi. Mavi-yeşil dağıtım stratejisine uygun olarak, uygulamamızın mevcut “mavi” sürümünü ve yeni “yeşil” sürümünü ayrı ayrı yöneteceğiz. Bu yaklaşım, her iki ortamın da bağımsız olarak çalışmasını ve trafiğin kontrollü bir şekilde yönlendirilmesini sağlar. Bu bölümde, örnek bir web uygulamasını hem mavi hem de yeşil ortamlar için nasıl dağıtacağımızı ve Gateway API kullanarak ilk trafik kurallarını nasıl belirleyeceğimizi detaylandıracağız.
Mavi (Mevcut) Uygulamanın Dağıtımı
İlk olarak, uygulamamızın mevcut sürümünü temsil eden “mavi” ortamı dağıtacağız. Bu, bir Kubernetes Deployment ve bir Service nesnesi ile yapılacaktır. Uygulamamız basit bir NGINX web sunucusu olsun ve versiyonunu belirten bir HTML sayfası sunsun.
1. Mavi Uygulama Deployment ve Service Tanımlaması (blue-app.yaml):
apiVersion apps/v1
kind Deployment
metadata:
name: blue-app
labels:
app: my-app
version: blue
spec:
replicas: 3
selector:
matchLabels:
app: my-app
version: blue
template:
metadata:
labels:
app: my-app
version: blue
spec:
containers:
- name: my-app
image: nginx:1.21.6 # Mavi sürüm için bir NGINX imajı
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
configMap:
name: blue-index-html
---
apiVersion v1
kind Service
metadata:
name: blue-service
spec:
selector:
app: my-app
version: blue
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Uygulamanın içeriğini sağlamak için bir ConfigMap kullanacağız:
2. Mavi Uygulama ConfigMap Tanımlaması (blue-index-html.yaml):
apiVersion v1
kind ConfigMap
metadata:
name: blue-index-html
data:
index.html: |
<!DOCTYPE html>
<html>
<head>
<title>Mavi Uygulama</title>
<style>
body { font-family: Arial, sans-serif; background-color: #e0f2f7; color: #2196f3; text-align: center; padding-top: 50px; }
h1 { font-size: 3em; }
p { font-size: 1.5em; }
</style>
</head>
<body>
<h1>Merhaba, ben Mavi Uygulama!</h1>
<p>Versiyon: 1.0</p>
</body>
</html>
Bu dosyaları uygulayın:
kubectl apply -f blue-index-html.yaml
kubectl apply -f blue-app.yaml
Şimdi, dışarıdan gelen trafiği bu mavi uygulamaya yönlendirecek bir Gateway ve HTTPRoute tanımlayacağız. DigitalOcean üzerinde bir Load Balancer sağlamak için bir Gateway nesnesi kullanabiliriz.
3. Gateway ve HTTPRoute Tanımlaması (gateway-config.yaml):
apiVersion gateway.networking.k8s.io/v1
kind Gateway
metadata:
name: my-app-gateway
spec:
gatewayClassName: nginx # Kullandığınız kontrolcüye göre değişebilir (örn: do-loadbalancer, istio)
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All # Tüm namespace'lerden route kabul et
---
apiVersion gateway.networking.k8s.io/v1
kind HTTPRoute
metadata:
name: my-app-route
spec:
parentRefs:
- name: my-app-gateway
hostnames:
- "myapp.example.com" # Kendi alan adınızı kullanın
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: blue-service
port: 80
Bu dosyayı uygulayın:
kubectl apply -f gateway-config.yaml
Birkaç dakika sonra, kubectl get gateway my-app-gateway komutu ile Gateway’inizin bir dış IP adresi veya hostname aldığını göreceksiniz. Alan adınızı bu adrese yönlendirdikten sonra, tarayıcınızdan myapp.example.com adresine eriştiğinizde “Mavi Uygulama” içeriğini görmelisiniz.
Yeşil (Yeni) Uygulamanın Dağıtımı ve Test Edilmesi
Mavi ortamımız başarıyla çalıştığına göre, şimdi uygulamamızın yeni sürümünü temsil eden “yeşil” ortamı dağıtabiliriz. Bu ortam, mavi ortamdan tamamen bağımsız olacak ve canlı trafiğe açılmadan önce kapsamlı bir şekilde test edilecektir.
1. Yeşil Uygulama Deployment ve Service Tanımlaması (green-app.yaml):
apiVersion apps/v1
kind Deployment
metadata:
name: green-app
labels:
app: my-app
version: green
spec:
replicas: 3
selector:
matchLabels:
app: my-app
version: green
template:
metadata:
labels:
app: my-app
version: green
spec:
containers:
- name: my-app
image: nginx:1.23.4 # Yeşil sürüm için yeni bir NGINX imajı
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
configMap:
name: green-index-html
---
apiVersion v1
kind Service
metadata:
name: green-service
spec:
selector:
app: my-app
version: green
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Ve elbette, yeşil uygulama için yeni bir ConfigMap:
2. Yeşil Uygulama ConfigMap Tanımlaması (green-index-html.yaml):
apiVersion v1
kind ConfigMap
metadata:
name: green-index-html
data:
index.html: |
<!DOCTYPE html>
<html>
<head>
<title>Yeşil Uygulama</title>
<style>
body { font-family: Arial, sans-serif; background-color: #e8f5e9; color: #4caf50; text-align: center; padding-top: 50px; }
h1 { font-size: 3em; }
p { font-size: 1.5em; }
</style>
</head>
<body>
<h1>Merhaba, ben Yeşil Uygulama!</h1>
<p>Versiyon: 2.0</p>
</body>
</html>
Bu dosyaları uygulayın:
kubectl apply -f green-index-html.yaml
kubectl apply -f green-app.yaml
Yeşil uygulama dağıtıldıktan sonra, henüz ana HTTPRoute üzerinde tanımlı olmadığı için dışarıdan erişilemez durumda olacaktır. Bu, yeni sürümü canlı trafiğe açmadan önce dahili olarak test etmek için ideal bir durumdur. Test için, geçici bir HTTPRoute oluşturabilir veya küme içinden doğrudan green-service‘e erişebilirsiniz. Örneğin, Gateway API kontrolcünüzün desteklediği bir mekanizma ile belirli bir başlık (header) üzerinden yeşil ortama erişim sağlayabilirsiniz. Ancak bu senaryoda, doğrudan trafiği yönlendirmeden önce yeşil ortamın hazır olduğunu varsayıyoruz.
Bu adımlarla, uygulamamızın her iki sürümü de DOKS kümemizde çalışır durumda ve Gateway API ile trafik yönlendirme için hazır hale getirilmiştir. Şimdi, trafiği mavi ortamdan yeşil ortama nasıl geçireceğimizi ve gerektiğinde nasıl geri döneceğimizi inceleyeceğiz.
Kesintisiz Geçiş ve Geri Alma Stratejileri
Mavi ve yeşil ortamlarımız hazır olduğuna göre, şimdi en kritik adıma geliyoruz: trafiği mavi ortamdan yeşil ortama kesintisiz bir şekilde yönlendirmek ve olası sorunlarda hızlıca geri dönebilmek. Gateway API, bu geçişleri oldukça esnek ve kontrollü bir şekilde yönetmemizi sağlayan güçlü yeteneklere sahiptir. Özellikle ağırlıklı trafik yönlendirme (weighted traffic splitting) özelliği, riskleri minimize ederek kademeli geçişler yapmamıza imkan tanır.
Trafiği Mavi’den Yeşil’e Yönlendirme (Ağırlıklı Yönlendirme)
Mavi-yeşil dağıtımın temel faydalarından biri, trafiği yeni ortama kademeli olarak yönlendirme yeteneğidir. Bu, “canary” dağıtımlarına benzer bir yaklaşım sunar ancak genellikle daha büyük gruplar halinde ilerler. Gateway API’deki HTTPRoute nesnesini güncelleyerek, trafiğin belirli bir yüzdesini mavi servise, kalanını ise yeşil servise yönlendirebiliriz. Bu sayede, yeni sürümün performansını ve kararlılığını küçük bir kullanıcı grubu üzerinde gözlemleyebilir, herhangi bir sorun yaşanmadığından emin olduktan sonra trafiğin tamamını yeni ortama aktarabiliriz.
Aşağıdaki HTTPRoute yapılandırması, trafiğin %90’ını mavi servise, %10’unu ise yeşil servise yönlendirecektir:
1. Kademeli Geçiş için HTTPRoute Güncellemesi (httproute-weighted.yaml):
apiVersion gateway.networking.k8s.io/v1
kind HTTPRoute
metadata:
name: my-app-route
spec:
parentRefs:
- name: my-app-gateway
hostnames:
- "myapp.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: blue-service
port: 80
weight: 90 # %90 trafik mavi servise
- name: green-service
port: 80
weight: 10 # %10 trafik yeşil servise
Bu dosyayı uygulayarak HTTPRoute‘u güncelleyin:
kubectl apply -f httproute-weighted.yaml
Bu adımdan sonra, myapp.example.com adresine gelen isteklerin %10’u yeni yeşil uygulamaya yönlendirilecektir. Bu aşamada, izleme ve log sistemleriniz üzerinden yeşil uygulamanın davranışını dikkatlice gözlemlemelisiniz. Hata oranları, gecikme süreleri ve genel performans metrikleri kritik öneme sahiptir. Her şey yolunda giderse, trafiği kademeli olarak artırabilirsiniz:
- %50 mavi, %50 yeşil
- %10 mavi, %90 yeşil
- %0 mavi, %100 yeşil (tam geçiş)
Trafiğin tamamını yeşil servise yönlendirmek için HTTPRoute‘u aşağıdaki gibi güncelleyebilirsiniz:
apiVersion gateway.networking.k8s.io/v1
kind HTTPRoute
metadata:
name: my-app-route
spec:
parentRefs:
- name: my-app-gateway
hostnames:
- "myapp.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: green-service
port: 80
weight: 100 # Tüm trafik yeşil servise
kubectl apply -f httproute-weighted.yaml
Bu son güncelleme ile tüm trafik yeşil ortama yönlendirilmiş olur ve mavi-yeşil dağıtım başarıyla tamamlanmış olur. Bu noktada, eski mavi ortamdaki Deployment ve Service nesnelerini silebilirsiniz (ancak hızlı geri alma ihtiyacına karşı bir süre daha tutmak iyi bir pratik olabilir).
Olası Sorunlarda Hızlı Geri Alma
Mavi-yeşil dağıtımın en büyük avantajlarından biri, bir sorun anında anında geri alma (rollback) yeteneğidir. Yeşil ortama trafik yönlendirdikten sonra kritik bir hata veya performans düşüşü fark ederseniz, trafiği anında tekrar mavi ortama yönlendirebilirsiniz. Bu, kullanıcılarınızın etkilenme süresini minimuma indirir ve iş sürekliliğini sağlar.
Geri alma işlemi, HTTPRoute yapılandırmasını eski haline, yani tüm trafiği mavi servise yönlendiren duruma getirmek kadar basittir:
1. Geri Alma için HTTPRoute Güncellemesi (httproute-rollback.yaml):
apiVersion gateway.networking.k8s.io/v1
kind HTTPRoute
metadata:
name: my-app-route
spec:
parentRefs:
- name: my-app-gateway
hostnames:
- "myapp.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: blue-service
port: 80
weight: 100 # Tüm trafik tekrar mavi servise
Bu dosyayı uygulayarak anında geri alma yapın:
kubectl apply -f httproute-rollback.yaml
Bu komutla birlikte, tüm kullanıcı trafiği anında tekrar mavi ortama yönlendirilir ve yeşil ortamdaki sorunlu sürümden izole edilmiş olursunuz. Bu sayede, sorunu sakin bir şekilde analiz edip düzeltebilir ve daha sonra yeni bir yeşil ortam dağıtımını planlayabilirsiniz. Bu hızlı geri alma yeteneği, dağıtım süreçlerindeki riski dramatik bir şekilde azaltır ve ekiplerin daha cesurca yenilikler yapmasına olanak tanır. Mavi-yeşil dağıtım, bu özelliğiyle modern DevOps pratiklerinin vazgeçilmez bir parçası haline gelmiştir.
İleri Düzey İpuçları ve En İyi Uygulamalar
Mavi-yeşil dağıtım stratejisini DOKS ve Gateway API ile uygulamak, kesintisiz güncellemeler ve hızlı geri alma yetenekleri sunar. Ancak bu stratejinin tüm potansiyelini kullanmak ve üretim ortamlarında sorunsuz çalışmasını sağlamak için bazı ileri düzey ipuçları ve en iyi uygulamaları göz önünde bulundurmak faydalı olacaktır. Bu yaklaşımlar, dağıtım süreçlerinizi daha da otomatikleştirecek, izlenebilirliği artıracak ve genel sistem kararlılığını iyileştirecektir.
Otomasyon ve CI/CD Entegrasyonu
Manuel dağıtımlar hataya açık ve zaman alıcıdır. Mavi-yeşil dağıtım süreçlerini otomatikleştirmek için CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) boru hatları kullanmak hayati öneme sahiptir. GitHub Actions, GitLab CI/CD, Jenkins veya DigitalOcean App Platform gibi araçlar, kod değişiklikleri algılandığında otomatik olarak yeni bir yeşil ortam oluşturabilir, testleri çalıştırabilir ve Gateway API’yi güncelleyerek trafiği aşamalı olarak yönlendirebilir. Otomasyon, insan hatasını azaltır, dağıtım hızını artırır ve ekiplerin daha sık dağıtım yapmasına olanak tanır. Bir CI/CD boru hattı, aşağıdaki adımları içerebilir:
- Kod değişikliklerini algılama.
- Yeni bir uygulama imajı oluşturma (Docker imajı).
- Yeni imajı bir kapsayıcı kayıt defterine (örneğin, DigitalOcean Container Registry) gönderme.
- DOKS kümesinde yeşil ortamın Deployment ve Service nesnelerini güncelleme veya oluşturma.
- Otomatik entegrasyon ve kabul testlerini yeşil ortamda çalıştırma.
- Testler başarılı olursa, Gateway API’deki HTTPRoute nesnesini güncelleyerek trafiği kademeli olarak yeşil ortama yönlendirme.
- Tüm trafik yönlendirildikten sonra eski mavi ortam kaynaklarını temizleme (isteğe bağlı).
Kapsamlı Gözlemlenebilirlik (Monitoring ve Logging)
Mavi-yeşil dağıtım sırasında ve sonrasında uygulamanızın sağlığını ve performansını izlemek kritik öneme sahiptir. Prometheus ve Grafana gibi araçlarla metrikleri toplamak ve görselleştirmek, yeni sürümün olası performans sorunlarını veya hatalarını hızla tespit etmenizi sağlar. Log toplama için ELK Stack (Elasticsearch, Logstash, Kibana) veya Loki gibi çözümler kullanarak uygulama loglarını merkezi bir yerde toplayabilir ve analiz edebilirsiniz. Dağıtım sonrası, yeşil ortamdaki hata oranları, yanıt süreleri, CPU/bellek kullanımı gibi metrikleri dikkatle izlemek, trafiği tam olarak yönlendirmeden önce güvende olmanızı sağlar. DigitalOcean’ın entegre izleme araçları da bu süreçte size yardımcı olabilir.
Sağlık Kontrolleri (Liveness ve Readiness Probes)
Kubernetes Deployment’larınızda liveness (canlılık) ve readiness (hazırlık) kontrollerini doğru bir şekilde yapılandırmak, uygulamanızın kararlılığını artırır. Liveness probu, kapsayıcının hala çalıştığını ve işlevsel olduğunu doğrular. Başarısız olursa, Kubernetes kapsayıcıyı yeniden başlatır. Readiness probu ise, kapsayıcının gelen trafiği kabul etmeye hazır olup olmadığını kontrol eder. Bu, özellikle yeni bir uygulama sürümünün başlatılması sırasında önemlidir; uygulama tamamen hazır olana kadar trafiğin ona yönlendirilmemesini sağlar. Bu proplar, Gateway API’nin trafiği yönlendirme kararlarını destekleyerek yalnızca sağlıklı pod’lara trafik gitmesini sağlar.
Helm Kullanımı ile Dağıtım Şablonları
Uygulamanızın Kubernetes manifestlerini yönetmek karmaşık hale gelebilir. Helm, Kubernetes uygulamaları için bir paket yöneticisidir. Uygulamalarınızı Helm Chart’lar aracılığıyla şablonlaştırarak, mavi ve yeşil ortamlar için Deployment, Service ve HTTPRoute gibi nesneleri kolayca parametrelendirebilir ve yönetebilirsiniz. Örneğin, bir Helm Chart içinde imageTag veya version gibi değerleri değiştirerek hem mavi hem de yeşil ortamları aynı şablondan türetebilirsiniz. Bu, yapılandırma tutarlılığını sağlar ve manuel hataları azaltır.
Güvenlik Hususları
Mavi-yeşil dağıtımlarınızda güvenlikten ödün vermeyin. Gateway API üzerinden TLS/SSL sonlandırmayı (HTTPS) yapılandırmak, kullanıcı trafiğinin şifrelenmesini sağlar. DigitalOcean’ın ücretsiz SSL sertifikaları veya Let’s Encrypt ile kolayca entegrasyon sağlayabilirsiniz. Ayrıca, ağ politikaları (Network Policies) kullanarak farklı ortamlar arasındaki veya içindeki pod’lar arası iletişimi kısıtlayabilirsiniz. Örneğin, yeşil ortam sadece belirli test araçlarından erişilebilirken, mavi ortam tüm dış trafiğe açık olabilir. Yetkilendirme ve kimlik doğrulama mekanizmalarını da uygulamanızın her iki sürümünde de doğru şekilde yapılandırdığınızdan emin olun.
Mobil Uyumluluk Düşünceleri
Mobil uyumluluk, dağıtım stratejinizle doğrudan ilgili olmasa da, modern bir uygulamanın olmazsa olmazıdır. Dağıttığınız web uygulamasının kullanıcı arayüzünün (frontend) farklı ekran boyutlarına ve cihazlara uyumlu olduğundan emin olun. Bu genellikle responsive tasarım teknikleri ve CSS media query’leri kullanılarak sağlanır. Örneğin, uygulamanızın CSS kodunda aşağıdaki gibi bir yapılandırma bulunabilir:
/* Genel stil */
body {
font-size: 16px;
}
/* Küçük ekranlar için (mobil cihazlar) */
@media screen and (max-width: 768px) {
body {
font-size: 14px;
}
.container {
width: 100%;
padding: 10px;
}
}
/* Orta ekranlar için (tabletler) */
@media screen and (min-width: 769px) and (max-width: 1024px) {
body {
font-size: 15px;
}
.container {
width: 80%;
}
}
Bu tür responsive tasarımlar, uygulamanızın hangi ortamda (mavi veya yeşil) çalışırsa çalışsın, tüm kullanıcılara tutarlı ve erişilebilir bir deneyim sunmasını sağlar. Dağıtım stratejiniz altyapıyı yönetirken, uygulamanızın kendisi de son kullanıcıya yönelik bu tür detayları içermelidir.
Bu ileri düzey ipuçları ve en iyi uygulamalar, DOKS ve Gateway API ile mavi-yeşil dağıtım stratejinizi daha sağlam, verimli ve güvenli hale getirmenize yardımcı olacaktır. Sürekli iyileştirme ve otomasyon, DevOps kültürünün temelini oluşturur ve bu stratejilerin başarısı için kritik öneme sahiptir.
Sonuç
Uygulama dağıtımları, modern yazılım geliştirme süreçlerinin ayrılmaz bir parçasıdır ve kesintisiz, güvenilir güncellemeler sunmak, kullanıcı memnuniyeti ve iş sürekliliği için hayati öneme sahiptir. Bu makalede, DigitalOcean Kubernetes Servisi (DOKS) ve Kubernetes’in yeni nesil trafik yönetim standardı olan Gateway API’yi kullanarak mavi-yeşil dağıtım stratejilerini nasıl uygulayacağımızı ayrıntılı bir şekilde inceledik. Gördüğümüz gibi, mavi-yeşil dağıtım, mevcut (mavi) ve yeni (yeşil) uygulama ortamlarını izole ederek, yeni sürümleri güvenle test etme ve trafiği kontrollü bir şekilde yönlendirme imkanı sunar.
DOKS’un sağladığı kolay ölçeklenebilirlik, yönetilen hizmet avantajları ve entegre yük dengeleyici yetenekleri, mavi-yeşil mimarinin başarılı bir şekilde kurulması için sağlam bir temel oluşturur. Gateway API ise, geleneksel Ingress’in ötesine geçerek daha esnek, rol odaklı ve genişletilebilir bir trafik yönetim çözümü sunar. HTTPRoute nesnesini kullanarak trafiği belirli yüzdelerle mavi ve yeşil servisler arasında yönlendirme yeteneği, riskleri minimize eden kademeli geçişler yapmamıza olanak tanır. En önemlisi, olası bir sorun anında trafiği anında eski mavi ortama yönlendirebilme yeteneği, hızlı geri alma imkanı sunarak iş sürekliliğini garanti altına alır.
Ayrıca, otomasyon ve CI/CD entegrasyonu, kapsamlı gözlemlenebilirlik, sağlık kontrolleri, Helm kullanımı ve güvenlik hususları gibi ileri düzey ipuçları ve en iyi uygulamalarla mavi-yeşil dağıtım stratejinizi daha da güçlendirebileceğinizi vurguladık. Bu yaklaşımlar, dağıtım süreçlerinizi daha verimli, güvenli ve hatasız hale getirecek, ekiplerinize daha sık ve daha cesurca yenilikler yapma özgürlüğü tanıyacaktır. DOKS ve Gateway API ile mavi-yeşil dağıtım, modern DevOps prensiplerini benimseyen her organizasyon için değerli bir stratejidir.
Sıkça Sorulan Sorular (SSS)
- Mavi-Yeşil dağıtım her uygulama için uygun mudur?
- Genel olarak evet, ancak özellikle kesintiye tahammülü olmayan, yüksek erişilebilirlik gerektiren ve sık güncellenen uygulamalar için çok daha uygundur. Stateless (durumsuz) uygulamalar için uygulaması daha kolaydır. Durum bilgisi olan (stateful) uygulamalar için veri tabanı veya depolama katmanında ek stratejiler (veri replikasyonu, schema uyumluluğu) gerekebilir.
- Gateway API kullanmak zorunlu mu?
- Hayır, zorunlu değildir. Geleneksel Ingress kaynakları veya doğrudan DigitalOcean Load Balancer ile de mavi-yeşil dağıtımlar yapılabilir. Ancak Gateway API, özellikle karmaşık trafik yönetimi (ağırlıklı yönlendirme gibi) ve rol ayrımı açısından daha gelişmiş ve geleceğe yönelik bir çözüm sunar. Basit senaryolar için Ingress yeterli olabilir.
- Geri alma ne kadar sürer?
- Gateway API ile yapılan mavi-yeşil dağıtımlarda geri alma,
HTTPRoutenesnesini güncelleyerek trafiği tekrar mavi ortama yönlendirmek kadar hızlıdır. Bu işlem genellikle saniyeler içinde tamamlanır, bu da kullanıcıların kesintiden minimum düzeyde etkilenmesini sağlar. - DOKS üzerinde mavi-yeşil dağıtımın maliyet etkisi nedir?
- Mavi-yeşil dağıtım, iki ayrı ortamı (mavi ve yeşil) aynı anda çalıştırdığı için, kısa bir süre boyunca normalden daha fazla kaynak (node, CPU, RAM) tüketebilir. Ancak DOKS’un ölçeklenebilirlik özellikleri sayesinde, yeşil ortam sadece test ve geçiş süresince tam kapasitede tutulur ve geçiş tamamlandıktan sonra eski mavi ortam kaynakları serbest bırakılabilir. Bu, maliyet etkisini optimize etmeye yardımcı olur. Ayrıca, kesinti maliyetini düşürdüğü için uzun vadede karlı bir stratejidir.
- Mavi-Yeşil dağıtım ile Canary dağıtımları arasındaki fark nedir?
- Her ikisi de kesintisiz dağıtım stratejileridir ve trafiği kademeli olarak yönlendirme yeteneğine sahiptir. Ancak Mavi-Yeşil genellikle iki tam ortam arasında büyük ölçekli bir geçişi ifade ederken, Canary dağıtımları çok daha küçük bir kullanıcı alt kümesine (örneğin %1-5) yeni sürümü sunarak daha ince taneli testler yapmayı hedefler. Mavi-Yeşil’de geri alma, tüm trafiği eski ortama anında yönlendirme ile olurken, Canary’de sorunlu küçük grubu geri çekmek yeterli olabilir. Gateway API, her iki stratejiyi de destekleyecek esnekliğe sahiptir.