4. 灰度批次概念:批次定义、批次大小、批次间隔、批次暂停与回滚机制
灰度发布的核心在于将一次大规模的版本变更拆解为多个可控的“小批量”逐步推进。在 K8s Operator 的发布流水线中,灰度批次(Batch) 是定义“一次推进多少、推进多快、何时暂停、如何回退”的基础单元。理解批次的四个核心属性,是构建可靠灰度面板与自动化流水线的第一步。
4.1 批次定义(Batch Definition)
批次是灰度发布的最小执行单元,它描述了一次操作所影响的实例集合。在 Operator 的 CRD(Custom Resource Definition)中,批次通常通过一个列表或数组来定义,每个元素包含该批次的目标实例数量或百分比。
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
batchIndex |
int | 批次序号,从 0 开始递增 | 0, 1, 2 |
replicas |
int | 该批次要更新的实例数量 | 3 |
percentage |
float | 该批次占总实例的百分比(可选) | 10.0 |
strategy |
string | 该批次使用的更新策略(如 Recreate / RollingUpdate) | RollingUpdate |
💡 设计要点: 批次定义应支持“按数量”和“按百分比”两种模式。当实例总数动态变化时,百分比模式更具弹性。Operator 在 reconcile 循环中应实时计算当前批次的实际实例数。
4.2 批次大小(Batch Size)
批次大小决定了每次灰度推进的“步长”。步长过大会增加风险,步长过小则延长发布周期。在面板留痕中,批次大小直接影响“灰度进度”和“风险暴露曲线”两个关键指标。
- 固定大小模式: 每个批次更新固定数量的实例,例如每次更新 2 个 Pod。
- 百分比模式: 每个批次更新总实例的固定百分比,例如每次更新 10%。
- 动态大小模式: 根据当前集群负载、错误率等指标自动调整批次大小(高级特性)。
📐 推荐实践: 对于生产环境,建议首批次大小不超过总实例的 10% 或 3 个实例(取较小值)。后续批次可逐步增大,例如 10% → 20% → 30% → 40%。这种“慢启动”策略能有效控制爆炸半径。
4.3 批次间隔(Batch Interval)
批次间隔是指两个连续批次之间的等待时间。这个时间窗口用于观察新版本实例的运行状态,收集指标数据,并让监控系统有足够的时间触发告警。
| 间隔类型 | 默认值 | 适用场景 |
|---|---|---|
| 固定间隔 | 60s | 快速验证,低风险变更 |
| 自适应间隔 | 动态计算 | 需要等待指标稳定后再推进 |
| 手动确认间隔 | 无限等待 | 高风险变更,需要人工审批 |
在面板留痕中,批次间隔的结束时刻应记录为 batch_completed_timestamp,并与下一个批次的 batch_started_timestamp 形成对比,用于计算“等待耗时”指标。
4.4 批次暂停与回滚机制
暂停与回滚是灰度发布的安。Operator 必须提供明确的暂停条件和回滚触发逻辑,并在面板中清晰展示当前状态。
4.4.1 暂停机制
- 自动暂停: 当监控指标(如错误率 > 5%、P99 延迟 > 500ms)超过阈值时,Operator 自动暂停当前批次,不再推进到下一批次。
- 手动暂停: 运维人员通过更新 CR 的
spec.paused: true字段,或通过面板上的“暂停”按钮触发。 - 定时暂停: 在指定时间窗口内自动暂停(如夜间发布暂停)。
4.4.2 回滚机制
回滚分为“批次内回滚”和“全量回滚”两种粒度:
| 回滚类型 | 触发条件 | 影响范围 | 面板留痕字段 |
|---|---|---|---|
| 批次内回滚 | 当前批次实例启动失败或健康检查不通过 | 仅回滚当前批次已更新的实例 | batch_rollback_count |
| 全量回滚 | 连续多个批次失败,或人工决策 | 回滚所有已更新的实例到上一个稳定版本 | full_rollback_triggered |
⚠️ 关键约束: 回滚操作本身也应作为一次“发布事件”记录到面板中。回滚后的实例状态应标记为
rollback_version,而非 target_version,避免面板统计出现版本混淆。
4.5 批次状态与面板留痕字段
为了在 Grafana 面板中完整追溯灰度过程,每个批次都需要记录以下关键字段。这些字段由 Operator 在 reconcile 过程中写入 Prometheus 指标或日志中。
| 字段名 | 类型 | 说明 | 示例值 |
|---|---|---|---|
batch_index |
gauge | 当前批次序号 | 2 |
batch_size |
gauge | 该批次目标实例数 | 5 |
batch_interval_seconds |
gauge | 该批次配置的间隔时间 | 60 |
batch_status |
enum | pending / running / completed / paused / rolled_back | running |
batch_start_timestamp |
gauge | 批次开始执行的时间戳(Unix) | 1710000000 |
batch_complete_timestamp |
gauge | 批次完成的时间戳 | 1710000060 |
batch_rollback_count |
counter | 该批次触发的回滚次数 | 1 |
📊 面板留痕建议: 使用
batch_status 作为颜色编码维度(绿色=completed,黄色=running,红色=rolled_back,灰色=pending),在“灰度批次时间线”面板中按时间轴展示每个批次的执行状态。批次间隔时间应作为辅助线叠加在时间线上,帮助判断发布是否因等待而延迟。
4.6 批次配置示例(CRD YAML)
以下是一个完整的灰度批次配置示例,展示了如何在 Operator 的 CRD 中定义多批次灰度策略:
apiVersion: operator.example.io/v1
kind: Release
metadata:
name: my-app-release-v2
spec:
targetVersion: "v2.0.0"
currentVersion: "v1.0.0"
replicas: 20
batches:
- batchIndex: 0
replicas: 2
interval: 120s
pauseAfter: false
rollbackOnFailure: true
- batchIndex: 1
replicas: 4
interval: 90s
pauseAfter: false
rollbackOnFailure: true
- batchIndex: 2
replicas: 6
interval: 60s
pauseAfter: true
rollbackOnFailure: true
- batchIndex: 3
replicas: 8
interval: 30s
pauseAfter: false
rollbackOnFailure: false
globalPause: false
autoRollback: true
rollbackVersion: "v1.0.0"
🔍 关键解读: 上述配置中,批次 2 设置了
pauseAfter: true,表示该批次执行完成后自动暂停,等待人工确认。批次 3 的 rollbackOnFailure: false 表示即使该批次失败也不自动回滚(适用于最后一批全量发布场景)。globalPause 字段用于全局暂停所有批次推进。