ЁЯОЪя╕П рдзрдбрд╛ 06 тАФ Progressive delivery рдЖрдгрд┐ feature flags: exposure рдЖрдгрд┐ rollback рдЪрд╛ рд╡реЗрдЧ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 06 ┬╖ рдорд╛рдЧреЗ: lesson-05-canary-analysis ┬╖ рдкреБрдвреЗ: lesson-07-capacity-planning
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 05, рдЕрдзрд┐рдХ рд╡рд╛рдИрдЯ рдмрджрд▓рд╛рдЪреЗ рдЧрдгрд┐рдд. рд╡рд╛рдИрдЯ рдмрджрд▓ рдХрд┐рддреА requests рдирд╛ рддреНрд░рд╛рд╕ рджреЗрддреЛ рд╣реЗ рддреАрди рдЧреЛрд╖реНрдЯреАрдВрд╡рд░
рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ: рддреЛ рдХрд┐рддреА users рдирд╛ рджрд┐рд╕рддреЛ (exposure), рддреБрдореНрд╣рд╛рд▓рд╛ рддреЛ рдХрд┐рддреА рд▓рд╡рдХрд░ рд▓рдХреНрд╖рд╛рдд рдпреЗрддреЛ
(detection) рдЖрдгрд┐ рддреБрдореНрд╣реА рддреЛ рдХрд┐рддреА рд╡реЗрдЧрд╛рдиреЗ рдЙрд▓рдЯрд╡рддрд╛ (rollback). Progressive rollouts рдкрд╣рд┐рд▓реА
рдЧреЛрд╖реНрдЯ рд▓рд╣рд╛рди рдХрд░рддрд╛рдд; feature flags рд╢реЗрд╡рдЯрдЪреА. sre/crew.py рдордзреАрд▓ rollout_damage
рдЖрдгрд┐ sre/demo.py рдордзреАрд▓ rollout().
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдкрдердХ рд╢рд╛рд│реЗрддрд▓реЗ рджрд┐рд╡реЗ рдмрджрд▓рддреЗ. ЁЯТб рдирд╡реНрдпрд╛ рджрд┐рд╡реНрдпрд╛рдВрдордзреНрдпреЗ рдПрдХ рджреЛрд╖ рдЖрд╣реЗ: 10 рдкреИрдХреА 3 рдмрд▓реНрдм рд╡рд┐рдЭрддрд╛рдд.
рдкрд╣рд┐рд▓рд╛ рдЖрд░рд╛рдЦрдбрд╛: рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдПрдХрджрдо рдмрджрд▓рд╛. рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реАрдд рд╡рд┐рдЭрд▓реЗрд▓реЗ рдмрд▓реНрдм. рд▓рдХреНрд╖рд╛рдд рдпрд╛рдпрд▓рд╛ 5 рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧрддрд╛рдд, рдордЧ рдирд╡реЗ рджрд┐рд╡реЗ рдХрд╛рдвреВрди рдЬреБрдиреЗ рдкрд░рдд рд▓рд╛рд╡рд╛рдпрд▓рд╛ 15 рдорд┐рдирд┐рдЯреЗ.
рджреБрд╕рд░рд╛ рдЖрд░рд╛рдЦрдбрд╛: рддреЗрдЪ, рдкрдг рдкреНрд░рддреНрдпреЗрдХ рдирд╡реНрдпрд╛ рджрд┐рд╡реНрдпрд╛рд▓рд╛ рдПрдХ switch рдЖрд╣реЗ рдЬреЛ рдЬреБрдирд╛ рджрд┐рд╡рд╛ рдкрд░рдд рдЪрд╛рд▓реВ рдХрд░рддреЛ. 5 рдорд┐рдирд┐рдЯрд╛рдВрдд рд▓рдХреНрд╖рд╛рдд рдпреЗрддреЗ, 1 рдорд┐рдирд┐рдЯрд╛рдд switch рдлрд┐рд░рд╡рд▓рд╛ рдЬрд╛рддреЛ. рдЦреВрдкрдЪ рдЪрд╛рдВрдЧрд▓реЗ.
рддрд┐рд╕рд░рд╛ рдЖрд░рд╛рдЦрдбрд╛: рдЖрдзреА рдлрдХреНрдд рд╢рдВрднрд░рд╛рддрд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рдмрджрд▓рд╛. рдлрдХреНрдд рддреНрдпрд╛рдЪ рдЦреЛрд▓реАрдд рд╡рд┐рдЭрд▓реЗрд▓реЗ рдмрд▓реНрдм. рд▓рдХреНрд╖рд╛рдд рдпрд╛рдпрд▓рд╛ рдереЛрдбрд╛ рдЬрд╛рд╕реНрдд рд╡реЗрд│ рд▓рд╛рдЧрддреЛ (рдлрдХреНрдд рдереЛрдбреНрдпрд╛рдЪ рддрдХреНрд░рд╛рд░реА), рдкрдг рдлрд╛рд░рдЪ рдХрдореА рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдВрдирд╛ рддреНрд░рд╛рд╕ рдЭрд╛рд▓рд╛.
рдЪреМрдерд╛ рдЖрд░рд╛рдЦрдбрд╛: рд╢рдВрднрд░рд╛рддрд▓реА рдПрдХ рдЦреЛрд▓реА, рдЖрдгрд┐ switch. рд╕рдЧрд│реНрдпрд╛рдВрдд рдХрдореА рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдЕрдВрдзрд╛рд░рд╛рдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
d["ЁЯТе bad change<br/>fails 30% of its requests<br/>1,000 requests/min"] --> bb["big bang + redeploy<br/>300 bad/min ├Ч (5 + 15) min<br/>6,000 failed"]
d --> bf["big bang + flag off<br/>300 ├Ч (5 + 1)<br/>1,800"]
d --> cr["1% canary + redeploy<br/>3 ├Ч (10 + 15)<br/>75"]
d --> cf["1% canary + flag off<br/>3 ├Ч (10 + 1)<br/>33"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l06
тЭУ рдХрд╛рдп
- Big-bang deploy тАФ рдкреНрд░рддреНрдпреЗрдХ user рд▓рд╛ рдирд╡реА version рдПрдХрджрдо рдорд┐рд│рддреЗ. рдкреВрд░реНрдг рд╡реНрд╣рд╛рдпрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рд╡реЗрдЧрд╡рд╛рди, рд╕рд░реНрд╡рд╛рдд рдореЛрдард╛ blast radius.
- Progressive delivery тАФ traffic рдЪрд╛ рд╡рд╛рдЯрд╛ рдЯрдкреНрдкреНрдпрд╛рдЯрдкреНрдкреНрдпрд╛рдиреЗ рд╡рд╛рдврд╡рд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде 1% тЖТ 5% тЖТ 25% тЖТ 100%), рдЯрдкреНрдкреНрдпрд╛рдВрдЪреНрдпрд╛ рдордзреНрдпреЗ automatic check (рдзрдбрд╛ 05) рд╕рд╣, рдЖрдгрд┐ check fail рдЭрд╛рд▓рд╛ рддрд░ рдерд╛рдВрдмрд╛ рдЖрдгрд┐ rollback рдХрд░рд╛.
- Exposure тАФ рдирд╡реНрдпрд╛ version рд╡рд░рдЪрд╛ traffic рдЪрд╛ рд╡рд╛рдЯрд╛. рдорд┐рдирд┐рдЯрд╛рдорд╛рдЧрдЪреЗ рдиреБрдХрд╕рд╛рди = рдорд┐рдирд┐рдЯрд╛рдорд╛рдЧрдЪреНрдпрд╛ requests ├Ч exposure ├Ч failure rate.
- Detection time тАФ check рдЙрд▓рдЯреЗрдкрд░реНрдпрдВрдд рдХрд┐рддреА рд╡реЗрд│. рдХрдореА exposure рд╡рд░ рджрд┐рд╕рдгрд╛рд░реА рдЕрдкрдпрд╢реЗ рдХрдореА рдЕрд╕рддрд╛рдд, рдореНрд╣рдгреВрди detection рд╣рд│реВ рд╣реЛрддреЗ; lab рд▓рд╛ 30 рдЕрдкрдпрд╢рд╛рдВрдирдВрддрд░ рд▓рдХреНрд╖рд╛рдд рдпреЗрддреЗ, рдкрдг 5 рдорд┐рдирд┐рдЯрд╛рдВрдкреЗрдХреНрд╖рд╛ рдЖрдзреА рдХрдзреАрдЪ рдирд╛рд╣реА.
- Rollback тАФ рдЬреБрдиреНрдпрд╛ рд╡рд░реНрддрдирд╛рдХрдбреЗ рдкрд░рдд рдЬрд╛рдгреЗ. рдЬреБрдиреНрдпрд╛ build рдЪреЗ redeploy рдЕрдиреЗрдХ рдорд┐рдирд┐рдЯреЗ рдШреЗрдК рд╢рдХрддреЗ; traffic рдкрд░рдд рд╡рд│рд╡рдгреЗ рдХрд┐рдВрд╡рд╛ flag рдмрдВрдж рдХрд░рдгреЗ рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдВрдд рд╣реЛрдК рд╢рдХрддреЗ.
- Feature flag (feature toggle) тАФ code рдордзреАрд▓ runtime switch:
if flag("new-engine"): new path else: old path. рдпрд╛рдореБрд│реЗ рддреБрдореНрд╣реА code рдЕрдВрдзрд╛рд░рд╛рдд deploy рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рддреЛ рд╡реЗрдЧрд│рд╛ release рдХрд░реВ рд╢рдХрддрд╛, users рдЪреНрдпрд╛ рдард░рд╛рд╡рд┐рдХ рдЯрдХреНрдХреНрдпрд╛рдВрдирд╛, рдЖрдгрд┐ deploy рди рдХрд░рддрд╛ рдмрдВрдж рдХрд░реВ рд╢рдХрддрд╛. Kill switch рдореНрд╣рдгрдЬреЗ рдЖрдгреАрдмрд╛рдгреАрдд feature рдкрдЯрдХрди рдмрдВрдж рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореБрджреНрджрд╛рдо рдареЗрд╡рд▓реЗрд▓рд╛ flag. - Flag debt тАФ рдкреНрд░рддреНрдпреЗрдХ flag рдПрдХ
ifрдЖрд╣реЗ рдЬреЛ test рдХрд░рд╛рдпрдЪреЗ рдорд╛рд░реНрдЧ рджреБрдкреНрдкрдЯ рдХрд░рддреЛ. Feature рдкреВрд░реНрдгрдкрдгреЗ рдмрд╛рд╣реЗрд░ рдЖрд▓реНрдпрд╛рд╡рд░ flags рдХрд╛рдвреВрди рдЯрд╛рдХрд╛. (рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рдХрд░рдг: 2012 рдордзреНрдпреЗ Knight Capital рдиреЗ рдПрдХ рдЬреБрдирд╛ flag рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓рд╛; рдПрдХрд╛ deploy рдордзреНрдпреЗ рдЖрдардкреИрдХреА рдПрдХ server рд╕реБрдЯрд▓рд╛ рд╣реЛрддрд╛, flag рдиреЗ рддрд┐рдерд▓рд╛ рдЦреВрдк рдкреВрд░реНрд╡реА рдореЗрд▓реЗрд▓рд╛ code рдЬрд╛рдЧрд╛ рдХреЗрд▓рд╛, рдЖрдгрд┐ рдХрдВрдкрдиреАрдиреЗ 45 рдорд┐рдирд┐рдЯрд╛рдВрдд рд╕реБрдорд╛рд░реЗ $440 million рдЧрдорд╛рд╡рд▓реЗ.) - Rollback-safe рдмрджрд▓ тАФ рдЬреБрдиреА version data рд╕реЛрдмрдд рдЕрдЬреВрдирд╣реА рдЪрд╛рд▓рдд рдЕрд╕реЗрд▓ рддрд░рдЪ rollback рдЙрдкрдпреЛрдЧреА рдкрдбрддреЛ. Database рдмрджрд▓рд╛рдВрд╕рд╛рдареА expand and contract рд╡рд╛рдкрд░рддрд╛рдд: рдЖрдзреА рдирд╡рд╛ column рдЬреЛрдбрд╛, рджреЛрдиреНрд╣реАрдд рд▓рд┐рд╣рд╛, reads рдмрджрд▓рд╛, рдЖрдгрд┐ рдЬреБрдирд╛ column рдирдВрддрд░рдЪреНрдпрд╛ release рдордзреНрдпреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг detection рдХрдзреАрдЪ рддрд╛рддреНрдХрд╛рд│ рдирд╕рддреЗ рдЖрдгрд┐ рдХрд╛рд╣реА рд╡рд╛рдИрдЯ рдмрджрд▓ canary рдкрд╛рд░ рдХрд░рддрд╛рдд. рддреБрдордЪреНрдпрд╛ рд╣рд╛рддрд╛рдд рд╣реЗ рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд│реЗрдкрд░реНрдпрдВрдд рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдХрд┐рддреА рднрд╛рдЧрд╛рд▓рд╛ рдмрджрд▓ рджрд┐рд╕рддреЛ, рдЖрдгрд┐ рддреБрдореНрд╣реА рддреЛ рдХрд┐рддреА рд╡реЗрдЧрд╛рдиреЗ рдЙрд▓рдЯрд╡реВ рд╢рдХрддрд╛. Reliability рдЪреБрдХрд╛ рдХрдзреАрдЪ рди рдХрд░рдгреНрдпрд╛рддреВрди рдирд╡реНрд╣реЗ, рддрд░ рдЪреБрдХрд╛ рд▓рд╣рд╛рди рдЖрдгрд┐ рд╕реНрд╡рд╕реНрдд рдареЗрд╡рдгреНрдпрд╛рддреВрди рдпреЗрддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sre/crew.py рдордзреАрд▓ rollout_damage(rpm, exposure, fail_rate, rollback_min, detect_errors=30, min_detect_min=5)
(bad per minute, minutes to detect, total bad requests) рдкрд░рдд рджреЗрддреЗ: detection = 5 рдорд┐рдирд┐рдЯреЗ рдЖрдгрд┐ 30 рдЕрдкрдпрд╢реЗ рджрд┐рд╕рд╛рдпрд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реА рдорд┐рдирд┐рдЯреЗ рдпрд╛рдВрдкреИрдХреА рдЬреЗ рдореЛрдареЗ рддреЗ;
total = рдорд┐рдирд┐рдЯрд╛рдорд╛рдЧрдЪреНрдпрд╛ bad ├Ч (detection + rollback). rollout() рдорд┐рдирд┐рдЯрд╛рд▓рд╛ 1,000
requests рдЖрдгрд┐ 30% failure rate рд╡рд░ рдЪрд╛рд░ рдЖрд░рд╛рдЦрдбреНрдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sre/demo.py rollout
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from crew import rollout_damage
for exposure in (1.0, 0.25, 0.05, 0.01):
row = []
for rb in (15, 5, 1):
bad, det, total = rollout_damage(1000, exposure, 0.30, rb)
row.append(f"rollback {rb:>2} min тЖТ {total:>5,}")
print(f"exposure {exposure:>4.0%} ┬╖ noticed after {det:>2} min ┬╖ " + " ┬╖ ".join(row))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
rollout рд╣реЗ print рдХрд░рддреЗ:
big bang, rollback = redeploy (15 min) 300 bad/min ┬╖ noticed after 5 min тЖТ 6,000 failed requests
big bang, flag off (1 min) 300 bad/min ┬╖ noticed after 5 min тЖТ 1,800 failed requests
canary at 1%, rollback = redeploy 3 bad/min ┬╖ noticed after 10 min тЖТ 75 failed requests
canary at 1%, flag off 3 bad/min ┬╖ noticed after 10 min тЖТ 33 failed requests
stages 1% тЖТ 5% тЖТ 25% тЖТ 100%, 30 min each: a full rollout takes 2 hours instead of 1 minute тАФ that is the price
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
exposure 100% ┬╖ noticed after 5 min ┬╖ rollback 15 min тЖТ 6,000 ┬╖ rollback 5 min тЖТ 3,000 ┬╖ rollback 1 min тЖТ 1,800
exposure 25% ┬╖ noticed after 5 min ┬╖ rollback 15 min тЖТ 1,500 ┬╖ rollback 5 min тЖТ 750 ┬╖ rollback 1 min тЖТ 450
exposure 5% ┬╖ noticed after 5 min ┬╖ rollback 15 min тЖТ 300 ┬╖ rollback 5 min тЖТ 150 ┬╖ rollback 1 min тЖТ 90
exposure 1% ┬╖ noticed after 10 min ┬╖ rollback 15 min тЖТ 75 ┬╖ rollback 5 min тЖТ 45 ┬╖ rollback 1 min тЖТ 33
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
100% рд╡рд░реВрди 1% exposure рд╡рд░ рдЧреЗрд▓реНрдпрд╛рдиреЗ рдиреБрдХрд╕рд╛рди 80 ├Ч рдХрдореА рдЭрд╛рд▓реЗ (6,000 тЖТ 75), detection рд▓рд╛ рджреБрдкреНрдкрдЯ рд╡реЗрд│ рд▓рд╛рдЧрд▓рд╛ рддрд░реАрд╣реА. рд╡реЗрдЧрд╡рд╛рди rollback рдиреЗ рддреЗ 3.3 ├Ч рдкрд░реНрдпрдВрдд рдХрдореА рдХреЗрд▓реЗ (6,000 тЖТ 1,800). рджреЛрдиреНрд╣реА рдорд┐рд│реВрди: 6,000 тЖТ 33, рдореНрд╣рдгрдЬреЗ рд╕реБрдорд╛рд░реЗ 180 ├Ч рдХрдореА failed requests. Exposure рд╣рд╛ рд╕рд░реНрд╡рд╛рдд рдореЛрдард╛ lever рдЖрд╣реЗ; rollback рдЪрд╛ рд╡реЗрдЧ рддреНрдпрд╛рдирдВрддрд░рдЪрд╛. рдХрд┐рдВрдордд рдореНрд╣рдгрдЬреЗ рд╡реЗрд│: 30 рдорд┐рдирд┐рдЯрд╛рдВрдЪреЗ рдЪрд╛рд░ рдЯрдкреНрдкреЗ рдореНрд╣рдгрдЬреЗ рдкреВрд░реНрдг rollout рд▓рд╛ 2 рддрд╛рд╕ тАФ рдореНрд╣рдгреВрдирдЪ teams рд╣реЗ рдЯрдкреНрдкреЗ automate рдХрд░рддрд╛рдд, рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛ рдерд╛рдВрдмрдгреНрдпрд╛рдд рдХреЛрдгрд╛рдЪреЗрд╣реА рд▓рдХреНрд╖ рдЦрд░реНрдЪ рд╣реЛрдд рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдХрдзреАрдЪ рд╡рд╛рдкрд░реВрди рди рдкрд╛рд╣рд┐рд▓реЗрд▓рд╛ rollback рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛
- рдЬреБрдиреА version рдЪрд╛рд▓реВрдЪ рд╢рдХрдгрд╛рд░ рдирд╛рд╣реА рдЕрд╕реЗ database рдмрджрд▓ тАФ рдордЧ rollback рдЪреЗ рдмрдЯрдг рдЦреЛрдЯреЗ рдард░рддреЗ
- рдХрдзреАрдЪ рдХрд╛рдвреВрди рди рдЯрд╛рдХрд▓реЗрд▓реЗ flags, рдЬреЛрдкрд░реНрдпрдВрдд
new_engine_v2_finalрдХрд╛рдп рдХрд░рддреЛ рд╣реЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдорд╛рд╣реАрдд рдирд╕рддреЗ - рдордзреНрдпреЗ рдХреЛрдгрддрд╛рд╣реА check рди рдХрд░рддрд╛ timer рд╡рд░ рдкреБрдврдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдЬрд╛рдгреЗ
- feature рдмрдВрдж рдХрд░рдгрд╛рд░рд╛ рдкрдг рддреНрдпрд╛рдиреЗ рд╕реБрд░реВ рдХреЗрд▓реЗрд▓реЗ рдирд╡реЗ background job рдмрдВрдж рди рдХрд░рдгрд╛рд░рд╛ flag
- 1% рдЯрдкреНрдкреНрдпрд╛рд▓рд╛ рдлрдХреНрдд рдПрдХрд╛рдЪ рдкреНрд░рдХрд╛рд░рдЪреЗ users рдорд┐рд│рдгреЗ (рд╕рдЧрд│реЗ рдЕрдВрддрд░реНрдЧрдд, рд╕рдЧрд│реЗ рдПрдХрд╛рдЪ region рдордзрд▓реЗ)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Argo Rollouts тАФ canary steps рдЕрд╕рд▓реЗрд▓рд╛ Rollout, рдЖрдгрд┐ рдкрд╛рд░реНрд╢реНрд╡рднреВрдореАрдд рдзрдбрд╛ 05 рдордзреАрд▓ analysis
рдЪрд╛рд▓реВ. рдЦрд▒реНрдпрд╛ account рд╡рд░:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata: {name: timetable}
spec:
strategy:
canary:
analysis:
templates: [{templateName: error-rate}]
startingStep: 1
args: [{name: service-name, value: timetable}]
steps:
- setWeight: 1
- pause: {duration: 30m}
- setWeight: 5
- pause: {duration: 30m}
- setWeight: 25
- pause: {duration: 30m}
Traffic router рдирд╕реЗрд▓ рддрд░ Argo Rollouts pods рдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ weight рдЕрдВрджрд╛рдЬреЗ рд╕рд╛рдзрддреЗ; router рдЕрд╕реЗрд▓ (Istio, NGINX, AWS ALB рдЖрдгрд┐ рдЗрддрд░) рддрд░ рддреЗ рдиреЗрдордХреА рдЯрдХреНрдХреЗрд╡рд╛рд░реА рдард░рд╡реВ рд╢рдХрддреЗ. Rollout рдерд╛рдВрдмрд╡рд╛ рдЖрдгрд┐ рд▓рдЧреЗрдЪ рдкрд░рдд рдЬрд╛:
kubectl argo rollouts abort timetable # traffic back to the stable version
kubectl rollout undo deployment/timetable # plain Deployment: back to the previous ReplicaSet
OpenFeature Python SDK рд╡рд╛рдкрд░реВрди code рдордзреАрд▓ feature flag (provider тАФ LaunchDarkly, Unleash, flagd рдЖрдгрд┐ рдЗрддрд░ тАФ start-up рд▓рд╛ рдПрдХрджрд╛рдЪ configure рдХреЗрд▓рд╛ рдЬрд╛рддреЛ):
from openfeature import api
client = api.get_client()
if client.get_boolean_value("new-timetable-engine", False): # default False if the flag service is down
plan = new_engine(week)
else:
plan = old_engine(week)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рддреБрдордЪреНрдпрд╛ рдЦрд▒реНрдпрд╛ rollback рдЪреА рд╡реЗрд│ рдореЛрдЬрд╛. рдЖрд░рд╛рдЦрдбрд╛ рдирд╡реНрд╣реЗ тАФ рдШрдбреНрдпрд╛рд│, рдПрдХрд╛ test рдордзреНрдпреЗ, "рдирд┐рд░реНрдгрдп" рдкрд╛рд╕реВрди "users рдЬреБрдиреНрдпрд╛ version рд╡рд░ рдкрд░рдд рдЖрд▓реЗ" рдкрд░реНрдпрдВрдд. рд╣рд╛ рдЖрдХрдбрд╛ 5 рдорд┐рдирд┐рдЯрд╛рдВрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕реЗрд▓, рддрд░ рдкреБрдвреЗ рджреБрд░реБрд╕реНрдд рдХрд░рд╛рдпрдЪреА рдЧреЛрд╖реНрдЯ рддреАрдЪ рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдЖрддрд╛ рдмрджрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗрдд. рдкрдг рдкреБрдврдЪреНрдпрд╛ рд╕рддреНрд░рд╛рдд рдЗрдорд╛рд░рддреА рдкреБрд░реЗрд╢рд╛ рдореЛрдареНрдпрд╛ рдЕрд╕рддреАрд▓ рдХрд╛? рдкреБрдврдЪрд╛ рдзрдбрд╛ capacity рд╕рдВрдкрдгреНрдпрд╛рдЖрдзреАрдЪ рддрд┐рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ рдХрд░рддреЛ.
git checkout lesson-07-capacity-planning