3. GitOps 工作流:声明式配置、Git 仓库作为单一事实来源、Operator 模式(ArgoCD/Flux)

GitOps 的核心是将运维与部署的“期望状态”全部声明在 Git 仓库中,并通过自动化 Operator 持续调和集群实际状态。本章拆解 GitOps 工作流的三大支柱:声明式配置、单一事实来源、Operator 模式,并对比 ArgoCD 与 Flux 的实现差异。

3.1 声明式配置:从“如何做”到“要什么”

传统运维依赖脚本或命令式指令(kubectl run、helm install),而 GitOps 要求所有资源以 YAML/JSON 声明文件形式存在。声明式配置具备以下特征:

  • 幂等性:同一份声明反复应用,结果始终一致。
  • 可审计:每次变更都对应 Git commit,可追溯、可回滚。
  • 可版本化:声明文件与代码分支、标签绑定,支持环境隔离。
对比维度 命令式(Imperative) 声明式(Declarative)
操作方式 执行命令/脚本,逐步操作 提交期望状态文件,自动调和
状态管理 依赖操作者记忆或外部状态库 Git 仓库始终是权威状态
回滚复杂度 需逆向执行或手动恢复 git revert + Operator 自动同步
典型工具 kubectl run/delete, helm upgrade --reuse-values ArgoCD Application, Flux Kustomization
关键原则:声明式配置必须完整描述目标状态,不依赖集群当前状态。例如 Deployment 必须包含 replicas、image、ports 等全部字段,Operator 不会自动补全缺失值。

3.2 Git 仓库作为单一事实来源(Single Source of Truth)

在 GitOps 模型中,Git 仓库不仅是代码存储,更是整个系统的“期望状态数据库”。所有环境(开发、预发、生产)的配置都集中管理,Operator 持续对比 Git 中的声明与集群实际状态。

单一事实来源带来的核心收益:

  • 一致性:所有集群从同一份配置派生,消除环境漂移。
  • 可复现:任何时间点的集群状态都可以通过 checkout 对应 commit 重建。
  • 权限收敛:只有 Git 仓库的写入权限能改变生产配置,集群凭证无需暴露给开发者。
Git 仓库作为单一事实来源 — 配置流向图 Git 仓库 单一事实来源 开发者提交 PR 声明式 YAML 变更 GitOps Operator ArgoCD / Flux Kubernetes 集群 实际状态 git revert 触发回滚 Git 仓库是唯一写入入口:任何集群状态的永久变更都必须通过 Git commit 发起

3.3 Operator 模式:ArgoCD 与 Flux 的调和循环

Operator 模式是 GitOps 的执行引擎。Operator 是一个运行在集群内的控制器,持续执行“读取期望状态 → 对比实际状态 → 执行调和操作”的循环。ArgoCD 和 Flux 是目前最主流的两个实现。

3.3.1 调和循环(Reconciliation Loop)

  1. Poll / Webhook:定期轮询 Git 仓库或接收 Webhook 通知。
  2. Diff:对比 Git 中的声明式配置与集群当前资源状态。
  3. Apply / Prune:创建、更新或删除资源使集群对齐期望状态。
  4. Health Check:验证资源是否达到就绪状态(如 Deployment 的 Available 条件)。
  5. Report:将同步结果写回状态字段或外部监控系统。
Operator 调和循环(Reconciliation Loop) 1. 读取期望状态 Git 仓库 / OCI 制品 2. 对比差异 期望 vs 实际 3. 执行调和 Apply / Prune 4. 健康检查 资源就绪验证 持续循环(默认 3 分钟轮询)

3.3.2 ArgoCD vs Flux:核心差异

对比维度 ArgoCD Flux
架构模式 Pull-based + 可选 Push Pull-based(专注 Git 驱动)
配置源 Git 仓库、Helm Chart、Kustomize、OCI Git 仓库、Helm Chart、OCI、Bucket
同步策略 自动同步 + 手动同步 + 同步窗口 自动同步 + 手动同步 + 暂停/恢复
回滚能力 内置回滚 UI/CLI,保留历史 依赖 git revert 或 Flux 自动回滚
多集群管理 原生支持(ApplicationSet) 通过 Kustomize 或 Cluster API
安全模型 RBAC + SSO + 项目隔离 RBAC + 多租户(Tenancy)
选型建议:如果团队需要丰富的 UI 界面、多集群管理和细粒度同步窗口控制,ArgoCD 更合适;如果追求轻量、纯 Git 驱动、与 Kubernetes 原生 CRD 深度集成,Flux 是更简洁的选择。

3.4 声明式配置示例:ArgoCD Application

以下是一个完整的 ArgoCD Application 声明,展示如何将 Git 仓库中的配置同步到目标集群:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: production-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/team/production-config.git
    targetRevision: main
    path: overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true
  syncWindow:
    kind: "deny"
    schedule: "0 0 * * *"
    duration: "8h"
    applications:
      - "production-app"
注意:syncWindow 字段是本章后续 DNS 故障回滚设计的核心。通过定义拒绝同步窗口,可以防止在 DNS 故障期间 Operator 自动执行破坏性变更。具体窗口策略将在第 5 章详细展开。

3.5 本章小结

  • GitOps 工作流以声明式配置为基础,消除命令式运维的不可预测性。
  • Git 仓库作为单一事实来源,确保所有环境配置可追溯、可复现、可回滚。
  • Operator 模式(ArgoCD/Flux)通过持续调和循环,自动将集群实际状态对齐 Git 期望状态。
  • ArgoCD 和 Flux 在架构、同步策略、回滚能力上各有侧重,选择需结合团队运维习惯和基础设施规模。