1. GitOps 基础概念:声明式部署、Git 作为单一事实来源、Pull vs Push 模式对比

GitOps 是一种以 Git 仓库为运维中心的云原生部署与运维模式。它将声明式配置、版本控制与自动化交付管道结合,使基础设施和应用状态始终与 Git 仓库中的期望状态保持一致。本节从三个核心维度拆解 GitOps 的基础概念。

1.1 声明式部署:描述“要什么”,而非“怎么做”

声明式部署的核心思想是:运维人员只需在配置文件中描述系统的期望状态(Desired State),由自动化工具负责将实际状态(Actual State)收敛至期望状态。这与传统的命令式部署(Imperative Deployment)形成鲜明对比。

对比维度 命令式部署 声明式部署(GitOps)
操作方式 执行具体命令(如 kubectl run、kubectl scale) 提交 YAML 清单到 Git,由控制器自动同步
状态管理 依赖操作者记忆或脚本顺序 Git 仓库始终保存完整期望状态
回滚方式 手动执行反向操作或重新运行旧脚本 git revert 后自动同步
可审计性 操作日志分散,难以追溯 每次变更都有 Git commit 记录
典型工具 kubectl、Helm CLI Argo CD、Flux CD
实践要点:声明式部署要求所有 Kubernetes 资源(Deployment、Service、ConfigMap 等)都以 YAML 形式存在于 Git 仓库中。任何手动 kubectl edit 或 kubectl patch 操作都会导致实际状态与 Git 仓库不一致,被 GitOps 控制器视为“漂移”并自动纠正。

1.2 Git 作为单一事实来源

在 GitOps 体系中,Git 仓库不仅是代码存储库,更是整个系统的单一事实来源(Single Source of Truth)。所有环境(开发、预发布、生产)的期望状态都定义在 Git 仓库中,且只有 Git 仓库中的配置被视为权威。

Git 作为单一事实来源:状态流转模型 Git 仓库 期望状态(Desired State) 读取期望状态 GitOps 控制器 同步/调和 Kubernetes 集群 实际状态(Actual State) 状态反馈 漂移检测 → 自动纠正 手动变更 → 被覆盖
关键原则:Git 仓库中的配置是唯一可信的期望状态。任何对 Kubernetes 集群的手动修改都会被 GitOps 控制器检测为“配置漂移”,并在下一次同步周期中被自动覆盖回 Git 中定义的状态。这确保了环境的一致性和可复现性。

1.3 Pull vs Push 模式对比

GitOps 的部署模式分为 Pull 模式和 Push 模式,两者在部署触发方式、安全模型和适用场景上存在显著差异。

Push 模式(传统 CI/CD)

CI/CD 管道(如 Jenkins、GitLab CI)在构建完成后,主动将应用推送至目标 Kubernetes 集群。管道需要持有集群的访问凭证,通常通过 kubectl 或 Helm 客户端直接操作。

Pull 模式(GitOps 原生)

GitOps 控制器(如 Argo CD、Flux)运行在目标集群内部,主动从 Git 仓库拉取配置并同步到集群。CI 管道只需将镜像推送至镜像仓库并更新 Git 仓库中的清单文件,无需直接访问 Kubernetes 集群。

对比维度 Push 模式 Pull 模式(GitOps)
部署触发 CI 管道主动推送 控制器主动拉取
集群凭证 CI 系统持有(安全风险高) 集群内部持有(安全风险低)
网络要求 CI 系统需访问集群 API 集群需访问 Git 仓库(通常更易满足)
漂移检测 无内置机制 内置持续调和(Reconciliation)
回滚操作 重新运行旧管道或手动执行 git revert + 自动同步
多集群管理 需为每个集群配置独立管道 一个 Git 仓库管理多个集群
Pull vs Push 模式架构对比 Push 模式 CI 管道 K8s 集群 凭证外泄风险高 Pull 模式 Git 仓库 控制器 K8s 集群 凭证在集群内部,安全可控 核心差异:Push 模式由外部系统触发部署,Pull 模式由集群内部控制器触发同步 GitOps 推荐 Pull 模式,可显著降低凭证泄露风险并增强集群自愈能力
生产环境建议:在生产环境中,优先采用 Pull 模式部署 GitOps。如果网络限制导致集群无法直接访问 Git 仓库,可考虑在集群内部署 Git 仓库代理或使用 Git 仓库的只读镜像。避免为了短期便利而采用 Push 模式,否则将丧失 GitOps 的核心安全优势。

1.4 三者关系总结

声明式部署、Git 作为单一事实来源、Pull 模式三者共同构成了 GitOps 的三角基石:

  • 声明式部署提供了配置的表达方式(YAML 清单),使系统状态可描述、可版本化。
  • Git 作为单一事实来源提供了配置的存储与版本管理机制,确保所有变更可追溯、可审计。
  • Pull 模式提供了部署的执行模型,使集群具备自愈能力,无需外部系统直接介入。