Mavi-Yeşil ve Kanarya dağılımı
Mavi-Yeşil ve Kanarya dağıtımı
1) Meydan okuma ve anahtar fikirler
Blue-Green ve Canary, evlat edinme riskini azaltan kesintisiz sürüm stratejileridir:- Mavi-Yeşil: iki paralel sürümü (Mavi - aktif, Yeşil - yeni) tutun, trafiği atomik olarak değiştirin. Hızlı bir geri dönüş - anında Mavi'yi döndürür.
- Kanarya: yeni sürümü aşamalar halinde açın (%1 - %5 - %25 - %50 - %100), SLO metriklerini izleyin ve bozulma sırasında durun/geri dönün.
Genel ilke, "eser teslimini" "trafik dahil etme'den ayırmak ve gözlemlenebilirliği + geri dönüşleri otomatikleştirmektir.
2) Ne zaman seçilir
Mavi-Yeşil şu durumlarda uygundur:- Anında anahtarlama (sabit RTO), basit devletsiz hizmetler;
- Sıkı serbest bırakma/dondurma pencereleri ve açık duman kontrolleri vardır;
- Uzun bir çift kapasite tutmak pahalıdır - ancak kısa bir süre için mümkündür.
- Karmaşık değişiklikler, gerçek trafikte adım adım doğrulama gereklidir;
- Olgun telemetri (SLO, iş metrikleri), otomatik durdurma yeteneği vardır;
- Hasar yarıçapını kritik olarak sınırlar (fintech/iGaming akışları).
Combo deseni: Yeşil'i açın ve kanarya aşamalarından (çerçeve olarak Mavi-Yeşil, trafik taşıma yöntemi olarak Kanarya) geçin.
3) Trafik yönlendirme mimarisi
Trafik değiştirme/ekleme seçenekleri:1. L4/L7 dengeleyici (ALB/NLB, Cloud Load Balancer) - ağırlıklı hedef gruplar.
2. API ağ geçidi/WAF - sürümlere, başlıklara, çerezlere, bölgelere göre rota/ağırlık.
3. Servis Mesh (Istio/Linkerd/Consul) - yüzde dağıtım, hata enjeksiyon, zaman aşımı/retray/kısıtlama kolları.
4. Giriş/NGINX/Elçi - yukarı akış ağırlıkları ve öznitelik yönlendirmesi.
5. Argo Rollouts/Flagger - operatör-denetleyici, otomatik ilerleme, Prometheus/New Relic/Datadog ile entegrasyon.
4) Kubernetes: pratik şablonlar
4. 1 Mavi-Yeşil (Servis seçici aracılığıyla)
Два Dağıtım: 'Uygulama mavisi' и 'uygulama yeşili'.
İstenilen 'sürüm' için bir seçici ile bir Hizmet 'app-svc'.
yaml apiVersion: apps/v1 kind: Deployment metadata: { name: app-green, labels: { app: app, version: green } }
spec:
replicas: 4 selector: { matchLabels: { app: app, version: green } }
template:
metadata: { labels: { app: app, version: green } }
spec:
containers:
- name: app image: ghcr. io/org/app:1. 8. 0 apiVersion: v1 kind: Service metadata: { name: app-svc }
spec:
selector: {app: app, version: blue} # ← switch to green - change ports: [{port: 80, targetPort: 8080}]
Anahtarlama - kontrollü drenaj ile seçici (veya etiketlerin) atomik değişimi.
4. 2 Kanarya (Istio VirtualService)
yaml apiVersion: networking. istio. io/v1beta1 kind: VirtualService metadata: { name: app }
spec:
hosts: ["app. example. com"]
http:
- route:
- destination: { host: app. blue. svc. cluster. local, subset: v1 }
weight: 90
- destination: { host: app. green. svc. cluster. local, subset: v2 }
weight: 10
'Ağırlığı' adım adım değiştirin; DestinationRule'a yeniden deneme, zaman aşımı, aykırı değer dedektörü ekleyin.
4. 3 Argo Rollouts (Otomatik Kanarya Run)
yaml apiVersion: argoproj. io/v1alpha1 kind: Rollout metadata: { name: app }
spec:
replicas: 6 strategy:
canary:
canaryService: app-canary stableService: app-stable steps:
- setWeight: 5
- pause: {duration: 300} # 5 min observation
- analysis:
templates:
- templateName: slo-guard
- setWeight: 25
- pause: { duration: 600 }
- analysis:
templates: [{ templateName: slo-guard }]
- setWeight: 50
- pause: {}
trafficRouting:
istio:
virtualService:
name: app routes: ["http-route"]
Şablon analizi metriklerle ilişkilidir (aşağıya bakınız).
5) SLO kapıları ve otomatik geri alma
Korumalı metrikler (örnekler):- Teknik: 'P95 _ latency', '5xx _ rate', 'error _ budget _ burn', 'CPU/Memory throttling'.
- Bakkal: 'CR (depozito)', 'ödemelerin başarısı', 'puanlama sahtekarlığı', 'ARPPU' (soğuk pencerelerde).
- Yeni sürümün '5xx _ rate' değeri> 0 ise. 10 dakika için %5 - duraklatma ve geri alma.
- 'P95 _ latency' tabanının %20'sini ↑> - geri alma.
- Kanarya promosyonu giderse ancak bütçe SLO yakılırsa> %2/saat - bekleyin.
yaml apiVersion: argoproj. io/v1alpha1 kind: AnalysisTemplate metadata: { name: slo-guard }
spec:
metrics:
- name: http_5xx_rate interval: 1m successCondition: result < 0. 005 provider:
prometheus:
address: http://prometheus. monitoring:9090 query:
sum(rate(http_requests_total{app="app",status=~"5.."}[5m])) /
sum(rate(http_requests_total{app="app"}[5m]))
6) Veri ve uyumluluk (ağrının en yaygın nedeni)
Genişlet, göç et, sözleşme stratejisini kullan:- Genişlet: yeni geçersiz sütunlar/dizinler ekleyin, her iki şemayı da destekleyin.
- Geçiş: Çift Yazma/Okuma, Geri Doldurma.
- Sözleşme: Trafiğin %100'ünden çıktıktan sonra eski alanları/kodu silin.
- Olay/kuyruklar: sürüm yükü (v1/v2), idempotency desteği.
- Önbellek/oturumlar: sürüm anahtarları; Biçim uyumluluğundan emin olun.
7) CI/CD ve GitOps ile entegrasyon
CI: bir kez inşa et, görüntü imzası, SBOM, testler.
CD: ortamlar aracılığıyla eser tanıtımı; Mavi-Yeşil/Kanarya manifestolar tarafından yönetilir.
GitOps: MR ™ denetleyici (Argo CD/Flux) ağırlıklar/seçiciler uygular.
Ortamlar/Onaylar: üretim adımları için - manuel kapı + denetim kararları.
8) NGINX/Elçi ve Bulut LB'leri: Hızlı Örnekler
8. 1 NGINX (yukarı akış ağırlıkları)
nginx upstream app_upstream {
server app-blue:8080 weight=90;
server app-green:8080 weight=10;
}
server {
location / { proxy_pass http://app_upstream; }
}
8. 2 AWS ALB (Ağırlıklı Hedef Gruplar)
TG-Blue: 90, TG-Green: 10 - IaC/CLI ile ağırlıkları değiştirin.
Otomatik komut dosyalarını geri almak için CloudWatch uyarılarını bağlayın (ağırlık 0/100 olarak değiştirilir).
9) Güvenlik ve uyumluluk
Sürümler arasında sıfır güven: Şifreleme sırları/yuvarlanan anahtarlar arasında ayrım yapın.
Kod Olarak İlke: imzasız görüntü dağıtımına izin vermez,'en son 'değildir.
Sürüm artefaktları olarak sırlar ve yapılandırmalar; Geri alma, yapılandırmaların geri alınmasını içerir.
Denetim: Kim, ağırlığı kaldırdığında/seçiciyi değiştirdiğinde, hangi biletle.
10) Maliyet ve kapasite
Mavi-Yeşil, serbest bırakma süresi için iki kat güç gerektirir - bir pencere planlayın.
Kanarya daha uzun sürebilir - telemetri/gözetim maliyeti, iki versiyonun paralel içeriği.
Optimizasyon: HPA/VPA ile otomatik ölçeklendirme, kısa Mavi-Yeşil pencereler,'ağır "hizmetler için gece sürümleri.
11) Çalışma kitapları
1. Promosyonu durdurun.
2. Yeşil ağırlığı %0'a (kanarya )/dönüş seçicisini Mavi'ye (mavi-yeşil) düşürün.
3. Kontrol: hatalar/gecikme temel, boşaltma bağlantılarına geri döndü.
4. Bir olayı açın, eserler toplayın (günlükler, izler, metriklerin karşılaştırılması).
5. Fix/sahneye reprod, sürücü duman, ilerleme yeniden başlatın.
12) Anti-desenler
Sahne ve prod arasında bir eserin yeniden inşası ('bir kez inşa "ihlali).
SLO/metrikleri olmayan "sağır" kanarya bir formalitedir, savunma değildir.
Özellik bayraklarının olmaması: Serbest bırakma, bir kerede %100 davranışı içermek zorunda kalır.
Çalışmayan sağlık kontrolleri/canlılık - "yapışkan" dipler ve yanlış stabilite.
Veritabanı uyumluluğu "rastgele": geçiş yaparken sözleşme kesilir.
Prod'da değiştirilebilir görüntü etiketleri/'en son '.
13) Uygulama kontrol listesi (0-45 gün)
0-10 gün
Hizmetler için bir strateji seçin: B/G, Kanarya veya kombine.
Görüntü imzalama, sağlık kontrolleri, hazır olma örnekleri,'en son yok 'seçeneğini etkinleştirin.
SLO panoları hazırlayın (gecikme/hata oranı/iş metrikleri).
11-25 gün
Ağırlıkları otomatikleştirin (Istio/Argo Rollouts/ALB ağırlıkları).
Analiz şablonlarını, uyarıları ve otomatik geri dönüşü yapılandırın.
Şablon manifestoları (Helm/Kustomize), GitOps ile tümleşir.
26-45 gün
Veritabanı için expand-migrate-contract stratejisini uygulayın.
Kritik kill-switch bayraklarını kapatın.
"Oyun günü" geçirin: bir geri dönüş ve olayı simüle edin.
14) Olgunluk metrikleri
Mavi-Yeşil/Kanarya yoluyla yapılan yayınların %'si (hedef> %90).
Ortalama geçiş/geri alma süresi (hedef <3 dk).
SLO otomatik durdurma ile sürümlerin paylaşımı (ve olaysız).
Telemetri ile servis kapsamı (izler/günlükler/metrikler)> %95.
Genişletme-taşıma-sözleşme şemasına göre DB geçişlerinin payı> %90'dır.
15) Ekler: Politika ve Boru Hattı Şablonları
OPA (imzasız görüntülere izin verme)
rego package admission. image
deny[msg] {
input. request. kind. kind == "Deployment"
some c img:= input. request. object. spec. template. spec. containers[c].image not startswith(img, "ghcr. io/org/")
msg:= sprintf("Image not from trusted registry: %v", [img])
}
Kanarya için dümen değerleri (basitleştirilmiş)
yaml canary:
enabled: true steps:
- weight: 5 pause: 300
- weight: 25 pause: 600
- weight: 50 pause: 900 sloGuards:
max5xxPct: 0. 5 maxP95IncreasePct: 20
GitHub Eylemleri - ağırlık promosyonu (sözde)
yaml
- name: Promote canary to 25%
run: kubectl patch virtualservice app \
--type=json \
-p='[{"op":"replace","path":"/spec/http/0/route/1/weight","value":25}]'
16) Sonuç
Mavi-Yeşil ve Kanarya birbirini dışlayan değil, tamamlayıcı stratejilerdir. İmzalı eserler, SLO gözlemlenebilirliği, otomatik kapılar ve GitOps kontrolü üzerine inşa edin. Teslimatı dahil etmekten ayırın, hızlı bir geri dönüş ve geçiş disiplini sağlayın - ve bültenler öngörülebilir, güvenli ve hızlı hale gelir.