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 仓库,流程如下:
- 开发者/运维者 修改 Git 仓库中的声明式配置文件。
- CI 流水线 执行构建、单元测试、安全扫描,通过后合并到目标分支。
- GitOps Operator 检测到 Git 仓库变更,拉取最新配置。
- Operator 对比集群当前状态与期望状态,生成差异清单。
- Operator 执行同步操作(Apply / Patch / Delete),使集群收敛至期望状态。
- 同步结果 写回 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 工作流示意图
1.6 GitOps 同步模式:Pull vs Push
GitOps 支持两种同步模式,实际生产环境中通常结合使用:
| 特性 | Pull 模式(推荐) | Push 模式 |
|---|---|---|
| 代表工具 | Argo CD、Flux | Jenkins X、GitLab CI(CD 阶段) |
| Operator 位置 | 运行在目标集群内 | 运行在集群外(CI 工具) |
| 安全优势 | 集群无需对外暴露 API | CI 工具需持有集群凭证 |
| 漂移检测 | 内置持续对比与自动纠正 | 无自动漂移检测 |
| 适用场景 | 生产环境、多集群管理 | 开发/测试环境、快速迭代 |