Flux 概览
这一课你将能做到
- 说出 Flux GitOps Toolkit 里
GitRepository、HelmRepository、HelmRelease、Kustomization 四个 CRD 各自的职责与配合关系
- 读懂并改写一段
HelmRelease YAML(含中文注释),说明它如何等价于「Git 触发的受控 helm upgrade」
- 用一张表对比 Argo CD 与 Flux 的选型维度,并给出「小团队先精通一个」的结论
为什么要学
Argo CD 用一张 Application「打包」了源与目的地;Flux(CNCF 毕业项目)则把它拆成多枚 CRD:先声明「源」(Git 仓库/Chart 仓库),再声明「交付」(HelmRelease/Kustomization 把源变成集群对象)。这种模块化让 Flux 与 Kustomize、镜像自动化(ImagePolicy/ImageRepository)组合更灵活,也让控制面更小;代价是初学者面对多个 CRD 容易懵。本课目标不是一天装完生产级 Flux,而是建立 能读懂、能选型 的地图——本站选 Argo 还是 Flux 都成立,概念完全互通。
先建立图像
GitRepository ──按 interval 拉取──► Git 仓库分支/路径
│
├─► Kustomization ──► 应用某个 Kustomize 目录(含 post-build 编辑)
│
└─► HelmRelease ──chart.spec.sourceRef──► 指向 GitRepository 或 HelmRepository
│
└─ 集群内协调:安装/升级 Chart ≈ 受控的 helm upgrade
| CRD | 人话 | 关键字段 |
|---|
| GitRepository | 「盯这个 Git」 | url、ref、interval |
| HelmRepository | 「盯这个 Chart 仓库」 | url、interval |
| HelmRelease | 「装/升这个 Chart + 参数」 | chart.spec、values、interval |
| Kustomization | 「应用这个 Kustomize 路径」 | path、sourceRef、prune |
人话:Argo 的一张 Application,大致等价于 Flux 里「源 CR + 交付 CR」的组合拳;Flux 把这张票拆成两联,换来更细的组合自由。
跟着做
步骤 1:扫官方概念页,用自己的话总结
打开 Flux Concepts,用中文写四句话分别解释四个核心 CRD 干什么。禁止抄英文长段——能复述才算懂。应捕捉到两个关键词:源与交付分离、持续调和。
步骤 2:读懂 GitRepository(一切的地基)
# 源 CR:Flux 按 interval 拉取该仓库
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: coderoadmap
namespace: flux-system
spec:
interval: 1m
url: https://github.com/your-org/java-nav.git
ref:
branch: main
没有这一步,后面的 HelmRelease/Kustomization 就没有「货架」。注意拉取认证也在这层配置(私有库的 Secret 引用)。
步骤 3:读懂 HelmRelease(对标 backend-dev Application)
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: coderoadmap-dev # Release 装到哪个 ns
spec:
interval: 5m # 调和周期
chart:
spec:
chart: ./deploy/charts/backend # 仓库内 Chart 路径
sourceRef:
kind: GitRepository # Chart 来自上面声明的源
name: coderoadmap
namespace: flux-system
interval: 1m
values: # 内联 values;也可 valuesFrom 引用资源
replicaCount: 1
image:
repository: registry.example/coderoadmap-backend
tag: "1.0.0-dev"
db:
host: mysql.coderoadmap-dev.svc
passwordSecretName: backend-db-secret
对照流程:改 values.image.tag 并 commit → Flux 拉到变更 → HelmRelease 协调 → 等价一次带参数的 helm upgrade。生产更常见 valuesFrom(引用 ConfigMap/Secret,或配合 Kustomize post-build 从 env 文件注入),避免巨石内联。
步骤 4:若把本站 Argo 换成 Flux,要哪些 CR(迁移检查表)
flux bootstrap git(官方引导,同时把 Flux 自身清单写回 Git)
GitRepository 指向同一仓库
HelmRelease(或 Kustomization)表达与 backend-dev Application 相同的 path/values
- 移除旧 Application——绝不两个控制器同时管同一组资源
- 验证 interval、凭据、网络出口,观察
flux get helmreleases 状态
这张表本身就是「两套工具概念互通」的证据:source/path/values 三要素一一对应。
步骤 5:填选型表并给结论
| 维度 | Argo CD | Flux | 你更在意哪个 |
|---|
| UI | 内置功能丰富 | 社区 UI/CLI 为主 | |
| 模型 | Application 为中心,一张票 | 多 CRD 组合,源交付分离 | |
| Helm 支持 | 一等公民 | HelmRelease 一等公民 | |
| Kustomize | 支持 | 原生强项 | |
| 生态与采用 | 企业采用广、ApplicationSet 强 | CNCF 毕业、轻量、OCI 支持好 | |
| 镜像自动化 | 需配合其他组件(Argo Image Updater) | 内置 Image Automation | |
结论写死一行:「先精通 ____,另一套保持概念阅读能力,绝不并行接管同一应用。」
步骤 6:口头验收
一分钟说清:「Flux 用 GitRepository 定源,用 HelmRelease/Kustomization 定交付;和 Argo 比,是模块化多 CRD vs 一体化单 Application;排障时要看各 CR 的 Ready 条件而不是只看 Pod。」
讲清楚要点
- 因为源与交付分离,所以同一个 GitRepository 可被多个 HelmRelease/Kustomization 复用——平台源集中声明,业务交付各自独立。
- 因为 HelmRelease 在集群内协调,所以效果等价 helm upgrade 但触发来自 Git——这正是 Pull 模型的落地;values 改动=PR,调和=控制器。
- 因为 CR 较多,所以排障要按依赖链查——先
flux get sources git 看 Ready,再看 flux get helmreleases,最后才下钻业务 Pod;跳层排障会白忙。
- 因为 bootstrap 会把 Flux 自身清单写回 Git,所以仓库会多出 flux-system 目录——这是预期行为,纳入评审而不是手工删改。
- 因为与 Argo 概念互通,所以学透一套后另一套只是语法差异——忌「半吊子两套」并管一个应用,必然互相覆盖。
- 因为 values 可内联也可 valuesFrom,所以密钥纪律不变——Git 里永远只有 Secret 名或封存密文,明文密码无处可逃。
你可能会懵的地方
-
Flux v1 和 GitOps Toolkit 是什么关系?
现行 Flux(v2)是拆分后的 GitOps Toolkit 多控制器集合(source-controller、kustomize-controller、helm-controller…)。搜资料时看到「Flux v1/gitopsctl」的旧文一律跳过,认准 fluxcd.io 当前文档。
-
HelmRelease 的 values 和仓库里的 values 文件怎么协作?
Chart 自带默认 values;HelmRelease.spec.values 内联覆盖;也可用 valuesFrom 引用 ConfigMap/Secret;配合 Kustomize 的 patchStrategicMerge/postBuild 还能把 env values 文件注入。避免的坏味道是「只改集群内联字段导致与 Git 文件漂移」——反正一切以 Git 为准。
-
没有 UI 能用吗?
能。flux CLI + kubectl 足够覆盖日常;需要可视化再加 Weave GitOps 或第三方仪表盘。UI 需求是选型变量,不是功能缺陷。
-
Image Automation 是什么?
Flux 可监视镜像仓库,按策略(ImageRepository/ImagePolicy)自动把新 tag 写回 Git 并开 PR——「CI 推镜像、Flux 提 PR、人工或自动合并」的渐进路径。入门先手改 values,理解后再开。
-
Flux 怎么装?
官方 flux bootstrap 一条命令:装控制器、建 GitRepository、把 Flux 自身的部署清单提交回 Git——从第一天起 Flux 管理自己,也是 GitOps 原则的自举示范。
错法对照
| 错法 | 问题 | 正解 |
|---|
| Argo 与 Flux 同时管同一组资源 | 互相覆盖、状态震荡 | 只保留一个控制器 |
| 只写 HelmRelease 不写 GitRepository | 无源可拉,永远 Not Ready | 先源后交付 |
| 生产密码写进 HelmRelease.spec.values | 泄密进 Git | valuesFrom + ESO/封存方案 |
| 选型只看「谁更新潮」 | 团队运维能力错配 | 按 UI 需求、技能栈、生态定 |
| interval 设 5s 且仓库巨大 | Git/Registry 限流与 API 压力 | 分钟级间隔 + 收窄 path |
| 直接在集群里 kubectl 改 HelmRelease | 与 Git 漂移,下轮被冲掉 | 改 Git 走 PR |
卡点急救
- 现象:HelmRelease 一直
build failed: chart not found——sourceRef 指向的 GitRepository 名/命名空间写错,或 chart: 路径不是仓库根的相对路径;flux get sources git 确认源 Ready,再核对路径。
- 现象:改了 Git 很久没生效——检查 GitRepository 的 interval 与最近拉取时间(
flux get sources git -o wide);私有库查凭据 Secret;临时手动 flux reconcile source git coderoadmap 验证链路。
- 现象:
flux get helmreleases 显示 upgrade retries exceeded——看 flux logs --kind=HelmRelease --name=backend 找渲染/安装错误,多数是 values 键名层级错误或依赖拉取失败;与 helm CLI 排障思路一致。
面试常问
-
Flux 的架构模型是怎样的?
基于 GitOps Toolkit 的多控制器架构:source-controller 负责拉取 Git/Helm 仓库/OCI 产物并产出「源」资源;kustomize-controller 按 Kustomization 应用清单;helm-controller 按 HelmRelease 渲染安装 Chart;notification-controller 负责事件通知。每个 CRD 都有 Ready 条件,按依赖链(源→交付→应用)逐层调和。
-
Flux 和 Argo CD 怎么选?
共同点:都实现 GitOps 四原则,都原生支持 Helm/Kustomize。差异:Argo 一体化、UI 强、ApplicationSet 适合大规模多租户;Flux 模块化、控制面轻、与 OCI/Image Automation 集成更原生、CNCF 毕业。选型看团队是否重 UI、应用规模、是否需要镜像自动更新——结论通常是小团队选一个做深,不建议并行接管同一应用。
-
HelmRelease 如何等价于 helm upgrade?
HelmRelease 声明 chart 来源(Git/HelmRepository/OCI)与 values,helm-controller 在集群内执行渲染与安装升级,行为对应 helm upgrade --install 的语义(含 timeout、rollback 策略字段);差异在于触发者是 Git 变更与调和周期,而非人敲命令——这正是 GitOps Pull 模型的体现。
自测三问
- GitRepository 与 HelmRelease 如何配合完成一次「镜像 tag 升级」?画出数据流。
- 为什么说 Flux 更模块化?这对排障路径(该先看什么资源)意味着什么?
- 团队已在用 Argo CD 且运行良好,是否必须迁 Flux?给出决策依据。
小结一句话
Flux 用 GitRepository 等源 CR 加 HelmRelease/Kustomization 完成拉取式交付,与 Argo CD 目标相同、形状不同——源与交付分离是它的招牌;选一个做深,永远避免双控制器冲突。
延伸