Skip to content
返回部署

金丝雀发布与渐进式推出

指标驱动的流量爬升(1% → 10% → 50% → 100%),错误预算突破时自动回滚。

监控高级

为什么

金丝雀限制爆炸半径:坏部署影响 1% 用户而非 100%。带自动指标门(错误率、p99 延迟、业务 KPI)的渐进推出,捕获通过预发布但在生产规模失败的问题,在客户察觉前回滚。

CNCF 2024 调查显示 Prometheus 和 Grafana 被 70% 以上的云原生组织使用。OpenTelemetry 在 2024 年成为检测标准,减少指标和链路的供应商锁定。

何时使用

高风险变更(支付流、鉴权、schema 迁移)、高流量服务(>10k RPS)和持续部署用金丝雀。低流量内部工具跳过,蓝绿足够且 1% 信号太噪。

如何做

1. 定义指标 — 错误率(5xx/total)、延迟 p99、业务 KPI(转化、结账成功) 2. 设阈值 — 错误率 < 0.1%、p99 < 500ms、KPI 在基线 2% 内;突破 = 回滚 3. 选工具 — Argo Rollouts(K8s)、Flagger、AWS CodeDeploy、Spinnaker;或 LB 权重操作 4. 部署金丝雀 — 1% 流量到新版本,99% 到稳定;跑 5-10 分钟分析窗口 5. 指标门 — 比较金丝雀 vs 稳定;阈值内则爬到 10%;否则回滚到 0% 6. 渐进爬升 — 1% → 10% → 25% → 50% → 100%,每步指标门(各 5-10 分钟) 7. 自动回滚 — 任一步突破阈值,100% 切回稳定,告警 on-call 8. 部署后 — 保留稳定版本 1h(回滚窗口),然后退役

示例

# rollout.yaml — Argo Rollouts 金丝雀含指标分析 apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: myapp spec: replicas: 10 strategy: canary: trafficRouting: istio: host: myapp.example.com steps: - setWeight: 5 - analysis: templates: - templateName: success-rate args: - name: service-name value: myapp - setWeight: 25 - analysis: templates: - templateName: success-rate args: - name: service-name value: myapp - setWeight: 50 - setWeight: 100 template: spec: containers: - name: myapp image: myapp:v2.0 ports: [{ containerPort: 3000 }] --- # analysis-template.yaml — Prometheus 成功率门 apiVersion: argoproj.io/v1alpha1 kind: AnalysisTemplate metadata: name: success-rate spec: args: - name: service-name metrics: - name: success-rate interval: 1m successCondition: result >= 0.99 failureLimit: 3 provider: prometheus: address: http://prometheus:9090 query: | sum(rate(http_requests_total{service="{{args.service-name}}",code!~"5.."}[2m])) / sum(rate(http_requests_total{service="{{args.service-name}}"}[2m]))

常见问题

  • ⚠1% 流量太噪 — 100 RPS 时 1% = 1 req/s,错误率剧烈波动,用更长分析窗口
  • ⚠指标门太松 — p99 < 1s 通过但 p99.9 是 10s,0.1% 用户延迟极差
  • ⚠业务 KPI 未测 — 错误率正常但转化降 20%,金丝雀“通过”且上线 bug
  • ⚠无基线比较 — 金丝雀指标对比绝对阈值,而非 vs 稳定版本

最佳实践

  • ✓对比金丝雀 vs 稳定(相对),非绝对阈值 — 抓“两者都差但金丝雀更差”
  • ✓含业务 KPI 指标 — 错误率 + 延迟 + 转化,非仅基础设施指标
  • ✓failureLimit 设 2-3 — 一个坏样本不应回滚,但趋势应回滚
  • ✓金丝雀前镜像流量 — 影子真实请求到金丝雀,无用户影响下比较响应

常见问题解答

金丝雀应从多少百分比开始?

从 1-5% 开始 15-30 分钟,指标干净则升至 10%、25%、50%、100%。从 50% 开始失去意义——影响一半用户才发现问题。用自动渐进交付(Flagger、Argo Rollouts)。

金丝雀期间应监控哪些指标?

错误率(5xx)、延迟 p99、业务指标(转化、注册)。部署前设阈值——如错误率超 0.5% 或 p99 延迟增超 20% 则回滚。别看 CPU/内存;不指示用户影响。

金丝雀和 A/B 测试有什么不同?

金丝雀测错误/性能(新版本会坏吗?),A/B 测业务结果(转化更好吗?)。金丝雀是安全机制;A/B 是实验。可在 A/B 测试内跑金丝雀。

如何只让部分用户到金丝雀?

用加权负载均衡(Istio、ALB 加权目标组)或带百分比推出的功能开关。粘性会话确保用户留在同版本——否则会看到闪烁行为。

金丝雀应跑多久再全量?

足以看到有意义流量——至少 10,000 请求或 30 分钟,取较长者。太短漏罕见错误;太长延迟发布。自动化推进以免守着。