ArgoCD 与 Flux:为 openEduSuite 选择 GitOps 控制器
GitOps 已成为 Kubernetes 平台的默认运行模式:集群的期望状态保存在 Git 中,由控制器将集群调和到该状态。两个 CNCF 毕业项目主导着这一领域——ArgoCD 和 Flux CD。两者都可用于生产,都被广泛采用,并且都能运行主权教育平台。它们在结构、人体工学和运维哲学上有所不同。本文以中立的方式比较两者,以便团队能够审慎选择,而不是默认选择。
两种工具都能做什么
在核心层面,ArgoCD 和 Flux 执行相同的循环:
- 监视 Git 仓库(或 OCI 制品)的变更。
- 渲染声明的清单(Helm、Kustomize 或纯 YAML)。
- 将其应用到 Kubernetes 集群。
- 检测并报告期望状态与实际状态之间的漂移。
两者都支持 Helm charts、Kustomize overlays、纯清单、OCI 来源、webhook 和轮询。差异在于结构和运维方式,而不是是否能够部署服务。
架构与心智模型
| 方面 | ArgoCD | Flux CD |
|---|---|---|
| 核心抽象 | 每个已部署应用一个 Application 资源 |
可组合的 Kustomization / HelmRelease 加上 Source |
| 组件 | API 服务器、仓库服务器、应用控制器、Redis、可选 SSO (Dex) | source-controller、kustomize-controller、helm-controller、notification-controller、可选镜像控制器 |
| 用户界面 | 内置 Web UI 和 CLI | 仅 CLI;可选第三方 UI |
| 多集群 | Hub-and-spoke:一个控制平面管理多个集群 | 每个集群一套控制器;通过外部工具聚合 |
| 资源占用 | 较重,集中式 | 较轻,模块化——仅安装所需组件 |
ArgoCD 将一个应用作为管理单位,并在 UI 中展示健康状态、同步状态和资源树。Flux 将来源与协调器作为可组合的构建块,它们是原生的 Kubernetes 资源。习惯以"应用"思考的团队通常偏好 ArgoCD;习惯以"Kubernetes 资源"思考的团队通常偏好 Flux。
协调与漂移处理
| 功能 | ArgoCD | Flux |
|---|---|---|
| 自动同步 | 是(automated,带 prune 和 self-heal) |
是,按协调间隔 |
| 修剪 / 垃圾回收 | 是 | 是 |
| 漂移检测 | 是,带健康状态 | 是,带可选自动纠正 |
| Diff 策略 | 仓库服务器中的客户端 diff | 默认 server-side apply |
| 冲突处理 | Patch / 三方合并 | 通过 server-side apply 的字段所有权 |
Flux 采用 server-side apply 是一个实质性优势,当多个控制器或人员触碰相同资源时:字段所有权被显式追踪,而不是被静默覆盖。ArgoCD 的客户端 diff 在其 UI 中产生可读的预览,许多运维人员重视这一点用于审查。
打包与模板
两种工具都很好地覆盖了常见场景:
- Helm:两者原生支持,包括 OCI 仓库。
- Kustomize:两者原生支持。
- 纯 YAML:两者原生支持。
- Jsonnet:ArgoCD 原生支持;Flux 通过 Kustomize 可用。
- 自定义插件 / 转换器:两者都支持,扩展机制不同。
一个实际差异:Flux 的 Helm 控制器支持 valuesFrom,允许从 Secret 或 ConfigMap 拉取 Helm 值。ArgoCD 通过插件或外部 secret operator 实现类似结果,这增加了步骤。
密钥管理
密钥绝不能以明文提交。两种工具对此采取不同方法:
- Flux 在 kustomize-controller 中原生解密 SOPS 加密文件,支持 age 和 PGP。这将密钥处理保持在协调循环内,无需额外组件。
- ArgoCD 通常依赖插件,如 ArgoCD Vault Plugin,或外部 operator,如 External Secrets Operator 和 Sealed Secrets。这些可行,但增加了组件和配置。
两者都与 External Secrets Operator 和 Sealed Secrets 良好集成。差异在于运维复杂度:Flux 的 SOPS 路径更短,而 ArgoCD 的插件生态更广。
镜像自动化
常见的 GitOps 工作流是在发布新容器镜像时自动更新清单。
- Flux 提供 image-reflector 和 image-automation 控制器,检测新标签并将变更提交回 Git。这是第一类功能,文档完善。
- ArgoCD 提供 ArgoCD Image Updater 作为独立项目。它可用,但集成度较低,且遵循自己的发布周期。
对于希望在 GitOps 内完全实现镜像提升的团队,Flux 目前提供更顺畅的体验。
多租户与 RBAC
| 方面 | ArgoCD | Flux |
|---|---|---|
| RBAC 模型 | 内置 RBAC,含项目、角色和策略 | Kubernetes 原生 RBAC(ServiceAccounts、RoleBindings) |
| SSO | 通过 Dex 内置(OIDC、SAML、LDAP 等) | 委托给集群的身份提供商 |
| 租户隔离 | AppProjects 带来源和目标限制 | 命名空间范围的控制器;设计上强隔离 |
| 多租户集群 | 配置仔细时良好 | 优秀——为共享集群设计 |
ArgoCD 内置的 SSO 和 RBAC UI 减少了希望拥有带登录控制平面的组织的设置工作。Flux 依赖 Kubernetes 自身的机制,更可移植,避免了中央身份组件,但需要更多初始接线。
通知与事件
两种工具都可以在协调结果时通知外部系统:
- ArgoCD Notifications 是一个带基于模板触发器的独立控制器。
- Flux notification-controller 是标准工具包的一部分,支持 Slack、Teams、Discord、Rocket.Chat、webhook 以及 Git 提供商的 commit 状态。
两者都覆盖常见目标。Flux 的控制器更统一地集成到工具包的生命周期中。
渐进式交付
带基于指标提升的金丝雀和蓝绿部署由配套项目处理:
- Argo Rollouts 成熟且广泛采用,带将提升门控到指标的分析模板。
- Flagger 与 Flux 集成,支持跨多个 ingress 和 service mesh 提供商的类似策略。
Argo Rollouts 目前拥有更大的生态和社区。Flagger 很扎实,自然融入 Flux 流水线。两者都能实现渐进式交付;选择通常跟随已就位的 GitOps 控制器。
可观测性与用户体验
这是两种工具感觉最不同的地方:
- ArgoCD 提供丰富的 Web UI:应用树、实时 diff、同步历史、资源图和审计日志。对于偏好视觉反馈的运维人员和利益相关者,这是主要优势。
- Flux 没有内置 UI。可观测性来自 CLI、Kubernetes 事件和 CRD 状态,配合可选的第三方仪表板。
ArgoCD 的 UI 降低了新接触 Kubernetes 的团队的门槛。Flux 回报于熟悉 kubectl 和 CRD 状态的团队。
性能与资源占用
- ArgoCD 可以从一个控制平面管理许多集群,但集中式组件(Redis、仓库服务器、API 服务器)消耗更多资源,并在大规模时需要分片配置。
- Flux 每个集群运行一小套控制器,只安装所需组件。其占用通常更轻,扩展通过增加副本水平进行。
对于单集群或少集群部署,差异不大。对于大型集群群,Flux 的每集群模型可能更容易推理,而 ArgoCD 的 hub-and-spoke 模型集中化运维。
安全态势
- ArgoCD 暴露一个必须通过 ingress、认证和 TLS 保护的中央 API 服务器。控制器通常持有广泛的集群权限,尽管可以按项目限定。
- Flux 是 pull-based,没有暴露的中央服务器。每个控制器以受限的 service account 运行,多租户隔离是一等设计目标。供应链功能包括签名提交和对 OCI 来源的 cosign 验证。
pull-based 模型减少了暴露的攻击面。集中式模型集中控制并可简化审计。两者在适当加固下都能安全运行。
学习曲线与运维
- ArgoCD 更快上手:UI 引导用户添加仓库、创建应用和触发同步。
- Flux 更声明式、更 Kubernetes 原生:一切皆 CRD,日常工作通过 YAML 和 CLI 完成。初始学习曲线更陡,但结果是完全可复现的配置。
升级也不同:ArgoCD 升级中央平台,而 Flux 升级单个控制器,可以增量完成。
何时选择哪个
ArgoCD 是强选择,当:
- 视觉控制平面对运维人员或利益相关者很重要。
- 内置 SSO 和 RBAC 应开箱即用。
- 计划使用 Argo Rollouts 进行渐进式交付。
- 希望集中管理许多集群。
- 团队对 Kubernetes 不够原生。
Flux 是强选择,当:
- 偏好纯声明式、Kubernetes 原生的工作流。
- 原生 SOPS 支持和镜像自动化很重要。
- 需要严格隔离的多租户集群。
- 希望更轻、更模块化的占用。
- server-side apply 和干净的冲突处理很重要。
- 偏好无中央服务器的 pull-based 模型。
两者一起使用
两者并非互斥。常见的混合模式包括:
- Flux 用于集群引导和密钥管理,ArgoCD 用于带 UI 的应用交付。
- Flux 镜像自动化提供清单,ArgoCD 部署。
- 迁移期间,一个环境用 ArgoCD,另一个用 Flux。
许多组织在转型期间同时运行两者,并基于运维经验随时间选定一个。
结论
没有通用赢家。ArgoCD 优化可见性和可接近性;Flux 优化可组合性和 Kubernetes 原生纯度。两者都是 CNCF 毕业项目,两者都经生产验证,并且都能支持主权教育平台。正确选择取决于团队技能、安全要求以及交付流水线有多大比例应活在 Kubernetes 本身之内。
Call to Action
- 隔离评估: 为每个控制器提供测试集群,并在提交前部署具有代表性的服务子集。
- 按自己的标准比较: 协调速度、漂移处理、密钥工作流和运维体验因环境而异。
- 分享经验: 加入 openEduSuite 社区频道
#opendesk-ce-public:matrix.openedusuite.org,与其他部署者讨论 GitOps 方法。 - 贡献: 欢迎所有贡献者改进文档、charts 和部署模式。
GitOps 是一种实践,而非产品:控制器是工具,版本控制且被调和的状态这一纪律才是目标。