1. GitOps 理念与核心原则

1.1 GitOps 定义

GitOps 是一种以 Git 仓库作为声明式基础设施和应用程序的单一事实来源的运维模式。它通过自动化同步机制,确保集群的实际状态始终与 Git 仓库中定义的期望状态保持一致。GitOps 将 Git 的操作流程(分支、合并、回滚、审批)直接映射到生产环境的变更管理上,使整个交付过程可审计、可复现、可回滚。

核心公式: GitOps = 声明式配置 + Git 版本控制 + 自动化同步

1.2 声明式与命令式对比

理解 GitOps 必须先区分两种配置管理范式:声明式(Declarative)与命令式(Imperative)。

维度 命令式(Imperative) 声明式(Declarative)
操作方式 执行具体指令(kubectl run、kubectl scale) 描述期望状态(YAML 清单)
状态管理 手动跟踪当前状态,逐步执行操作 系统自动调和,持续逼近期望状态
可复现性 依赖操作顺序和上下文,难以复现 配置即代码,任意时刻可复现
审计能力 操作日志分散,难以追溯 Git 历史完整记录每次变更
回滚方式 手动执行反向操作,易出错 Git revert 或 reset,自动同步回滚
典型工具 kubectl 命令、Shell 脚本 Flux、Argo CD、Kustomize、Helm
实践建议: 在 GitOps 工作流中,应完全避免使用 kubectl 命令直接修改集群状态。所有变更必须通过 Git 仓库的 Pull Request 发起。

1.3 Git 作为单一事实来源

在 GitOps 模型中,Git 仓库不仅是代码存储库,更是整个系统的真理源。这意味着:

  • 期望状态唯一性: 集群中所有资源的期望状态都定义在 Git 仓库中,不存在任何游离于 Git 之外的配置。
  • 变更全链路可追溯: 每一次配置变更都对应一个 Git commit,包含变更人、时间、原因和代码差异。
  • 分支策略即环境策略: 通常使用 main 分支对应生产环境,feature 分支对应开发环境,通过合并操作完成环境晋升。
  • 不可变基础设施: 任何环境差异都通过 Git 分支或目录结构体现,避免配置漂移。
Git 作为单一事实来源 — 核心架构 Git 仓库 期望状态(YAML/Helm/Kustomize) 开发者 / 运维 Kubernetes 集群 GitOps Operator(Flux) git push / PR 持续拉取 同步 / 调和 状态反馈 单一事实来源的核心约束 • 集群中不允许存在 Git 仓库中未定义的资源 • 所有变更必须通过 Git 提交触发,禁止直接操作集群 • Git 历史 = 完整的变更审计日志

1.4 自动化同步机制

自动化同步是 GitOps 的执行引擎。它持续监控 Git 仓库中的期望状态与集群实际状态之间的差异,并自动执行调和操作。Flux 作为 CNCF 毕业的 GitOps 工具,其同步机制包含以下关键环节:

  1. 源监控(Source Monitoring): Flux 定期轮询 Git 仓库(或 Helm 仓库、OCI 制品库),检测是否有新的 commit 或 tag。
  2. 配置拉取(Config Pull): 检测到变更后,Flux 从仓库拉取最新的清单文件到本地缓存。
  3. 差异计算(Diff Calculation): Flux 将拉取的期望状态与集群当前状态进行对比,生成差异清单。
  4. 自动调和(Auto Reconciliation): 根据差异清单,Flux 自动创建、更新或删除 Kubernetes 资源,使集群状态趋近于期望状态。
  5. 状态反馈(Status Feedback): Flux 将调和结果写回 Git 仓库(可选),或通过事件、指标暴露同步状态。
注意: 自动化同步并不意味着无限制的自动变更。生产环境中应结合 Pull Request 审批 和 渐进式交付(如 Flagger)来控制变更风险。Flux 支持配置同步策略(如:仅同步特定分支、路径或标签),避免意外覆盖。
自动化同步机制 — 调和循环 Git 仓库 Source Controller Kustomize Controller Kubernetes API 集群实际状态 轮询 / Webhook 传递清单 Apply 更新 状态对比 期望状态

1.5 GitOps 核心原则总结

根据 Weaveworks 和 CNCF 社区的定义,GitOps 包含以下五项核心原则:

  • 声明式配置: 整个系统由声明式描述定义,而非命令式指令。
  • 版本控制与不可变性: 所有配置存储在 Git 中,每次变更产生新的版本,历史不可篡改。
  • 自动拉取期望状态: 系统自动从 Git 拉取期望状态,无需手动触发部署。
  • 持续调和: 系统持续对比实际状态与期望状态,自动修复漂移。
  • 闭环反馈: 同步结果、健康状态和告警信息反馈给运维人员,形成闭环。
关键认知: GitOps 不是 CI/CD 的替代品,而是对 CD 环节的重新定义。CI(持续集成)仍然在 GitOps 之外运行,负责构建镜像和生成制品;GitOps 接管的是 CD(持续交付/部署)阶段,确保制品以声明式方式部署到目标环境。