第23章|GitOps 入门:Argo CD/Flux 的核心思想与工作流

传统 CD 经常像“推箱子”:流水线把东西推到集群里,然后就祈祷它一直保持正确。 GitOps 则像“自动驾驶”:你把期望状态写进 Git,集群里的控制器按节拍拉取、对比、收敛—— 一旦出现漂移(drift),系统会把它拉回正轨,并留下可审计的证据链。 这一章你将理解:Pull-basedDesired stateDriftReconcile loop

Core idea

Git 是期望状态的唯一真相源

  • 声明式:你描述“应该是什么样”,而不是“怎么做”
  • 审计天然:Git 历史就是变更记录
  • 回滚天然:回滚到上一 commit 即回到上一状态
Safety model

拉取式部署降低爆炸半径

  • 集群主动拉取,减少外部系统直连集群的权限面
  • 控制器最小权限 + 命名空间边界
  • 漂移检测 + 自动收敛 + 证据链
What you learn

Argo CD vs Flux:共同原理,不同落地

  • 核心循环一致:source → diff → apply → health
  • Argo:更偏“应用视图与 UI/操作体验”
  • Flux:更偏“组件化 CRD 与自动化更新”

1. GitOps 解决的不是“部署”,而是“持续一致性”

很多团队已经能自动部署,但仍然经常遇到三类痛点:

  1. 漂移:生产环境被临时改过(热修、手动 kubectl),但没人知道、也没记录。
  2. 不可追溯:出事时只能问“谁上了什么”,缺乏确定答案。
  3. 不可复制:新环境搭不出来,或者搭出来行为不一致。
GitOps 的一句话:让集群状态长期与 Git 中的期望状态一致,并且让“变更与恢复”都可审计。

2. 推 vs 拉:为什么 Pull-based 部署更适合规模化治理?

Push-based:CI/CD 系统拿着凭证,把资源直接推到集群。它的风险是:外部系统一旦被攻破,就等于拿到了集群钥匙。 Pull-based:集群里的控制器(Argo/Flux)拿着最小权限,定期从 Git 拉取配置,完成对比与收敛。

Push vs Pull:权限面与爆炸半径的差异 核心差别:谁持有集群写权限?外部系统还是集群内控制器? Push-based Pull-based (GitOps) CI/CD system holds cluster credentials push apply via kubectl/helm risk: external compromise → cluster write Cluster receives changes, drift may happen manual fixes often unrecorded audit relies on pipeline logs push Git repo desired state manifests PR approvals + policy-as-code audit: git history + signatures In-cluster controller pull → diff → apply → reconcile least privilege + namespace boundary drift detection + auto-correct pull
图 1:Push vs Pull。GitOps 的关键收益之一是把集群写权限从“外部流水线”收敛到“集群内控制器”,降低攻击面与爆炸半径。

3. Reconcile loop:GitOps 的发动机

GitOps 的运行像一个永不停歇的“收敛循环”:

  1. Source:从 Git/Helm repo/OCI 拉取配置源。
  2. Diff:把当前集群状态与期望状态对比(含漂移检测)。
  3. Apply:把差异应用到集群(可能分批、可能带策略)。
  4. Health:判断应用健康与同步状态,必要时暂停/告警/回滚。
组件视角:Argo CD / Flux 的共同循环 共同核心:source → diff → apply → health · 差异主要在“产品形态与 CRD 组合方式” Reconcile loop Source Git / Helm / OCI 签名验证(可选) Diff drift detection sync status Apply kubectl/helm/kustomize waves · hooks(可选) policy gate(可选) Health readiness · metrics gate pause / alert / rollback
图 2:Argo CD / Flux 的共同循环。无论工具形态差异多大,核心都是“收敛循环 + 漂移检测 + 健康判定”。

4. 漂移(Drift)与回滚:GitOps 的“自愈”与证据链

漂移通常来自三类行为:临时热修、紧急排障、手工变更。GitOps 不否认它会发生,而是把它变成可治理事件:

重要:GitOps 的回滚不是“回滚脚本”,而是“回滚 Git 的期望状态”。因此你要在 Git 上建立与生产一致的审批与策略。
漂移 → 收敛 → 审计:GitOps 的证据链 目标:让“手动改过”变成可见、可追溯、可恢复的事件 Drift happens manual kubectl hotfix / debug Detect diff shows out-of-sync alerts / events Decide auto-correct or pause policy + approvals Correct reconcile to desired state apply waves / hooks verify health Audit evidence git commit / PR / approval controller events + sync history who/when/what/impact 策略建议:默认“检测 + 告警”,是否自动纠正取决于风险(prod 常需要审批或只允许少数资源 auto-sync)
图 3:漂移治理闭环。GitOps 不怕漂移发生,怕的是漂移不可见、不可追溯、不可恢复。

5. 最小落地清单(从 0 到 1)

  1. 分仓/分路径:把“应用配置(manifests)”与“平台基础设施”边界分开。
  2. 环境分层:dev/staging/prod 通过目录或分支表达,审批规则不同。
  3. 最小权限:控制器按命名空间授权;prod 尽量少开 auto-sync。
  4. 漂移策略:先 detect + alert,再逐步引入自动纠正。
  5. 证据链:PR 审批 + 签名(可选)+ controller sync history。
你现在应该能回答:
1) 我们的期望状态在哪里?Git 是否是唯一真相源?
2) 集群写权限掌握在谁手里?能否收敛到集群内控制器并做到最小权限?
3) 漂移发生时,系统是自动纠正、自动暂停,还是只告警?证据链在哪里?
← 上一章:数据库变更与交付 下一章:容器基础 1(镜像、分层、构建与运行) →