Blue-Green և Canary depla
Blue-Green և Canary deple
1) Խնդիրը և հիմնական գաղափարները
Blue-Green և Canary-ը ոչ ստանդարտ օրինագծերի ռազմավարություններ են, որոնք նվազեցնում են իրականացման ռիսկը
Blue-Green: Մենք պահում ենք երկու զուգահեռ տարբերակներ (Blue-ը ակտիվ է, Green-ը նոր է), մենք անցնում ենք ատոմային։ Արագ արձագանքը պլանավորվում է անմիջապես վերադարձնել Blue-ը։
Canary: Մենք միացնում ենք նոր տարբերակը ոչ պաշտոնական (1% 245% 2425% 2450% 24100%), մենք վերահսկում ենք SLO-metrics և կանգ առնում/նվազեցնում քայքայման ժամանակ։
Ընդհանուր սկզբունքը 'առանձնացնել «արտեֆակտը» «միացումից» և ավտոմատացնել դիտարկումը + արձագանքները։
2) Ե՞ րբ ընտրել
Blue-Green հարմար է, երբ
անհրաժեշտ է ակնթարթային անցում (կոշտ RTO), պարզ state-less ծառայություններ։
կան խիստ պատուհաններ։
շատ թանկ է պահել երկար երկակի հզորությունը, բայց կարճ ժամանակում հնարավոր է։
Canary հարմար է, երբ
Բարդ փոփոխություններ, իրական օպտիկայի վրա կանոնավոր վալիդացիա է պահանջվում։
կա տեսանելի հեռուստացույց (SLO, բիզնես մետրեր), մեքենայի ոտքի հնարավորություն։
քննադատաբար սահմանափակել պարտության շառավիղը (fintech/iGaming հոսքեր)։
Combo-pattern 'Green-ը և անցնել դրա վրա canary աստիճանով (Blue-Green որպես շրջանակ, Canary-ը որպես կոդավորման մեթոդ)։
3) Ուղղորդման ճարտարապետությունը
Կոդավորման/դաջվածքների տարբերակները
1. L4/L7 հավասարակշռող (ALB/NLB, Cloud Load Balancer) - կշռված target delups։
2. API-դարպասը/WAF-ը rome/weight տարբերակներով, վերնագրերով, cookie, տարածաշրջաններով։
3. Mesh (Istio/Linkerd/Consul) - տոկոսային բաշխում, fox-միգրացիա, timauts/retrav/սահմանափակումներ։
4. Ingress/NGINX/Envoy - upstream քաշը և ուղղորդումը։
5. Argo Rollouts/Flagger-ը կառավարիչ, ավտոմատ առաջընթացը, Prometheus/New Relic/Dradog-ի հետ ինտեգրումը։
4) Kubernetes: գործնական ձևանմուշներ
4. 1 Blue-Green (Euronector-ի միջոցով)
Два Deployment: `app-blue` и `app-green`.
Մեկ Windows 'ap-svc "- ը, որն անհրաժեշտ է" version "-ի համար։
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}]
Փոխումը սելեկտորի ատոմային փոփոխությունն է (կամ պիտակը), որը վերահսկվում է intain-ով։
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
Փոխեք «weight» քայլերը։ ավելացրեք retry, timeout, www.ier-detector Destinae Rule-ում։
4. 3 Argo Rollouts (Auto-canarech Pogon)
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"]
Ձևաչափի վերլուծությունը կապված է մետրիկների հետ (տե՛ ս ներքևում)։
5) SLO-gates և Auto-ravat
Պաշտպանված մետրերը (օրինակներ)
Տեխնիկական ՝ «p95 _ latency», «5xx _ rate», «error _ budget _ burn», «CPU/Memory throttling»։
Ապրանքային ՝ «CR (դեպոզիտ)», «հաջողությունը», «արագ ֆրոդ», «ARPPU» (սառը պատուհանների վրա)։
Ոտքի քաղաքականությունը (օրինակ)
Եթե «5xx _ rate» նոր տարբերակը> 0։ Հինգ տոկոսը 10 րոպե 'pause և rollback։
Եթե "p95 _ latency '24> 20 տոկոսը կղզիներից rollback է։
Եթե կանարեկների առաջխաղացումը գնում է, բայց SLO բյուջեն այրվում է> 2 %/ժամ - hold։
Argo AnalysTemplate (պարզեցված)
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) Տվյալները և համատեղելիությունը (ցավի ամենատարածված պատճառը)
Օգտագործեք expand www.migrate ww.ract ռազմավարությունը
Expand: ավելացնել նոր nullable սյունակներ/ինդեքսներ, աջակցել երկու սխեմաները։
Migrate: կրկնակի ձայնագրություն/կարդալ, back-fill։
Medract: հեռացնել հին դաշտերը/կոդը 100% ռուբլիից հետո։
Իրադարձական/հերթերը 'տարբերակել payload (v1/v2), աջակցեք idempotency-ին։
Քաշ/նստաշրջան 'տարբերակել բանալիները։ ապահովեք ձևաչափի համատեղելիությունը։
7) CI/CD և GitOps-ի ինտեգրումը
CI 'մեկ արտեֆակտի հավաքածու (build once), պատկերի ստորագրություն, SBSA, թեստեր։
CD 'արտեֆակտային արտեֆակտը շրջապատի միջոցով։ Blue-Green/Canary ղեկավարվում են մանիֆեստներով։
GitOps: multMR-ը (Argo CD/Flux) օգտագործում է քաշը/ընտրողը։
Environments/Approvals: prod տափաստանների համար 'ձեռքով gate + լուծումների աուդիտ։
8) NGINX/Envoy և ամպային LB: արագ օրինակներ
8. 1 NGINX (apstrims քաշը)
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-ի միջոցով։
Միացրեք CloudWatch-ալերտները rollback-ի (քաշի փոփոխությունը 0/100)։
9) Անվտանգությունն ու համապատասխանությունը
Zero trust տարբերակների միջև 'սահմանեք գաղտնիքները/ռոլինգ-բանալիները։
Policy-as-Code-ը 'չգրված պատկերների արգելք, «www.latest»։
Գաղտնիքները և դելիգները որպես տարբերակների արտեֆակտներ։ արձագանքը ներառում է եզրերի արձագանքը։
Աուդիտ 'Ո՞ վ, երբ բարձրացրեցի քաշը/փոխեց ընտրողը, թե ինչ հյուսով։
10) Արժեքը և հզորությունը
Blue-Green-ը պահանջում է կրկնակի հզորություն վճարման ժամանակահատվածի համար և պլանավորեք պատուհանը։
Canary-ը կարող է ձգվել ավելի երկար, քան հեռուստացույցի/դիտարկման արժեքը, երկու տարբերակների զուգահեռ պարունակությունը։
Օպտիմիզացիան 'autoscaling HPA/SNA, Blue-Green կարճ պատուհանները, գիշերային ֆորումները «ծանր» ծառայությունների համար։
11) Runbook (runbook)
1. Սառեցնել առաջխաղացումը (pause)։
2. Նվազեցնել Green քաշը մինչև 0% (canary )/վերադարձնել Blue (blue-green)։
3. Ստուգել 'սխալները/լատենտները վերադարձան հիմնականը, կապերը։
4. Բացեք դեպքը, հավաքեք արտեֆակտներ (լոգներ, ուղիներ, մետրիկի համեմատություն)։
5. Fix/reprod stage-ում, smoke-ը, վերաարտադրել առաջընթացը։
12) Anti-patterna
Արտեֆակտի փոխպատվաստումը stage-ի միջև (խախտումը «build once»)։
«Խուլ» canary առանց SLO/metric - ֆորմալություն, ոչ թե պաշտպանություն։
Ֆիչի դրոշների բացակայությունը 'ռելիզը ստիպված է անմիջապես ներառել վարքագիծը 100 տոկոսով։
Չաշխատող health-winks/liveness-ը բացատրում է «կպչուն» և կեղծ։
BD-ի համատեղելիությունը «ավշի վրա», պայմանագիրը կոտրվում է, երբ այն անցնում է։
Պատկերների մուտաբելային թեգերը/« latest »վաճառքում։
13) Ներդրման թուղթ (0-45 օր)
0-10 օր
Ընտրել ծառայությունների ռազմավարություն 'B/G, Canary կամ համակցված։
Միացրեք պատկերների ստորագրումը, health-winks, readiness-փորձարկումներ, «wwww.latest»։
Պատրաստել dashbords SLO (latency/error rate/բիզնես մետր)։
11-25 օր
Քաշը ավտոմատացնել (Istio/Argo Rollouts/ALB-weights)։
Տեղադրել anronsis templates, alerts և auto-rollback։
Մանիֆեստները (Helm/Kustomize), ինտեգրել GitOps-ի հետ։
26-45 օր
Ներդրել expand-migrate-medract ռազմավարությունը BD-ի համար։
Ծածկել կրիտիկական ֆլոուն kill-switch դրոշներով։
«Game day» 'սիմուլյացիայի և պատահականության մասին։
14) Հասունության մետրերը
Blue-Green/Canary (նպատակը> 90%)։
Միջին ժամանակը 108/արձագանքն է (նպատակը <3 րոպե)։
Ածխաջրածինների մասնաբաժինը SLO-ով (և առանց հետքի)։
Հեռուստատեսության ծառայությունների ծածկումը (traces/logs/metr.ru)> 95 տոկոսն է։
BD խմբակցությունների մասնաբաժինը expand-migrate-intract> 90 տոկոսն է։
15) Ծրագրեր ՝ քաղաքական ձևանմուշներ և պլայններ
OPA (չգրված պատկերների արգելք)
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])
}
Helm-values canary համար (պարզեցված)
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 - քաշի խթանիչ (կեղծ)
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) Եզրակացություն
Blue-Green-ը և Canary-ը փոխկապակցող չեն, այլ կոմպլեմենտային ռազմավարություններ։ Կառուցեք դրանք ստորագրված արտեֆակտների վերևում, SLO-ի դիտարկումը, ավտոմատ խաղերը և GitOps-ը։ Տարանջատեք առաքումը, պահեք արագ և կարգապահություն, և օրինագծերը կդառնան կանխատեսելի, անվտանգ և արագ։