1. GitOps 概述:定义、声明式模型核心思想与传统 CI/CD 的区别

1.1 GitOps 定义

GitOps 是一种以 Git 仓库作为单一事实来源(Single Source of Truth)的云原生运维模式。它将整个系统的期望状态(Desired State)声明式地存储在 Git 中,并通过自动化机制持续确保运行环境与该期望状态保持一致。

核心公式: GitOps = 声明式基础设施 + 版本控制 + 自动化协调(Reconciliation)

GitOps 并非简单的“用 Git 管理配置”,而是一种将 Git 工作流(分支、合并、回滚、审批)直接映射到生产环境变更的工程实践。任何对集群的修改都必须通过 Pull Request 发起,经审核后合并到主分支,再由 Operator 自动同步到目标环境。

1.2 声明式模型核心思想

声明式模型(Declarative Model)是 GitOps 的基石。与命令式(Imperative)模型不同,声明式模型只描述“系统应该是什么状态”,而不描述“如何达到该状态”。

维度 命令式模型 声明式模型
操作方式 执行具体命令(kubectl run、kubectl scale) 提交期望清单(YAML/JSON)到 Git
状态管理 依赖操作者记忆和脚本顺序 Git 仓库始终保存完整期望状态
回滚方式 反向执行命令或手动恢复 git revert 到上一个期望状态版本
漂移检测 需要额外监控脚本 Operator 自动检测并纠正漂移
审计能力 分散在终端日志中 Git 提交历史即完整审计链
实践要点: 声明式模型要求运维人员从“如何操作”的思维转变为“如何定义”的思维。在灰度发布场景中,这意味着你不再手动调整副本数,而是修改 Git 中的 Deployment 清单,让 Operator 自动执行批次切换。

1.3 GitOps 与传统 CI/CD 的区别

传统 CI/CD 管道(如 Jenkins、GitLab CI)侧重于“构建-测试-部署”的自动化流水线,而 GitOps 将部署环节从管道中剥离,交给独立的协调器(如 Argo CD、Flux)持续运行。

传统 CI/CD vs GitOps 架构对比 传统 CI/CD 管道 CI:构建+测试 CD:推送部署 直接操作集群(kubectl apply) 无持续状态同步 GitOps 工作流 CI:构建+测试 PR 合并到 Git Git 仓库(单一事实来源) Operator 拉取 持续协调 自动检测漂移 + 纠正 GitOps 将“部署”从 CI/CD 管道中解耦,由 Operator 持续协调期望状态与实际状态

1.4 关键差异对比

对比维度 传统 CI/CD GitOps
部署触发 管道执行完毕即触发部署 Git 仓库变更触发 Operator 同步
状态一致性 部署后不再关注环境漂移 持续检测并纠正漂移(Reconciliation Loop)
回滚粒度 重新运行管道或手动回滚 git revert + 自动同步
权限模型 CI/CD 系统账号直接操作集群 Operator 通过 Git 权限间接控制集群
审计追溯 管道日志 + 集群事件 Git 提交历史 + 签名 + PR 讨论
灰度发布支持 需额外开发灰度逻辑 声明式清单天然支持分批、回滚、暂停
常见误区: GitOps 不是要取代 CI/CD,而是重新定义 CD 的职责边界。CI 阶段(构建、单元测试、镜像推送)仍然保留在传统管道中;CD 阶段(部署、协调、漂移检测)由 GitOps Operator 接管。在灰度批次场景中,这种分离使得运维人员可以独立控制发布节奏,而不受 CI 管道执行时间的限制。

1.5 灰度发布场景下的 GitOps 优势

  • 批次清单留痕: 每次灰度批次的期望状态(如 10% → 30% → 100%)都以 Git 提交形式永久保存,支持精确回滚到任意批次。
  • 审批与合规: 批次切换必须通过 PR 审批,满足金融、医疗等行业的变更管理要求。
  • 自动漂移纠正: 如果某批次节点异常导致实际状态偏离期望状态,Operator 会自动尝试恢复,避免人工介入延迟。
  • 多环境一致性: 同一套声明式清单可通过参数化(Kustomize/Helm)应用到开发、预发、生产环境,确保灰度策略可复现。
课程关联: 本章后续将深入讲解如何利用 GitOps 声明式模型,在灰度发布过程中实现批次运维清单的自动生成、版本留痕与审计追溯。你将看到 Git 提交如何成为每一次灰度操作的“数字签名”。