1. GitOps 基础概念
1.1 GitOps 定义
GitOps 是一种以 Git 仓库作为声明式基础设施和应用程序的单一事实来源(Single Source of Truth)的运维模式。它通过 Git 工作流(Pull Request、Code Review、Merge)来驱动基础设施和应用的自动变更,确保集群状态始终与 Git 仓库中定义的期望状态保持一致。
核心思想: 声明期望状态 → 提交至 Git → 自动化同步代理持续调和 → 集群实际状态趋近期望状态。
1.2 声明式基础设施
声明式基础设施是指用户描述系统“应该是什么状态”,而非“如何达到该状态”。运维人员只需在 YAML、JSON 或 HCL 文件中定义最终目标,由工具自动计算并执行差异。
| 对比维度 | 声明式(Declarative) | 命令式(Imperative) |
|---|---|---|
| 描述方式 | 定义最终状态(What) | 定义操作步骤(How) |
| 幂等性 | 天然幂等,重复执行结果一致 | 需手动保证幂等,易产生漂移 |
| 可审计性 | 所有变更记录在 Git 历史中 | 依赖操作日志,易丢失 |
| 回滚方式 | Git revert 即可触发自动回滚 | 需手动逆向操作 |
| 典型工具 | Kubernetes YAML、Terraform、Pulumi | Shell 脚本、Ansible Ad-hoc |
实践建议: 在 GitOps 流水线中,所有基础设施定义(Deployment、Service、ConfigMap、Namespace)都应使用声明式 YAML 文件管理,避免在集群内直接执行 kubectl create/apply 命令。
1.3 Git 作为单一事实来源
在 GitOps 模型中,Git 仓库不仅是代码存储库,更是整个系统的权威状态数据库。任何对生产环境的变更都必须先提交到 Git 仓库,经过审核合并后,再由自动化代理同步到目标环境。
关键约束: 禁止绕过 Git 仓库直接修改生产环境。任何手动 kubectl edit、kubectl scale 或云控制台操作都会导致状态漂移(Drift),破坏 Git 作为单一事实来源的权威性。
1.4 GitOps 与 CI/CD 的区别
传统 CI/CD 与 GitOps 在变更驱动方式、部署触发机制、状态管理等方面存在本质差异。理解这些区别是设计同步窗口优化方案的前提。
| 对比维度 | 传统 CI/CD | GitOps |
|---|---|---|
| 变更驱动 | CI 构建完成 → 自动触发 CD 部署 | Git 仓库变更(Merge)→ 同步代理调和 |
| 部署方向 | Push 模式:CI/CD 工具将制品推送到环境 | Pull 模式:同步代理从 Git 拉取期望状态 |
| 状态管理 | 部署工具维护状态数据库(易漂移) | Git 仓库作为唯一权威状态 |
| 回滚机制 | 重新执行上一次成功的部署流水线 | Git revert 提交 → 自动同步回滚 |
| 安全模型 | CI/CD 工具需要集群凭证(高风险) | 同步代理使用受限凭证,Git 仓库控制权限 |
| 审计能力 | 依赖 CI/CD 平台日志 | Git 提交历史 = 完整变更审计链 |
| 典型工具 | Jenkins、GitLab CI、GitHub Actions | ArgoCD、Flux CD、Jenkins X |
关键洞察: GitOps 并非取代 CI/CD,而是对 CD 阶段的重新定义。CI 阶段(构建、测试、镜像打包)仍然保留,但 CD 阶段从“推送部署”转变为“Git 驱动同步”。这种转变使得部署过程更加可审计、可回滚、可重现。
1.5 GitOps 同步窗口与数据传输的关系
在 GitOps 实践中,同步窗口(Sync Window)是指允许同步代理执行状态调和的时间段。数据传输机制则决定了同步代理如何从 Git 仓库获取变更、如何计算差异、如何将变更应用到目标集群。理解 GitOps 基础概念是后续优化同步窗口和数据传输效率的理论基石。
- 同步窗口策略: 在业务低峰期开放同步窗口,减少对在线服务的影响。
- 数据传输效率: 优化 Git 仓库与同步代理之间的数据拉取方式(增量同步、缓存、压缩)。
- 一致性保障: 确保在同步窗口关闭前,集群状态与 Git 仓库完全一致。