1. GitOps 基础概念

GitOps 是一套以 Git 仓库作为声明式基础设施与应用程序部署的单一事实来源(Single Source of Truth)的运维模式。它通过 Pull 或 Push 机制自动将集群状态与 Git 仓库中定义的期望状态对齐,从而实现可审计、可回滚、可复现的持续交付。

1.1 GitOps 核心定义

GitOps 由 Weaveworks 在 2017 年正式提出,其核心思想可概括为:

  • 声明式部署:所有环境配置(Kubernetes YAML、Helm Chart、Kustomize 覆盖)都以声明式文件描述,而非命令式脚本。
  • Git 作为单一事实来源:集群的期望状态完全由 Git 仓库中的文件定义,任何手动变更都应被 GitOps 工具自动还原。
  • 自动化同步:GitOps Operator(如 Argo CD、Flux)持续监控 Git 仓库,一旦检测到差异即自动或按策略将集群状态收敛至期望状态。
  • 可观测与可回滚:每次同步都对应一次 Git 提交,回滚只需 revert 提交或切换分支。
关键区别: GitOps 不是 CI/CD 的替代品,而是将 CD 层与 Git 深度绑定的运维范式。CI 仍负责构建与测试,CD 则完全由 Git 驱动。

1.2 声明式部署 vs 命令式部署

维度 命令式部署 声明式部署(GitOps)
操作方式 执行 kubectl run / apply 等命令 修改 Git 仓库中的 YAML 文件
状态来源 集群当前状态 + 操作者记忆 Git 仓库中的期望状态
可审计性 依赖操作日志,难以追溯 每次变更对应 Git commit,完整审计链
回滚方式 手动执行 kubectl rollout undo git revert 或切换分支,自动同步
漂移检测 无自动检测,依赖人工巡检 Operator 持续对比,自动纠正

1.3 Git 作为单一事实来源

在 GitOps 模型中,Git 仓库不仅是代码存储库,更是整个集群的“期望状态数据库”。任何对集群的变更都必须经过 Git 仓库,流程如下:

  1. 开发者/运维者 修改 Git 仓库中的声明式配置文件。
  2. CI 流水线 执行构建、单元测试、安全扫描,通过后合并到目标分支。
  3. GitOps Operator 检测到 Git 仓库变更,拉取最新配置。
  4. Operator 对比集群当前状态与期望状态,生成差异清单。
  5. Operator 执行同步操作(Apply / Patch / Delete),使集群收敛至期望状态。
  6. 同步结果 写回 Git 仓库(如健康状态、同步状态),形成闭环。
实践建议: 在 GitOps 仓库中建议使用 main 分支作为生产环境的唯一事实来源,开发/预发环境使用 feature 分支或独立目录。禁止直接通过 kubectl 修改集群资源,否则 GitOps Operator 会自动还原。

1.4 GitOps 与 CI/CD 的区别

传统 CI/CD 与 GitOps 在 CD 阶段有本质差异。下表从多个维度进行对比:

对比维度 传统 CI/CD GitOps
部署触发方式 CI 完成后 Push 到集群 Git 仓库变更后 Pull 到集群
集群访问权限 CI 工具持有集群凭证 Operator 在集群内运行,无需外泄凭证
状态一致性 依赖 CI 执行结果,可能漂移 持续对比,自动纠正漂移
回滚复杂度 需重新触发 CI 或手动执行 Git revert 后自动同步
多环境管理 通常使用不同分支或不同 CI 配置 同一仓库不同目录/分支,Operator 按策略同步
安全模型 CI 工具需高权限,攻击面大 Operator 权限最小化,Git 仓库只读
常见误区: GitOps 并不完全取代 CI。CI 阶段(构建、单元测试、镜像推送)仍然需要传统 CI 工具(如 Jenkins、GitHub Actions、GitLab CI)。GitOps 接管的是 CD 阶段——将“部署什么版本”的决定权交给 Git 仓库,而非 CI 输出。

1.5 GitOps 工作流示意图

GitOps 工作流:Git 作为单一事实来源 开发者/运维者 Git 仓库 CI 流水线 GitOps Operator Kubernetes 集群 git push Webhook 触发 更新镜像 Tag Pull & Diff Apply 同步状态回写

1.6 GitOps 同步模式:Pull vs Push

GitOps 支持两种同步模式,实际生产环境中通常结合使用:

特性 Pull 模式(推荐) Push 模式
代表工具 Argo CD、Flux Jenkins X、GitLab CI(CD 阶段)
Operator 位置 运行在目标集群内 运行在集群外(CI 工具)
安全优势 集群无需对外暴露 API CI 工具需持有集群凭证
漂移检测 内置持续对比与自动纠正 无自动漂移检测
适用场景 生产环境、多集群管理 开发/测试环境、快速迭代