4. Fleet 中的灰度发布模型:Bundle 与 Target 模型、灰度策略的声明式定义、灰度比例与阶段控制

Fleet 的灰度发布能力建立在 Bundle(资源束) 与 Target(目标集群) 的核心模型之上。通过声明式策略,运维人员可以精确控制哪些集群先升级、哪些集群后升级,以及每个阶段承载的流量比例。本章深入剖析该模型的内部结构、策略定义方式以及阶段控制机制。

4.1 Bundle 与 Target 模型:灰度发布的基础单元

在 Fleet 中,Bundle 是描述一组 Kubernetes 资源(Deployment、Service、ConfigMap 等)的抽象单元,而 Target 则代表一个或多个下游集群。灰度发布本质上是在 Bundle 与 Target 之间建立“部分匹配”的关系。

概念 角色 灰度中的行为
Bundle 资源模板 + 部署策略 定义新版本资源内容,通过 targetRestrictions 限制可匹配的集群范围
Target 集群选择器 + 标签 通过 clusterSelector 或 clusterGroupSelector 被 Bundle 部分匹配
BundleDeployment Bundle 在单个 Target 上的实例 每个匹配的 Target 生成一个 BundleDeployment,灰度阶段控制其创建/更新时机
关键理解: 灰度不是修改 Bundle 本身,而是通过 targetRestrictions 和 staged 模式,让 Bundle 只对部分 Target 生效,其余 Target 继续使用旧版本 Bundle。
Bundle 与 Target 灰度匹配模型 Bundle 与 Target 灰度匹配模型 Bundle v2 (新版本) targetRestrictions: env=prod Bundle v1 (旧版本) 默认匹配所有 Target Target 集群池 Target: prod-canary env=prod, canary=true Target: prod-stable env=prod, canary=false Target: staging env=staging Target: dev env=dev 匹配 默认匹配 说明:Bundle v2 通过 targetRestrictions 只匹配 prod-canary 集群;其余集群继续由 Bundle v1 管理,形成灰度隔离。

4.2 灰度策略的声明式定义

Fleet 使用 Bundle 资源中的 targetRestrictions 字段 来声明灰度策略。该字段是一个表达式列表,只有满足所有表达式的 Target 才会被该 Bundle 匹配。结合 staged 部署模式,可以实现分阶段灰度。

4.2.1 核心策略字段

字段 类型 说明 灰度用途
targetRestrictions []TargetRestriction 限制 Bundle 可匹配的 Target 条件 定义灰度范围(如:只匹配带 canary=true 标签的集群)
deployment.staged bool 启用分阶段部署模式 控制 BundleDeployment 的创建顺序,而非同时下发
deployment.stagedOptions StagedOptions 分阶段参数(比例、间隔、暂停条件) 定义每个阶段的目标集群比例和等待时间

4.2.2 灰度策略 YAML 示例

apiVersion: fleet.cattle.io/v1alpha1
kind: Bundle
metadata:
  name: my-app-canary
spec:
  # 定义灰度范围:只匹配 env=prod 且 canary=true 的 Target
  targetRestrictions:
    - clusterSelector:
        matchLabels:
          env: prod
          canary: "true"
  # 启用分阶段部署
  deployment:
    staged: true
    stagedOptions:
      # 第一阶段:10% 的匹配 Target
      - percentage: 10
        pauseAfter: 5m
      # 第二阶段:50% 的匹配 Target
      - percentage: 50
        pauseAfter: 10m
      # 第三阶段:100% 的匹配 Target
      - percentage: 100
        pauseAfter: 0
  # 资源内容
  resources:
    - name: deployment.yaml
      content: |
        apiVersion: apps/v1
        kind: Deployment
        ...
实践建议: targetRestrictions 使用 clusterSelector 时,确保 Target 资源已正确设置标签。灰度发布期间,旧版本 Bundle 不应设置 targetRestrictions,以保证它能覆盖未被新 Bundle 选中的集群。

4.3 灰度比例与阶段控制

灰度比例通过 分阶段选项(stagedOptions) 中的 percentage 字段控制。Fleet 将匹配的 Target 列表按比例切分,每个阶段只处理对应比例的 Target。阶段控制的核心机制如下:

  • 比例计算: Fleet 对匹配的 Target 进行排序(按名称),然后按 percentage 取前 N% 的 Target 进入当前阶段。
  • 阶段推进: 每个阶段完成后,Fleet 会等待 pauseAfter 指定的时间(如 5m),然后自动进入下一阶段。
  • 手动干预: 运维人员可以通过修改 Bundle 的 stagedOptions 或直接调整 Target 标签,手动暂停、回滚或加速灰度。
灰度阶段控制流程 灰度阶段控制流程 阶段 1:10% Target: prod-canary-1 等待 5 分钟 阶段 2:50% Target: prod-canary-1~5 等待 10 分钟 阶段 3:100% 所有匹配 Target 灰度完成 阶段控制关键行为 1. Fleet 对匹配 Target 排序后按比例切分,每个阶段只处理对应比例的 Target。 2. 阶段间自动等待 pauseAfter 时长,支持运维人员观察指标。 3. 若某阶段出现异常,可修改 stagedOptions 回退比例或暂停灰度。 4. 比例是累积的:阶段 2 包含阶段 1 的 Target + 新增 40% 的 Target。

4.4 灰度比例与阶段控制的实战要点

避坑指南:
  • 比例不是流量比例: Fleet 的 percentage 控制的是 集群数量比例,而非集群内的流量比例。若需流量灰度,需结合 Service Mesh 或 Ingress 权重。
  • 排序稳定性: Fleet 按 Target 名称排序,新增 Target 会改变排序结果,可能导致阶段比例偏移。建议在灰度期间不增删 Target。
  • 暂停超时: pauseAfter 是阶段间的最小等待时间,若阶段内 BundleDeployment 未就绪,Fleet 会等待其就绪后再进入下一阶段。

4.4.1 灰度比例与阶段参数速查表

参数 示例值 效果
percentage: 10 匹配 10 个 Target 时,取前 1 个 极低风险验证,适合首次灰度
pauseAfter: 5m 阶段完成后等待 5 分钟 给监控系统留出告警时间
percentage: 50 匹配 10 个 Target 时,取前 5 个 中等规模验证,观察集群间差异
pauseAfter: 0 不等待,立即进入下一阶段 快速全量发布,跳过人工等待

4.5 灰度发布模型总结

Fleet 的灰度发布模型通过 Bundle + Target 的声明式匹配 和 分阶段比例控制,实现了集群维度的灰度能力。核心优势在于:

  • 声明式: 灰度策略作为 Bundle 的一部分,存储在 Git 中,支持 GitOps 工作流。
  • 可观测: 每个阶段的 BundleDeployment 状态可查询,灰度进度透明。
  • 可干预: 运维人员可在任意阶段暂停、回滚或调整比例,无需重建 Bundle。