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。
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 标签,手动暂停、回滚或加速灰度。
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。