Flux v2 核心组件架构深度解析

Flux v2 采用 多控制器、单一职责 的微架构设计,将 GitOps 工作流拆解为 源获取、资源构建、Helm 编排、事件通知 四个独立领域。每个控制器只关注自己的边界,通过自定义资源(CRD)进行状态协调,最终形成一条完整的声明式交付流水线。

架构设计原则: 每个控制器独立运行、独立扩展、独立故障域。源控制器只负责拉取和校验制品,不关心如何部署;Kustomize 控制器只负责渲染和 apply,不关心 Helm chart 的依赖解析。这种解耦使得 Flux 在资源配额校准场景下可以按需调整每个控制器的副本数和资源限制。

2.1 四控制器全景图

下图展示了 Flux v2 的组件拓扑关系以及每个控制器在流水线中的位置:

Flux v2 四控制器架构图 Flux v2 核心控制器架构 Git / OCI / S3 外部源仓库 source-controller 拉取 / 校验 / 缓存制品 kustomize-controller Kustomize 渲染 + apply helm-controller Helm release 编排 K8s 集群 notification-controller 事件分发 / webhook 📌 组件职责边界 • source-controller:只负责从 Git/OCI/S3 拉取制品,生成 Source 对象状态。 • kustomize-controller:读取 Kustomization CR,执行 kustomize build 并 apply 到集群。 • helm-controller:管理 HelmRelease CR,执行 helm install/upgrade/uninstall。 • notification-controller:监听所有控制器的状态变更,分发告警/事件到 Slack、Webhook 等。 • 每个控制器独立运行在各自的 Deployment 中,资源配额可独立校准。

2.2 各控制器职责与 CRD 映射

每个控制器对应一组核心 CRD,控制器通过调谐(Reconcile)这些 CR 的 spec 与 status 来驱动集群状态。下表列出每个控制器的核心 CRD 及其职责:

控制器 核心 CRD 职责描述 资源配额关注点
source-controller GitRepository, OCIRepository, Bucket 从远程源拉取制品,校验签名/哈希,缓存到本地存储,定期轮询更新 内存缓存大小、网络 I/O、轮询间隔
kustomize-controller Kustomization 读取 Kustomization CR,执行 kustomize build,将渲染后的 YAML apply 到集群 CPU 峰值(渲染大量资源时)、并发 apply 数
helm-controller HelmRelease, HelmChart, HelmRepository 解析 Helm chart 依赖,执行 helm install/upgrade/uninstall,管理 release 状态 内存(chart 解压)、helm 操作超时
notification-controller Alert, Provider, Receiver 监听其他控制器事件,按 Provider 配置分发通知,支持 webhook 接收 连接池、消息队列积压

2.3 source-controller:制品的守门人

source-controller 是整个流水线的 入口控制器。它负责从 Git 仓库、OCI 镜像仓库或 S3 兼容存储中拉取制品,并执行以下关键操作:

  • 制品拉取与校验:支持 SSH、HTTPS、令牌认证;可配置 GPG 签名验证或 OCI 签名验证。
  • 本地缓存:将拉取的制品(Git 归档、OCI artifact、bucket 文件)缓存到控制器 Pod 的本地存储中,供下游控制器读取。
  • 轮询与 webhook:支持基于间隔的轮询(默认 1 分钟)和 webhook 触发(通过 notification-controller 的 Receiver)。
  • 制品版本管理:每个 Source 对象维护一个 Artifact 字段,记录当前制品的 URL、digest、lastUpdateTime。
资源配额校准提示: source-controller 的内存消耗与缓存制品数量成正比。如果管理大量 GitRepository 或 OCIRepository,建议将 --storage-path 挂载到持久卷,并设置 --storage-advance-limit 限制缓存上限,避免 OOMKill。

2.4 kustomize-controller:声明式资源渲染引擎

kustomize-controller 是 Flux 中 最核心的部署控制器。它读取 Kustomization CR,执行以下流水线:

  1. 源绑定:通过 spec.sourceRef 引用 source-controller 产出的 GitRepository 或 OCIRepository 制品。
  2. Kustomize 构建:在控制器内存中执行 kustomize build,合并所有 overlay、patch、secretGenerator 等。
  3. 健康检查与 prune:apply 后等待资源达到 Ready 状态;通过 spec.prune 自动清理不再存在于 Kustomization 中的资源。
  4. 依赖排序:支持 dependsOn 字段,确保跨 Kustomization 的部署顺序。
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: app-prod
spec:
  sourceRef:
    kind: GitRepository
    name: app-repo
  path: ./deploy/overlays/prod
  prune: true
  interval: 5m
  retryInterval: 30s
  timeout: 3m
  postBuild:
    substitute:
      env: prod
      version: "1.2.3"

2.5 helm-controller:Helm Release 生命周期管理

helm-controller 将 Helm chart 的安装、升级、回滚、卸载完全声明化。它与 source-controller 配合,从 HelmRepository 或 OCIRepository 获取 chart 包:

  • Chart 依赖解析:自动下载子 chart,构建完整的 chart 依赖树。
  • Values 注入:支持从 ConfigMap、Secret 或内联 values 中注入参数。
  • Release 状态跟踪:通过 Helm SDK 实时跟踪 release 状态,更新 HelmRelease CR 的 status。
  • 自动回滚:当 upgrade 失败时,可配置自动回滚到上一个稳定版本。
注意: helm-controller 在解压大型 chart(如 100MB+)时会消耗大量内存。在资源配额校准场景中,建议为 helm-controller 设置 resources.limits.memory: 512Mi 起步,并根据 chart 大小动态调整。

2.6 notification-controller:事件中枢与告警分发

notification-controller 不直接参与资源部署,但它负责 串联整个系统的可观测性。它监听所有 Flux 控制器发出的事件,并根据 Alert CR 的配置将事件转发到外部系统:

Provider 类型 支持的目标 典型用途
Slack Slack Webhook URL 部署成功/失败通知
Webhook 自定义 HTTP 端点 集成 CI/CD 或工单系统
GitHub / GitLab Commit Status API 在 PR 上显示部署状态
Discord / PagerDuty 对应平台 webhook 告警升级

notification-controller 还提供 Receiver 功能,允许外部系统(如 GitHub webhook)触发 source-controller 的重新拉取,实现事件驱动的 GitOps。

2.7 组件间通信与数据流

Flux v2 的四个控制器之间 不直接通过 API 调用,而是通过 Kubernetes 自定义资源的状态传递信息:

Flux v2 组件间数据流 组件间数据流:CR 状态驱动 source-controller 本地制品缓存 kustomize-controller helm-controller notification-controller 读取 Artifact 共享存储 读取 Artifact 事件 事件

关键数据流路径:

  1. source → kustomize/helm:下游控制器通过 spec.sourceRef 引用 Source 对象,从 source-controller 的本地缓存或共享存储中读取制品内容。
  2. 所有控制器 → notification:每个控制器在调谐完成后,将事件(成功/失败/进度)写入 Kubernetes Event,notification-controller 监听这些 Event 并转发。
  3. Receiver → source:外部 webhook 通过 notification-controller 的 Receiver 触发 source-controller 重新拉取。
资源配额校准关键结论: 四个控制器各自独立运行,资源消耗互不影响。在配额校准场景中,可以针对每个控制器单独设置 resources.requests 和 resources.limits,而不会影响其他控制器的稳定性。source-controller 是内存敏感型,kustomize-controller 是 CPU 敏感型,helm-controller 是内存+超时敏感型,notification-controller 是连接数敏感型。