Flux 项目概览与架构演进:Flux v1 vs Flux v2

Flux 是 Weaveworks 开源的 GitOps 工具集,也是最早将“Git 作为单一事实来源”理念落地的 CNCF 毕业项目。从 Flux v1 到 Flux v2 的演进,不仅是组件重构,更是对多集群、多租户、多工具链场景的深度适配。本节从项目概览、版本对比、组件家族和架构图四个维度,帮助你建立对 Flux 的全局认知。

1. Flux v1 vs Flux v2:核心差异

Flux v1 采用“一体化”架构,所有逻辑集中在单个二进制中;Flux v2 则拆分为多个独立控制器,每个控制器遵循 Kubernetes Operator 模式,职责单一、可独立升级和替换。下表从关键维度对比两个版本:

对比维度 Flux v1 Flux v2
架构模式 单体二进制,SSH 轮询 Git 多控制器,基于 Kubernetes CRD + Controller 模式
Git 同步方式 SSH 密钥轮询,默认 5 分钟间隔 基于 Source Controller 的 webhook 或定时间隔拉取
多租户支持 弱,依赖命名空间隔离 强,通过 Kustomize 和 RBAC 实现租户级控制
Helm 集成 通过 fluxctl 手动发布 原生 Helm Controller,支持 HelmRelease CRD
多集群管理 需额外工具(如 Weave Cloud) 原生支持,通过 Kustomize 覆盖和 Cluster API 集成
可观测性 基础日志和指标 内置 Notification Controller,支持 Slack、Webhook、PagerDuty 等
升级路径 大版本升级需迁移 控制器独立升级,向后兼容 CRD
选型建议: 新项目直接选择 Flux v2;存量 Flux v1 用户建议逐步迁移,Flux 官方提供了从 v1 到 v2 的迁移工具和文档。

2. Flux v2 组件家族

Flux v2 由四个核心控制器组成,每个控制器负责 GitOps 流水线中的一个独立阶段。下图展示了组件之间的协作关系:

Flux v2 组件架构与协作流程 Source Controller Git / OCI / Bucket Kustomize Controller Kustomization CRD Helm Controller HelmRelease CRD Notification Controller 事件 & 告警 拉取 Artifact 拉取 Chart 发布结果 组件职责说明 • Source Controller:管理 Git 仓库、OCI 制品、Bucket 等来源,产出 Artifact 供下游消费。 • Kustomize Controller:基于 Kustomization CRD 对 Artifact 进行 overlay 和 apply,实现声明式发布。 • Helm Controller:基于 HelmRelease CRD 管理 Helm Chart 的安装、升级、回滚。 • Notification Controller:监听发布事件,通过 Provider CRD 发送通知到 Slack、Webhook、PagerDuty 等。

3. 核心控制器详解

3.1 Source Controller

Source Controller 是 Flux 的“入口”,负责从外部来源拉取配置并生成不可变的 Artifact。支持的来源类型包括:

  • GitRepository:支持 SSH、HTTPS、自定义 CA 证书,可配置分支、标签、提交 SHA。
  • OCIRepository:从 OCI 兼容的容器镜像仓库拉取配置层。
  • Bucket:从 S3、GCS、MinIO 等对象存储拉取静态文件。

Source Controller 将拉取的内容打包为 Artifact,存储在控制器本地缓存中,并通过 Status.Artifact 字段暴露下载 URL。下游控制器(Kustomize/Helm)通过引用 Source 的 apiVersion 和 kind 来消费这些 Artifact。

3.2 Kustomize Controller

Kustomize Controller 是 Flux 的“编排引擎”,负责将 Source Controller 产出的 Artifact 进行 Kustomize 渲染并应用到集群。核心 CRD 是 Kustomization,支持以下关键字段:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: app-config
spec:
  sourceRef:
    kind: GitRepository
    name: app-repo
  path: ./overlays/production
  prune: true
  interval: 5m
  retryInterval: 2m
  timeout: 3m
  postBuild:
    substitute:
      env: production
    substituteFrom:
      - kind: ConfigMap
        name: cluster-vars

Kustomize Controller 会持续对比集群实际状态与 Artifact 中定义的期望状态,自动执行 kubectl apply 或 kubectl delete 操作。

3.3 Helm Controller

Helm Controller 为 Flux 提供了原生的 Helm 发布能力,核心 CRD 是 HelmRelease。它支持:

  • Chart 来源:可引用 HelmRepository(标准 Chart 仓库)、OCIRepository(OCI 制品)或 GitRepository(本地 Chart 目录)。
  • Values 管理:支持内联 values、ConfigMap/Secret 引用、多值合并。
  • 发布策略:支持升级、回滚、测试、卸载等生命周期操作。
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: nginx-ingress
spec:
  chart:
    spec:
      chart: nginx-ingress
      sourceRef:
        kind: HelmRepository
        name: ingress-nginx
  interval: 1h
  values:
    controller:
      replicaCount: 3

3.4 Notification Controller

Notification Controller 负责将 Flux 的发布事件、告警和状态变更推送到外部系统。它通过 Provider CRD 定义通知目标,通过 Alert CRD 定义触发条件:

apiVersion: notification.toolkit.fluxcd.io/v1
kind: Provider
metadata:
  name: slack-alerts
spec:
  type: slack
  address: https://hooks.slack.com/services/xxx
---
apiVersion: notification.toolkit.fluxcd.io/v1
kind: Alert
metadata:
  name: deploy-failure
spec:
  providerRef:
    name: slack-alerts
  eventSeverity: error
  eventSources:
    - kind: Kustomization
      name: '*'

4. Flux v2 架构总览

下图展示了 Flux v2 在 Kubernetes 集群中的完整架构,包括 CRD 层级、控制器交互以及外部系统集成:

Flux v2 完整架构图 外部来源层 Git 仓库 OCI 镜像仓库 S3 / GCS Bucket Helm 仓库 Source Controller GitRepository / OCIRepository / Bucket CRD Kustomize Controller Kustomization CRD Helm Controller HelmRelease CRD Kubernetes 集群 Deployment / Service / ConfigMap / Secret / Namespace Notification Controller Provider / Alert CRD → Slack / Webhook / PagerDuty
架构要点总结:
  • Source Controller 是唯一与外部系统交互的组件,其他控制器只消费 Source 产出的 Artifact。
  • Kustomize Controller 和 Helm Controller 是“二选一或组合使用”的关系,可同时管理 Kustomize 覆盖和 Helm Chart。
  • Notification Controller 通过事件驱动方式工作,不参与发布主流程,只负责状态通知。
  • 所有控制器都通过 Kubernetes CRD 暴露配置,无需额外 CLI 或 API 服务。

5. 版本演进与迁移路径

Flux v1 已于 2022 年进入维护模式,Flux v2 成为主要演进方向。从 v1 迁移到 v2 的核心步骤包括:

  1. CRD 迁移:将 v1 的 FluxHelmRelease 等自定义资源转换为 v2 的 HelmRelease 和 Kustomization。
  2. 同步方式变更:从 SSH 轮询改为 Source Controller 的 webhook 或定时间隔拉取。
  3. 多租户重构:利用 v2 的命名空间隔离和 RBAC 实现更细粒度的权限控制。
  4. 通知系统升级:从 fluxctl 手动通知改为 Notification Controller 自动推送。
迁移注意事项: Flux v2 不再支持 fluxctl 命令行工具,所有操作通过 kubectl 和 CRD 完成。建议先在测试集群验证迁移流程,再推广到生产环境。