Deployment rollout with drain and rollback 的核心責任是把版本、流量、連線、設定與回退條件拆成可驗證批次。這篇以 checkout service 為例,示範平台切換如何從 preflight、canary、drain 到事故回退都保留一致證據。

本篇以 5.2 Kubernetes 部署策略5.3 load balancer 合約 為前置知識——rollout 批次、probe 對齊、drain contract 等概念在該兩篇定義,本篇直接操作化。lifecycle 狀態的完整定義見 5.6 Platform Lifecycle Contract

服務路徑與切換責任

這條路徑是 client -> load balancer -> checkout-api -> payment provider/order db/order event。部署期間新舊版本會同時承接流量,核心風險在流量生命週期是否可收斂,image 替換本身反而是最可預測的部分。

切換責任分三層:

  1. 版本可啟動:container/runtime/config 可用。
  2. 版本可接流量:readiness 與依賴狀態對齊。
  3. 版本可退場:drain 與在途請求可收束。

Preflight:先驗證可服務基線

Preflight 的責任是把「可啟動」與「可服務」拆開驗證。最小檢查包含:

  1. image 與 runtime config 版本對齊。
  2. secret 已注入且權限正確。
  3. startup/readiness probe 能反映真實依賴狀態。
  4. load balancer contract 參數與服務期望一致。
  5. service discovery 註冊與摘除路徑可用。

Preflight 失敗時不進 canary。先把失敗收斂在控制面,避免切流後才發現版本不可服務。

Preflight 自動化

手動 preflight 在低頻部署時可行,部署頻率上升後會成為瓶頸或被跳過。穩定做法是把 preflight 檢查嵌入 CI/CD pipeline 的 pre-deploy stage:

  1. image 與 config 版本對齊檢查:pipeline 比對即將部署的 image tag 與 ConfigMap / Secret 版本是否在相容矩陣內。版本矩陣可維護在 git(如 deploy/compat-matrix.yaml),CI 自動比對。
  2. infra drift detection:部署前用 IaC 工具(Terraform plan、Crossplane drift check)掃描目標環境的實際狀態是否跟宣告狀態一致。drift 存在時暫停部署——在已漂移的環境上部署新版本,會把漂移與版本變更的影響混在一起,事故時無法分辨根因。
  3. probe 語意驗證:在 staging 環境對新版本觸發 startup → readiness → liveness 全流程,確認 probe 回應與依賴就緒條件吻合。這步抓的是 probe 設定退化(如 readiness endpoint 被改成永遠回 200)。
  4. rollback 可行性驗證:確認舊版本 image 仍在 registry 且可拉取、舊版本 config 仍相容。rollback 能力在 preflight 階段驗證,比事故時才發現「舊版拉不到」代價低得多。

Preflight 自動化的產出是一份 go/no-go 報告,進入 6.8 Release Gate 作為放行依據。pipeline 中的 preflight stage 失敗應阻擋部署而非產生警告——可忽略的 preflight 等於沒有 preflight。

Canary Batch 與 Stop Condition

小流量先驗證新版本行為,再決定是否擴批——Canary 回答的是「這個版本值不值得擴大」。

批次階段判讀重點停損條件
1-5%per-version error rate、p95/p99 latency錯誤率高於基線、延遲持續惡化
10-25%payment dependency timeout、fallback 比例依賴 timeout 連續超門檻
50%drain 成功率、reconnect 波形、下游事件完整性drain 未完成或 reconnect storm
100% 前新舊版本差異是否收斂、rollback 可行性仍需依賴舊版本特殊路徑

canary 判讀要維持 per-version 視角。只看整體服務平均值會掩蓋新版本局部退化。

Traffic / Drain:把退場變成可驗證流程

Drain 的責任是讓舊版本在下線前完成在途請求,不讓 rollout 把短暫切換放大成用戶錯誤。

退場順序:

  1. 舊實例 readiness 先轉 not-ready 停接新流量。
  2. 保留 drain 窗口完成 in-flight request。
  3. 確認連線數下降到門檻後再終止進程。
  4. 驗證無異常 reconnect 尖峰再進下一批。

Drain 條件的完整 workload 分類回到 5.6 Platform Lifecycle Contract,本段以 checkout service 為例:短 API 的 draining 窗口可短,長輪詢與 webhook callback 要更保守。

Rollback Compatibility

舊版本回來時仍可運作,是 rollback 能成立的前提——回退如果變成第二次故障,就失去了回退的工程價值。

要先驗證四個相容面:

  1. config 相容:新設定不會讓舊版啟動失敗。
  2. schema 相容:資料結構仍可被舊版讀取。
  3. cache key 相容:舊版可讀新快取或有 fallback。
  4. event schema 相容:舊版 consumer 不會因新事件欄位崩潰。

若這四項未完成,所謂 rollback 只會停在「版本回切」,無法恢復服務正確性。

Evidence Package

每一批切換要可被判讀、可被追責、可被回放——部署 evidence 支撐這三個條件。

欄位內容
Sourcedeployment logs、LB metrics、service metrics、dependency logs
Time range每批 rollout/drain 觀察窗口
Query linkper-version error、latency、5xx、timeout、drain completion
Ownerplatform owner、checkout owner、SRE on-call
Data quality指標延遲、分區覆蓋、log 掉點
Confidenceconfirmed / suspected / needs follow-up
Known gap尚未覆蓋長連線場景、低流量區域樣本不足

這份 evidence 要對齊 4.20 Observability Evidence Package

Release Gate

Release gate 的責任是決定下一批切換與是否凍結 rollout,不是報告「目前看起來正常」。

Gate 欄位最小內容
Gate decision放行下一批、維持 canary、freeze rollout、rollback version
Checksper-version SLI、dependency timeout、drain completion
Stop conditionerror burn rate、reconnect storm、drain 逾時
Rollback window可回切時間、舊版可服務窗口、config 回退窗口
Ownerrelease owner、platform on-call

這組欄位要對齊 6.8 Release Gate

Incident Decision Log

freeze rollout、rollback version、隔離 region、延長 drain 都屬事故決策,需寫入 8.19 Incident Decision Log。涉及流量規則 / control plane 設定推送的決策、見 5.78.23 Control Plane Decision Log

 1incident_decision:
 2  timestamp: 2026-05-11T15:06:00Z
 3  decision: "freeze rollout at 25% and rollback one region"
 4  context: "new version timeout to payment provider increased in ap-northeast"
 5  evidence:
 6    - query: checkout_error_rate_by_version_region
 7    - query: payment_timeout_ratio_by_region
 8  owner: release-incident-commander
 9  expected_effect: "contain customer impact and restore baseline success rate"
10  rollback_condition: "timeout ratio does not recover after rollback batch completes"

Case Write-back 與邊界

這篇回寫對齊 5.C9 反例5.C1 Tradeshift5.C3 Orbitera:前者看切換失序,後兩者看遷移路徑與回退策略。preflight / canary / drain 各階段的生命週期定義回到 5.6 Platform Lifecycle Contract

這篇不處理 schema migration 本身、cache stampede 或 queue replay。若核心風險在資料正式狀態、快取回源或事件恢復,路由到 1.7 Schema Migration Rollout 證據2.9 Cache Migration 與 Stampede Rollback3.8 Queue Consumer Retry 與 Replay Handoff