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,避免面板统计出现版本混淆。
灰度批次生命周期与状态流转 灰度批次生命周期与状态流转 批次定义 等待间隔 批次执行 健康检查 检查通过 检查失败 推进到下一批次 批次内回滚 全量回滚 批次暂停可发生在任意节点之间 通过 CR 的 paused 字段控制

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),在“灰度批次时间线”面板中按时间轴展示每个批次的执行状态。批次间隔时间应作为辅助线叠加在时间线上,帮助判断发布是否因等待而延迟。
批次参数与面板留痕映射关系 批次参数与面板留痕映射关系 CRD 批次定义 batchIndex: 2 replicas: 5 percentage: 10.0 interval: 60s paused: false rollbackOnFailure: true Operator 处理 解析批次定义 计算实际实例 执行更新 等待间隔 健康检查 状态上报 Prometheus 指标 batch_index 2 batch_size 5 batch_interval 60 batch_status running batch_start 1710000000 batch_rollback 0 面板通过 label 过滤 batch_index 实现单批次追踪 使用 rate() 函数计算批次推进速度

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 字段用于全局暂停所有批次推进。