Blue-Green və Canary Deploy
Blue-Green və Canary deploy
1) Vəzifə və əsas fikirlər
Blue-Green və Canary - tətbiq riskini azaldan davamlı buraxılış strategiyaları:- Blue-Green: Biz iki paralel versiyası saxlayın (Blue - aktiv, Green - yeni), atomik trafik keçid. Sürətli geri → dərhal Blue geri.
- Canary: mərhələli olaraq yeni versiyanı (1% → 5% → 25% → 50% → 100%) işə salın, SLO metrikasını izləyin və deqradasiya zamanı dayandırın/geri çəkin.
Ümumi prinsip: "artefaktın çatdırılması 'nı" trafikin daxil edilməsindən "ayırmaq və müşahidə + geri çəkilmələri avtomatlaşdırmaq.
2) Nə zaman seçmək lazımdır
Blue-Green uyğun zaman:- ani keçid lazımdır (sərt RTO), sadə state-less xidmətləri;
- ciddi buraxılış/dondurma pəncərələri və başa düşülən smoke yoxlamalar var;
- uzunmüddətli ikiqat tutmaq bahadır - lakin qısa müddətdə mümkündür.
- mürəkkəb dəyişikliklər, real trafikdə mərhələli validasiya tələb olunur;
- yetkin telemetri (SLO, biznes metrik), avtomatik stop imkanı var;
- qırılma radiusunu məhdudlaşdırmaq (fintech/iGaming axınları).
Combo-desen: Green-in yuvarlanması və canary-pillələri vasitəsilə keçid (Blue-Green bir çərçivə kimi, Canary bir trafik transfer üsulu kimi).
3) Trafik marşrutlaşdırma arxitekturası
Keçid/trafik doldurma variantları:1. L4/L7 Balanslayıcı (ALB/NLB, Cloud Load Balancer) - target qrupları.
2. API-şlyuz/WAF - versiyalar, başlıqlar, cookie, regionlar üzrə route/weight.
3. Service Mesh (Istio/Linkerd/Consul) - faiz paylanması, fault-inyeksiya, taymaut/retraj/məhdudiyyətlər.
4. Ingress/NGINX/Envoy - upstream-çəkilər və atributlara görə marşrutlaşdırma.
5. Argo Rollouts/Flagger - nəzarət operatoru, avtomatik irəliləyiş, Prometheus/New Relic/Datadog ilə inteqrasiya.
4) Kubernetes: praktik şablonlar
4. 1 Blue-Green (Service selector vasitəsilə)
Два Deployment: `app-blue` и `app-green`.
Bir Service 'app-svc' istədiyiniz 'version' selektoru ilə.
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}]
Keçid - nəzarət drain ilə selektor (və ya etiket) atom dəyişikliyi.
4. 2 Canary (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
pillələrdə 'weight' dəyişdirin; DestinationRule-də retry, timeout, outlier-detector əlavə edin.
4. 3 Argo Rollouts (avto-kanarya qaçışı)
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"]
Analitik şablon metrlərlə bağlıdır (aşağıya bax).
5) SLO-geytlar və avtomatik geri dönüş
Qorunan metriklər (nümunələr):- Texniki: 'p95 _ latency', '5xx _ rate', 'error _ budget _ burn', 'CPU/Memory throttling'.
- Məhsullar: 'CR (depozit)', 'ödənişlərin müvəffəqiyyəti', 'skorinq-froda', 'ARPPU' (soyuq pəncərələrdə).
- Əgər '5xx _ rate' yeni versiyası> 0. 10 dəqiqə ərzində 5% - pause və rollback.
- Əgər 'p95 _ latency' ↑> 20% -dən baza - rollback.
- Əgər promosyon kanarya gedir, lakin SLO büdcə yandırılır> 2 %/saat - hold.
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) Məlumat və uyğunluq (ən çox ağrının səbəbi)
expand → migrate → contract strategiyasını istifadə edin:- Expand: Yeni nullable-hoparlörlər/indekslər əlavə edin, hər iki sxemi dəstəkləyin.
- Migrate: ikiqat qeyd/oxu, geri doldurma.
- Contract: 100% trafik çıxdıqdan sonra köhnə sahələri/kodu silmək.
- Hadisə/növbələr: payload (v1/v2) versiyasını verin, idempotency dəstəkləyin.
- Cache/seanslar: açarları versiyası; formatın uyğunluğunu təmin edin.
7) CI/CD və GitOps ilə inteqrasiya
CI: Vahid artefaktın (build once) yığılması, şəkil imzası, SBOM, testlər.
CD: ətraf mühit vasitəsilə artefaktın təşviqi; Blue-Green/Canary manifestlər tərəfindən idarə olunur.
GitOps: MR → kontroller (Argo CD/Flux )/selektor çəkiləri tətbiq edir.
Environments/Approvals: Prod-steps üçün - əl qapısı + audit həlləri.
8) NGINX/Envoy və bulud LB: sürətli nümunələr
8. 1 NGINX (axınların çəkisi)
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 (Weighted Target Groups)
TG-Blue: 90, TG-Green: 10 → IaC/CLI vasitəsilə çəki dəyişdirin.
CloudWatch alertlərini rollback avto-skriptlərinə bağlayın (çəkini 0/100-ə dəyişdirin).
9) Təhlükəsizlik və uyğunluq
Versiyalar arasında sıfır güvən: sirləri/rolling şifrələmə açarlarını ayırın.
Policy-as-Code: imzasız şəkillərin deploi qadağası, 'no latest'.
Sirləri və konfiqləri kimi artefaktlar versiyası; geri dönüş konfiqurasiya geri dönüş daxildir.
Audit: kim, nə vaxt çəkini qaldırdı/seçicini dəyişdi, hansı biletlə.
10) Dəyəri və tutumu
Blue-Green çıxış dövrü üçün ikiqat güc tələb edir → pəncərəni planlaşdırın.
Canary daha uzun çəkə bilər → telemetriya/müşahidə dəyəri, iki versiyanın paralel məzmunu.
Optimizasiya: HPA/VPA autoscaling, Blue-Green qısa pəncərələr, «ağır» xidmətlər üçün gecə buraxılışları.
11) Geri qaytarma (runbook)
1. Promosyonu dondur (pause).
2. Green ağırlığını 0% (canary) qədər azaltın/seçicini Blue-green-ə qaytarın.
3. Check: səhvlər/gecikmə əsas geri, drenaj bağlantıları.
4. Hadisəni açın, artefaktları toplayın (loqlar, treklər, metriklərin müqayisəsi).
5. stage fix/reprode, smoke qovmaq, tərəqqini yenidən başlamaq.
12) Anti-nümunələr
stage və prod arasında artefaktın yenidən toplanması («build once» pozuntusu).
SLO/metrik olmadan «kar» canary - müdafiə deyil, formalizm.
Fic bayraqlarının olmaması: buraxılış dərhal 100% davranışı əhatə etmək məcburiyyətindədir.
Health-checks/liveness → «yapışmış» pod və saxta sabitlik.
DB «təsadüfi» uyğunluğu: keçid zamanı müqavilə pozulur.
Prodda/' latest 'şəkillərinin mutabel etiketləri.
13) Giriş çek siyahısı (0-45 gün)
0-10 gün
B/G, Canary və ya birləşdirilmiş xidmətlər üçün strategiya seçin.
Image imza daxil edin, health-checks, readiness-testlər, 'no latest'.
SLO (latency/error rate/business metrics) dashboard hazırlamaq.
11-25 gün
Ağırlıqları avtomatlaşdırın (Istio/Argo Rollouts/ALB-weights).
analysis templates, alert və auto-rollback konfiqurasiya.
Manifestləri şablonlaşdırın (Helm/Kustomize), GitOps ilə inteqrasiya edin.
26-45 gün
DB üçün expand-migrate-contract strategiyasını tətbiq edin.
Kritik flow kill-switch bayraqları örtmək.
«game day» keçirmək: geri və hadisə simulyasiya.
14) Yetkinlik metrikası
Blue-Green/Canary vasitəsilə buraxılışların% -i (hədəf> 90%).
Orta keçid/geri dönüş vaxtı (hədəf <3 dəq).
SLO avto-stop buraxılışlarının payı (və insidentsiz).
Telemetriya xidmətləri (traces/logs/metrics)> 95%.
expand-migrate-contract sxemi üzrə DB miqrasiyasının payı> 90%.
15) Proqramlar: siyasət və paylayn şablonları
OPA (imzasız şəkillərin qadağan edilməsi)
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])
}
canary üçün Helm-values (sadələşdirilmiş)
yaml canary:
enabled: true steps:
- weight: 5 pause: 300
- weight: 25 pause: 600
- weight: 50 pause: 900 sloGuards:
max5xxPct: 0. 5 maxP95IncreasePct: 20
GitHub Actions - çəki promosyonu (psevdo)
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) Nəticə
Blue-Green və Canary - qarşılıqlı istisna deyil, tamamlayıcı strategiyalardır. Onları imzalanmış artefaktların, SLO-ların, avtomatik geytlərin və GitOps-idarəetmənin üzərində qurun. Çatdırılmanı daxil olmaqdan ayırın, sürətli geri dönüş və miqrasiya nizam-intizamı saxlayın - və buraxılışlar proqnozlaşdırıla bilən, təhlükəsiz və sürətli olacaq.