2. Flux CD 简介:项目背景、架构组件与版本演进

2.1 项目背景:从 CI 到 CD 的 GitOps 桥梁

Flux CD 由 Weaveworks 于 2016 年开源,是首批将 GitOps 理念落地的 Kubernetes 持续交付工具。在传统 CI/CD 流水线中,部署阶段往往依赖 Jenkins、GitLab CI 等工具通过 kubectl 或 Helm 直接操作集群,这种方式存在三个核心痛点:

  • 配置漂移:手动 kubectl apply 或 CI 脚本执行后,集群状态与 Git 仓库容易失步。
  • 权限扩散:CI 系统需要持有集群凭证,一旦被攻破,攻击者可获得集群控制权。
  • 回滚复杂:需要重新触发 CI 流水线,无法通过 Git revert 快速恢复。

Flux CD 的核心理念是“声明式同步”:集群中运行一个 Operator,持续监听 Git 仓库中的期望状态,自动将集群实际状态拉齐到期望状态。开发者只需修改 Git 仓库中的 YAML 文件,Flux 会自动完成剩余工作。

GitOps 核心原则(Flux 实现):
1. 整个系统状态用声明式配置描述(Kubernetes YAML / Helm Chart)。
2. 配置存储在 Git 仓库中,作为唯一事实来源(Single Source of Truth)。
3. 自动同步 Agent(Flux)确保集群状态与 Git 仓库一致。
4. 所有变更通过 Pull Request 审查,拒绝直接修改集群。

2.2 架构组件:四控制器协作模型

Flux CD v2 采用多控制器架构,每个控制器负责一个独立领域,通过 Kubernetes CRD 和自定义资源进行协作。整体架构如下图所示:

Flux CD v2 四控制器架构图 Flux CD v2 核心架构:四控制器协作 Git 仓库 应用 YAML / Helm Chart OCI 仓库 Helm Chart / 容器镜像 Source Controller 拉取 / 轮询 拉取 / 轮询 Kustomize Controller Helm Controller 提供 Source 提供 Source Notification Controller 事件 事件 Kubernetes 集群(Deploy / Service / ConfigMap / Secret) apply / prune install / upgrade Slack / Webhook Source Controller Kustomize Controller Helm Controller Notification Controller

2.3 核心组件详解

2.3.1 Source Controller

Source Controller 是 Flux 的数据入口,负责从外部源拉取配置并缓存到集群内。它定义了四种 CRD:

CRD 名称 源类型 典型用途
GitRepository Git 仓库(HTTPS / SSH) 存储应用 Kustomize 覆盖层、基础 YAML
OCIRepository OCI 兼容仓库(Docker Registry) 存储 Helm Chart 或预构建的 Kustomize 制品
HelmRepository Helm Chart 仓库(index.yaml) 引用 Bitnami / 官方 Helm 仓库
Bucket S3 / GCS / MinIO 对象存储 存储大型二进制配置或 Terraform 状态

Source Controller 支持自动轮询(默认 1 分钟)和Webhook 触发两种更新方式。拉取后的内容被压缩为 Artifact 存储在控制器 Pod 的内存或 PVC 中,供下游控制器消费。

2.3.2 Kustomize Controller

Kustomize Controller 负责渲染并应用原生 Kubernetes YAML。它读取 Source Controller 提供的 GitRepository 或 OCIRepository 中的 Kustomize 覆盖层,执行 kustomize build 后通过 Server-Side Apply 将资源推送到集群。

关键特性:
• 支持 patches、patchesStrategicMerge、patchesJson6902 等 Kustomize 原生功能。
• 内置 Health Assessment:等待 Deployment/StatefulSet 达到 Ready 状态后才标记同步成功。
• 支持 Prune:自动删除 Git 仓库中已移除的资源,防止残留。

2.3.3 Helm Controller

Helm Controller 是 Flux 的Helm 操作引擎,它替代了传统的 helm install/upgrade 命令。核心 CRD 包括:

  • HelmRelease:声明一个 Helm Release 的期望状态,引用 Source Controller 提供的 Chart。
  • HelmChart:自动从 HelmRepository 或 OCIRepository 中拉取 Chart 并缓存。

Helm Controller 支持values 覆盖(通过 ConfigMap / Secret 引用)、依赖管理(等待依赖 Release 就绪)、回滚(自动回滚到上一个成功版本)。

2.3.4 Notification Controller

Notification Controller 负责事件路由与告警。它监听所有 Flux 控制器发出的事件(同步成功、失败、进度),并根据 Alert 和 Provider CRD 的配置将事件转发到外部系统。

Provider 类型 支持的服务
Slack / Discord / Telegram 即时消息通知
GitHub / GitLab / Bitbucket Commit Status 更新
Webhook 自定义 HTTP 回调
PagerDuty / OpsGenie 事件告警与值班调度

2.4 版本演进:从 Flux v1 到 Flux v2

Flux 经历了两次重大架构重构,理解版本演进有助于选择正确的部署策略:

Flux CD 版本演进时间线 Flux CD 版本演进时间线 v1 2016 单体二进制 仅支持 Kustomize v2 2020 多控制器架构 Kustomize + Helm + OCI v2.1+ 2023 OCIRepository 稳定 性能优化 + 多租户
维度 Flux v1(旧版) Flux v2(当前)
架构 单体二进制,所有功能集成在一个 Pod 中 多控制器,每个控制器独立部署、独立升级
Helm 支持 通过 fluxctl 命令间接支持,功能有限 原生 Helm Controller,支持完整 Helm 生命周期
OCI 支持 不支持 原生 OCIRepository,可直接拉取 OCI 制品
多租户 无原生支持,需手动隔离 通过 Kustomization.spec.targetNamespace 和 RBAC 实现
依赖管理 无 支持 dependsOn 字段,可定义资源部署顺序
健康检查 仅检查 Deployment 是否 Running 支持自定义 HealthChecks,可检查 CRD 状态
升级路径 — 提供 flux bootstrap 命令,支持从 v1 迁移
版本选择建议:Flux v1 已于 2022 年 11 月进入维护模式,不再添加新功能。所有新项目应直接使用 Flux v2(当前稳定版 v2.3.x)。如果正在使用 v1,建议通过 flux bootstrap 的迁移模式逐步切换。

2.5 核心工作流:一次完整的 GitOps 同步

以下是一个典型的多环境部署流程,展示四个控制器如何协作:

  1. 开发者提交 PR 修改 apps/production/deployment.yaml,合并到 main 分支。
  2. Source Controller 轮询到 Git 仓库有新的 Commit,拉取最新内容并生成新的 Artifact。
  3. Kustomize Controller 检测到 GitRepository 的 Artifact 更新,重新执行 kustomize build,生成最终的 Kubernetes 资源清单。
  4. Kustomize Controller 通过 Server-Side Apply 将资源应用到集群,并等待 Deployment 达到 Ready 状态。
  5. Notification Controller 捕获同步成功事件,发送 Slack 消息通知团队。
  6. 如果 Deployment 在 5 分钟内未就绪,Kustomize Controller 将同步状态标记为 Failed,Notification Controller 发送告警。
关键设计原则:Flux 不执行 CI 构建(编译、测试、镜像打包),它只负责 CD 阶段的配置同步。CI 阶段由 GitHub Actions / GitLab CI / Jenkins 等工具完成,构建好的镜像推送到 Registry 后,Flux 通过更新 Git 仓库中的镜像标签来触发部署。