3. GitOps 工作流:声明式配置、Git 作为单一事实来源、自动同步与手动审批模式对比

GitOps 的核心是将运维与交付的“期望状态”全部声明在 Git 仓库中,并通过自动化机制使运行环境持续趋近该状态。本章从三个维度拆解 GitOps 工作流:声明式配置的语义、Git 作为单一事实来源的约束力,以及自动同步与手动审批两种模式的适用场景与风险。

3.1 声明式配置:描述“要什么”,而非“怎么做”

声明式配置只定义目标状态,由控制器负责调和。Kubernetes 原生资源(Deployment、Service、ConfigMap)本身就是声明式的最佳载体。

关键区别: 命令式(kubectl run / apply --edit-last-applied)依赖操作者的执行顺序和上下文;声明式(kubectl apply -f dir/)只提交最终期望,控制器自动计算差异并执行调和。
# 声明式示例:期望运行 3 个 nginx 副本,镜像版本 1.25
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-stable
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
特性 命令式 声明式
操作对象 运行时资源 Git 仓库中的 YAML/JSON
幂等性 依赖操作顺序,易产生漂移 天然幂等,重复 apply 结果一致
审计追溯 依赖操作日志,不完整 Git commit 即完整变更记录
回滚 手动执行反向操作 git revert + 自动同步

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

在 GitOps 模型中,Git 仓库是唯一被信任的期望状态定义。任何对集群的手动修改(kubectl edit、helm upgrade --install 绕过 Git)都会被视为“配置漂移”,并被 GitOps 控制器自动覆盖或告警。

实践原则: 所有环境(dev/staging/prod)的配置必须从 Git 仓库派生。禁止直接修改集群资源;如需紧急修复,先提交 Git PR,再通过自动或手动同步生效。
Git 作为单一事实来源 — 配置流向 Git 仓库 期望状态(YAML/Helm/Kustomize) 开发者提交 PR CI 校验 + 构建 GitOps 控制器 ArgoCD / Flux Kubernetes 集群 实际运行状态 状态反馈(健康/漂移) ⚠ 手动修改 → 漂移告警

3.3 自动同步模式:持续调和,零人工干预

自动同步模式下,GitOps 控制器持续监控 Git 仓库,一旦检测到新的 commit(或 PR merge),立即将变更应用到目标集群。适用于开发环境、非关键业务、需要快速迭代的场景。

  • 优点: 部署速度快(秒级到分钟级);减少人为操作失误;环境一致性高。
  • 风险: 错误配置会直接扩散到生产;缺少变更审批环节;回滚依赖 Git revert 速度。
  • 典型工具: Flux v2 默认启用自动同步;ArgoCD 可配置 syncPolicy.automated。
# ArgoCD Application 自动同步配置示例
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-prod
spec:
  source:
    repoURL: https://github.com/team/gitops-config.git
    path: overlays/prod
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: prod
  syncPolicy:
    automated:
      prune: true       # 自动清理 Git 中已删除的资源
      selfHeal: true    # 自动修复集群中的手动漂移
    syncOptions:
    - CreateNamespace=true

3.4 手动审批模式:变更闸门,安全优先

手动审批模式下,GitOps 控制器只负责检测 Git 仓库与集群的差异,但不会自动应用变更。运维或审批人通过 UI 或 CLI 确认后,才执行同步。适用于生产环境、合规敏感业务、多租户场景。

  • 优点: 变更可审查、可暂停、可回滚;支持灰度发布前的最终确认;满足审计与合规要求。
  • 代价: 部署速度变慢;需要人工值守;审批流程可能成为瓶颈。
  • 典型实践: ArgoCD 关闭 automated,使用 argocd app sync 或 UI 手动同步;Flux 使用 --suspend 暂停调和。
常见误区: 手动审批 ≠ 手动修改集群。审批只控制“何时同步”,配置变更仍然必须通过 Git PR 提交。任何绕过 Git 的集群修改都会破坏单一事实来源。

3.5 两种模式对比与选择策略

维度 自动同步 手动审批
变更生效速度 秒级~分钟级 分钟级~小时级(依赖审批)
人工介入点 仅 PR 审查 PR 审查 + 同步审批
配置漂移处理 自动覆盖(selfHeal) 告警 + 人工决定是否覆盖
适用环境 dev、staging、非关键业务 prod、合规环境、客户敏感数据
回滚速度 快(git revert 后自动同步) 中(git revert + 手动同步)
工具推荐 Flux v2(默认自动) ArgoCD(关闭 automated)
自动同步 vs 手动审批 — 工作流对比 自动同步流程 ① 开发者提交 PR → Merge ② GitOps 控制器检测到新 commit ③ 自动执行 diff → apply → prune ④ 集群状态与 Git 完全一致 手动审批流程 ① 开发者提交 PR → Merge ② 控制器检测差异,但 不自动同步 ③ 审批人审查 diff → 点击 Sync ④ 执行同步,集群状态对齐 Git 💡 两种模式可混合使用:dev 自动同步,prod 手动审批,共用同一 Git 仓库

3.6 混合模式与准入检查的衔接

实际生产环境中,推荐采用混合模式:非关键环境使用自动同步加速迭代,生产环境使用手动审批并配合准入检查(Admission Webhook)做最后一道防线。准入检查可以在同步前验证配置的合规性(如镜像来源、资源配额、Pod 安全策略),即使审批人误操作,也能被策略拦截。