GitOps 基础:声明式配置与期望状态、Git 作为单一事实来源、Pull vs Push 模式对比

GitOps 是一种以 Git 仓库为单一事实来源(Single Source of Truth)的云原生运维模式。其核心思想是将声明式配置与自动化协调循环相结合,确保集群的实际运行状态始终与 Git 仓库中定义的期望状态保持一致。理解声明式配置、期望状态、Git 仓库角色以及 Pull/Push 模式的差异,是掌握 GitOps 回滚与审计机制的前提。

2.1 声明式配置与期望状态

在传统运维中,我们通常使用命令式操作:手动执行 kubectl run、kubectl scale 等指令,直接告诉系统“做什么”。这种方式依赖操作者的经验,难以追溯变更历史,且容易因人为失误导致配置漂移。

GitOps 采用声明式配置:你只需在 Git 仓库中定义应用的期望状态(Desired State),例如 Deployment 的副本数、镜像版本、Service 端口等。GitOps Operator 会自动将集群的实际状态向期望状态收敛。

关键区别:
  • 命令式:“将副本数扩展到 5 个”(操作指令,无持久化记录)。
  • 声明式:“Deployment 的 replicas: 5”(期望状态,存储在 Git 中)。

声明式配置的优势在于:

  • 可审计:每次变更都对应一次 Git Commit,形成完整的变更时间线。
  • 可回滚:只需将 Git 仓库回退到上一个 Commit,Operator 会自动将集群状态还原。
  • 可复现:任何环境(开发、测试、生产)都可以从同一个 Git 仓库重建出完全一致的集群状态。

2.2 Git 作为单一事实来源

在 GitOps 体系中,Git 仓库不再仅仅是代码托管平台,而是整个集群配置的权威数据源。所有对集群的变更——无论是应用部署、配置更新还是基础设施调整——都必须先提交到 Git 仓库,再由自动化流程同步到集群。

Git 仓库中通常包含以下内容:

配置类型 示例文件 说明
应用部署清单 deployment.yaml 定义 Pod 模板、副本数、资源限制等
服务与网络配置 service.yaml, ingress.yaml 定义服务暴露方式与流量路由规则
配置与密钥 configmap.yaml, secret.yaml 应用配置与敏感信息(Secret 建议加密存储)
基础设施定义 namespace.yaml, rbac.yaml 集群级别的资源定义
Kustomize / Helm 模板 kustomization.yaml, Chart.yaml 用于参数化与多环境管理
实践要点:Git 仓库应遵循“环境即分支”或“环境即目录”的策略。例如,main 分支对应生产环境,dev 分支对应开发环境。所有变更必须通过 Pull Request 合并,并触发 CI 流水线进行合规检查与预演。

Git 作为单一事实来源的核心价值在于:

  • 一致性:无论集群发生何种漂移,Operator 都会以 Git 中的配置为准进行修复。
  • 可追溯:每一次变更都关联到具体的 Commit、作者、时间戳和变更说明。
  • 安全:通过 Git 的权限控制(分支保护、签名验证)和审计日志,确保只有授权变更才能生效。

2.3 Pull vs Push 模式对比

GitOps 的实现模式主要分为两种:Push 模式和Pull 模式。两者的核心区别在于谁主动触发同步操作。

2.3.1 Push 模式(传统 CI/CD)

在 Push 模式中,CI/CD 工具(如 Jenkins、GitLab CI)在检测到 Git 仓库变更后,主动将配置推送到目标集群。这种模式是传统持续部署的常见做法。

  • 优点:部署流程直观,易于与现有 CI 流水线集成。
  • 缺点:CI/CD 工具需要持有集群的访问凭证,存在安全风险;集群状态变更不经过 Git 仓库,容易产生配置漂移;回滚时需要手动触发新的流水线。

2.3.2 Pull 模式(GitOps 标准模式)

在 Pull 模式中,集群内部运行一个Operator(如 Argo CD、Flux),它会定期从 Git 仓库拉取配置并与集群当前状态进行比较。如果发现差异,Operator 会自动将集群状态调整到 Git 中定义的期望状态。

  • 优点:集群无需对外暴露 API Server 凭证;变更必须经过 Git 仓库,天然防止配置漂移;回滚只需在 Git 中 revert Commit,Operator 自动执行。
  • 缺点:需要额外部署和维护 Operator;同步存在一定延迟(通常为 1-3 分钟)。

以下表格总结了两种模式的关键差异:

对比维度 Push 模式(传统 CI/CD) Pull 模式(GitOps 标准)
触发方式 CI/CD 工具主动推送 集群内 Operator 主动拉取
凭证管理 CI/CD 工具持有集群凭证 集群内 Operator 持有 Git 只读凭证
配置漂移防护 弱(手动操作可绕过 Git) 强(Operator 持续修复漂移)
回滚操作 手动触发新流水线 Git revert → 自动同步
审计留痕 依赖 CI/CD 日志 Git Commit 即为审计记录
网络要求 CI/CD 需访问集群 API 集群需访问 Git 仓库
安全提示:在生产环境中,强烈推荐使用 Pull 模式。Push 模式要求 CI/CD 工具持有集群管理员凭证,一旦 CI/CD 系统被攻破,攻击者可以直接控制整个集群。Pull 模式将凭证限制在集群内部,且 Operator 通常只具备 Git 仓库的只读权限,大幅降低了攻击面。

2.4 GitOps 协调循环示意图

下图展示了 Pull 模式下 GitOps 的核心协调循环:Operator 持续对比 Git 仓库中的期望状态与集群的实际状态,并自动修复漂移。

GitOps Pull 模式协调循环 GitOps Pull 模式协调循环 Git 仓库 期望状态(YAML) 拉取配置 GitOps Operator (Argo CD / Flux) 同步/修复 Kubernetes 集群 实际状态 持续对比(检测漂移) 协调循环说明 1. Operator 定期从 Git 仓库拉取期望状态配置。 2. Operator 将期望状态与集群当前实际状态进行对比。 3. 如果发现差异(漂移),Operator 自动执行同步操作,将集群状态修复到期望状态。

2.5 Push 与 Pull 模式架构对比图

为了更直观地理解两种模式的架构差异,下图展示了 Push 模式(左)与 Pull 模式(右)的组件关系与数据流向。

Push vs Pull 模式架构对比 Push vs Pull 模式架构对比 Push 模式(传统 CI/CD) Git 仓库 代码 + 配置 CI/CD 工具 (Jenkins / GitLab CI) 推送(需凭证) Kubernetes 集群 实际状态 Pull 模式(GitOps 标准) Git 仓库 期望状态 拉取(只读) GitOps Operator (Argo CD / Flux) 同步(内部) Kubernetes 集群 实际状态 漂移检测 Push 模式:CI/CD 工具主动推送配置到集群,需持有集群凭证。Pull 模式:Operator 在集群内部运行,主动拉取 Git 配置,凭证风险更低。

2.6 本章小结

  • 声明式配置是 GitOps 的基石,它将运维从“操作指令”转变为“状态定义”,使得配置可审计、可回滚、可复现。
  • Git 作为单一事实来源,确保所有集群变更都有据可查,任何漂移都能被自动修复。
  • Pull 模式是 GitOps 的标准实现方式,相比 Push 模式具有更高的安全性和更强的漂移防护能力。
  • 在后续章节中,我们将基于 Pull 模式深入探讨如何实现配置变更的回滚验证与审计留痕。