2. GitOps 工作流基础:声明式配置、Git 作为单一事实源、Pull vs Push 模式对比

GitOps 的核心思想是将运维和部署的复杂性抽象为两个关键原则:声明式配置与版本控制即事实源。理解这两个基础概念,以及基于它们衍生的 Pull/Push 模式差异,是掌握自动化回滚与配置冲突修复的前提。

2.1 声明式配置:描述“终态”而非“步骤”

在传统运维中,我们通常使用命令式操作(Imperative)来执行一系列步骤:kubectl run、kubectl scale、kubectl set image。这种方式关注的是“如何做”。而 GitOps 采用声明式配置(Declarative),只关注“最终应该是什么状态”。

对比维度 命令式(Imperative) 声明式(Declarative)
操作对象 执行动作(run, delete, scale) 描述终态(YAML/JSON 清单)
幂等性 非幂等,重复执行可能出错 幂等,重复应用结果一致
可审计性 依赖操作日志,难以追溯 清单即审计记录,可 diff
回滚方式 手动执行反向操作 将 Git 仓库回退到旧版本
Envoy 配置示例 curl -X POST .../clusters kubectl apply -f envoy-config.yaml
关键认知: 声明式配置是 GitOps 自动化的基石。当集群状态与 Git 中的声明不一致时,GitOps 控制器会自动执行调和(Reconciliation)操作,将集群拉回期望状态。Envoy 配置冲突的根源,往往就是多个声明式配置源(如多个 Git 仓库或手动操作)同时修改了同一个 Envoy 资源。

2.2 Git 作为单一事实源(Single Source of Truth)

在 GitOps 模型中,Git 仓库不仅是代码存储库,更是整个系统期望状态的权威来源。所有环境(开发、预发、生产)的配置、部署清单、Envoy 路由规则、监听器配置都必须存储在 Git 中。

  • 不可变历史:每一次配置变更都产生一个 Git commit,形成完整的变更时间线。
  • 可审计性:谁、在什么时间、修改了什么配置,通过 Git log 一目了然。
  • 回滚能力:回滚就是执行 git revert 或 git checkout 到上一个 commit,然后由 GitOps 控制器自动应用。
  • 分支策略:通过分支(main/staging/feature)隔离不同环境的配置,避免误操作。
常见陷阱: 如果团队允许“绕过 Git 直接修改集群”(例如通过 kubectl edit 或 Envoy Admin API 热更新),那么 Git 就不再是事实源。这种“配置漂移”是 Envoy 配置冲突和回滚失败的头号原因。GitOps 强制要求:所有变更必须通过 Pull Request 合入 Git 仓库。
Git 单一事实源与集群状态同步 Git 单一事实源与集群状态同步 Git 仓库 单一事实源 开发者 / PR 提交配置变更 GitOps 控制器 持续调和(Reconcile) K8s / Envoy 集群 实际运行状态 核心约束 • 禁止手动修改集群 • 所有变更走 Git PR • 回滚 = git revert

2.3 Pull 模式 vs Push 模式对比

GitOps 的两种主流实现模式决定了控制器如何与集群交互。理解它们的差异,对于设计 Envoy 配置的同步窗口和冲突修复策略至关重要。

2.3.1 Pull 模式(代理式)

Pull 模式是 GitOps 的推荐模式。集群内部运行一个 GitOps 代理(如 Argo CD、Flux),该代理主动从 Git 仓库拉取配置,并与集群当前状态进行对比。如果发现差异,代理自动应用 Git 中的配置来修复集群。

  • 安全性:集群无需对外暴露 API Server,代理只需要出站访问 Git 仓库的权限。
  • 离线容忍:即使 Git 仓库短暂不可用,集群仍保持最后一次同步的状态。
  • 适用场景:生产环境、多集群管理、安全合规要求高的场景。

2.3.2 Push 模式(管道式)

Push 模式由 CI/CD 管道(如 Jenkins、GitHub Actions)触发,管道直接调用集群 API 将配置推送到集群。这种方式更接近传统 CI/CD 流程,但需要集群 API Server 对管道系统开放网络访问。

  • 实时性:CI 完成后立即推送,延迟较低。
  • 风险:管道凭证泄露可能导致集群被直接控制;管道失败可能导致集群状态不一致。
  • 适用场景:开发环境、快速迭代、单集群小规模部署。
对比维度 Pull 模式(推荐) Push 模式
触发方式 集群内代理定时轮询 Git CI/CD 管道主动推送
网络方向 集群出站 → Git CI 入站 → 集群 API
安全风险 低(无需暴露 API) 高(需管理 API 凭证)
状态一致性 持续调和,自动修复漂移 仅推送时保证,后续可能漂移
回滚速度 依赖轮询间隔(通常 1-3 分钟) 依赖管道触发(通常秒级)
Envoy 配置冲突风险 低(单一控制器调和) 高(多个管道可能并发推送)
Pull vs Push 模式架构对比 Pull vs Push 模式架构对比 Pull 模式(推荐) Git 仓库 配置清单 GitOps 代理 (Argo CD / Flux) 主动拉取 K8s 集群 实际状态 调和应用 Push 模式 CI/CD 管道 (Jenkins / Actions) K8s 集群 API Server 主动推送 需管理 API 凭证 无自动漂移修复

2.4 实践建议:选择 Pull 模式并严格约束事实源

SRE 实战建议: 对于 Envoy 配置管理,强烈推荐使用 Pull 模式(如 Argo CD 或 Flux)。原因如下:
1. Envoy 配置冲突往往源于多个 Push 管道并发写入同一个资源。
2. Pull 模式的持续调和机制可以自动修复因手动操作或管道失败导致的配置漂移。
3. 结合 Git 分支保护(禁止直接 push main 分支)和 PR 审批流程,可以确保每一次 Envoy 配置变更都经过审查。