4. GitOps 工作流基础:Git 作为单一事实来源、声明式配置、Pull 机制与 Push 机制对比

GitOps 的核心思想是将 Git 仓库作为整个系统的单一事实来源,所有环境状态(基础设施、应用配置、网络策略)都通过声明式配置定义在 Git 中,并通过自动化机制确保实际运行环境与 Git 中的期望状态保持一致。本章将拆解这三个基础支柱,并重点对比 Pull 与 Push 两种同步机制。

4.1 Git 作为单一事实来源

在传统运维模式中,配置分散在 CI/CD 脚本、运维工具、人工操作和监控系统中,一旦出现配置漂移,很难追溯根因。GitOps 要求所有环境状态都集中存储在 Git 仓库中,形成唯一的权威参考点。

特性 传统模式 GitOps 模式
配置存储 分散在多个系统、脚本、人工操作中 集中存储在 Git 仓库
变更追溯 依赖操作日志、聊天记录、记忆 完整的 Git 提交历史,可回滚到任意版本
权限控制 系统级权限,难以细粒度审计 基于 Git 仓库的 PR 审批、分支保护
状态一致性 容易发生配置漂移 持续协调,自动修复漂移
实践要点:单一事实来源并不意味着所有配置都放在一个仓库中。推荐按环境(dev/staging/prod)或按领域(网络/安全/应用)拆分仓库,但每个仓库内部必须保持自包含和可复现。

4.2 声明式配置

声明式配置是 GitOps 的第二个支柱。与命令式(Imperative)配置不同,声明式只描述“最终状态是什么”,而不描述“如何到达这个状态”。Envoy 的 xDS 协议天然支持声明式配置,Envoy 代理只关心最终的路由、监听器、集群配置,而不关心这些配置是如何生成的。

对比维度 命令式配置 声明式配置
操作方式 执行一系列步骤(kubectl run、kubectl scale) 提交期望状态文件(kubectl apply -f)
幂等性 非幂等,重复执行可能产生不同结果 幂等,重复 apply 结果一致
漂移检测 需要额外工具对比 天然支持,持续协调
Envoy 场景 手动调用 POST /config_dump 或重启 通过 xDS 推送期望的监听器/路由/集群
# 声明式 Envoy 配置示例(简化版)
# 期望状态:监听 8080 端口,将流量路由到 backend 集群
static_resources:
  listeners:
  - name: listener_8080
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: backend_service }
          http_filters:
          - name: envoy.filters.http.router
  clusters:
  - name: backend_service
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: backend_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: backend.example.com, port_value: 80 }

4.3 Pull 机制与 Push 机制对比

GitOps 工作流中,将 Git 中的期望状态同步到实际运行环境有两种主流机制:Push 机制和Pull 机制。理解两者的差异对于设计可靠的自动化验证方案至关重要。

4.3.1 Push 机制

Push 机制由 CI/CD 管道主动将配置“推送”到目标环境。典型的流程是:开发人员提交代码 → CI 构建 → CD 工具(如 Jenkins、GitHub Actions)直接调用 Kubernetes API 或 Envoy 管理接口应用配置。

  • 优点:流程直观,与现有 CI/CD 工具链集成简单。
  • 缺点:CI/CD 工具需要直接访问目标集群的 API;如果网络隔离或权限不足,推送可能失败;缺少持续协调能力,一旦推送完成后环境被手动修改,不会自动修复。

4.3.2 Pull 机制

Pull 机制由运行在目标环境中的 Operator 或 Agent 主动从 Git 仓库拉取配置。典型的实现是 Argo CD 或 Flux,它们在集群内部运行,持续监控 Git 仓库的变化,并将期望状态应用到集群。

  • 优点:Agent 在集群内部运行,无需外部 CI/CD 工具直接访问集群 API;天然支持持续协调,自动修复配置漂移;安全性更高,集群无需对外暴露管理端口。
  • 缺点:需要额外部署和维护 Operator;初次配置相对复杂。
关键区别:Push 机制是“事件驱动”的(CI 完成后推送一次),Pull 机制是“状态驱动”的(持续对比 Git 和实际状态,不断协调)。对于 Envoy 配置热更新场景,Pull 机制能更好地保证配置一致性,尤其是在多集群或边缘部署场景中。
Pull 机制 vs Push 机制对比 Push 机制 开发人员提交代码到 Git CI/CD 管道触发构建 主动推送配置到目标环境 一次性应用,无持续协调 Pull 机制 开发人员提交代码到 Git 集群内 Operator 监控 Git 主动从 Git 拉取期望状态 持续协调,自动修复漂移

4.4 选择建议:Envoy 配置热更新场景

在 Envoy 配置热更新自动化验证的课程场景中,我们推荐使用 Pull 机制,原因如下:

场景需求 Push 机制支持 Pull 机制支持
配置漂移自动修复 不支持 ✅ 持续协调
多集群统一管理 需要为每个集群配置 CI/CD ✅ 一个 Git 仓库管理所有集群
Envoy xDS 热更新 需要额外触发机制 ✅ Operator 自动触发
安全合规(最小权限) CI/CD 需要集群 API 访问权限 ✅ Operator 在集群内部运行
自动化验证集成 需要单独编写验证脚本 ✅ 可在同步窗口内自动验证
注意:Pull 机制虽然优势明显,但并非银弹。在需要紧急热修复的场景下,Push 机制可以绕过 Git 审批流程直接生效。生产环境中建议采用混合模式:日常变更走 Pull 机制,紧急变更走 Push 机制并事后补录 Git。
GitOps 工作流整体架构 Git 仓库 单一事实来源 声明式配置 Pull 机制 Operator 主动拉取 Push 机制 CI/CD 主动推送 目标环境(Kubernetes / Envoy 集群) 持续协调 → 配置热更新 → 自动化验证

4.5 本章小结