首页/开发/CI/CD 与发布速查/单实例先行(One-Box Canary)
发布策略60 条

单实例先行(One-Box Canary)

发布先从单个实例开始:在真实流量下观察错误率、日志与资源占用,再扩大到全部实例;有状态服务可用 StatefulSet partition 实现。

CI/CD 与发布速查开发更新于 2026-10-13

单实例先行是什么

发布先从单个实例开始:在真实流量下观察错误率、日志与资源占用,验证通过再按批次替换其余实例。对实例数少、流量难按比例切分的系统,这是成本最低的灰度形态;Kubernetes 里 Deployment 用 rollout pause/resume 控制推进节奏,有状态服务用 StatefulSet 的 partition 只更新末位实例。

基本信息

适用范围1 个实例或 1 个节点,少量实例的系统
典型场景实例数少、流量难切分、有状态服务
观测对象该实例错误率、延迟、日志、资源占用
K8s 实现Deployment:rollout pause/resume;StatefulSet:partition 控制
推进方式验证通过后按批次替换其余实例,每批重新对比

典型使用场景

  • 实例数少:总共三五个实例,百分比灰度没有统计意义,先动一个最直接
  • 有状态服务:StatefulSet 按序号逐个推进,配合数据兼容窗口
  • 高风险变更:连接池、序列化协议调整先用一个实例验证
  • 边缘与多机房:先在一个节点或机房验证,再逐站点铺开
  • 权重放量前置:作为百分比灰度之前的第一道低成本观察

K8s 单实例先行

K8s 单实例先行
kubectl rollout pause deployment/web   # 暂停滚动更新,先固定观察窗口
kubectl set image deployment/web web=registry/web:v1.9.0   # 触发一次镜像更新
kubectl rollout status deployment/web   # 观察新实例是否按预期就绪
kubectl logs deploy/web --tail=200   # 检查新版本日志中的异常关键词
kubectl rollout resume deployment/web   # 验证通过后恢复滚动
# StatefulSet:把 partition 设为副本数-1,只更新末位实例

推进阶段与检查

阶段动作通过标准
先行实例更新 1 个实例错误率与延迟无新异常
观察窗口真流量或定向流量日志无新增异常类型
批次扩大按批次替换其余实例每批之间重新对比基线
StatefulSet partition 的语义是只更新序号大于等于 partition 的实例:设为副本数减一即可只更新最后一个实例。
暂停后忘记 resume 会让后续实例长期停在旧版本;把恢复动作写进发布清单并核对 rollout 状态。

易错点

  • 单实例流量太低看不出问题:需要定向流量或内部用户参与验证,否则观察窗口意义有限
  • 暂停后忘记 resume:后续实例长期停留在旧版本,版本分布悄悄分叉
  • 有状态服务未评估数据兼容:新版本若改了数据格式,回退时数据无法回读
  • 把「一个实例正常」当全量放行依据:样本太小,仍要按批次推进并每批核对指标

数据来源与参考

  • Kubernetes 文档《StatefulSets》(partition)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌