4. GitOps 工作流实战:Application 创建与同步策略

本章是 GitOps 工作流的核心实操环节。你将学习如何在 Argo CD 中创建 Application、配置自动/手动同步策略、管理资源清理(Prune)、以及利用 Sync Waves 和 Hooks 控制部署顺序。这些能力直接决定了生产环境中 GitOps 管道的可靠性与可预测性。

4.1 Application 创建:声明式与 UI 双路径

Argo CD 支持两种创建 Application 的方式:UI 向导(适合快速验证)和 声明式 YAML(适合 GitOps 版本化管理)。生产环境强烈推荐声明式方式。

创建方式 适用场景 核心参数
UI 向导 开发调试、临时测试 应用名称、项目、仓库 URL、目标集群/命名空间、路径
声明式 YAML 生产环境、CI/CD 集成、多环境管理 spec.source.repoURL、spec.destination.server、spec.syncPolicy
最佳实践:将 Application 的 YAML 定义也存放在 Git 仓库中(App of Apps 模式),实现“管理 GitOps 的 GitOps”。

以下是一个声明式 Application 的完整示例,包含自动同步与 Prune 策略:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-production
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://git.company.com/team/my-app.git
    targetRevision: HEAD
    path: k8s/overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: my-app-prod
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
      - CreateNamespace=true
      - PruneLast=true
      - ApplyOutOfSyncOnly=true
  revisionHistoryLimit: 5

4.2 Sync 策略:自动 vs 手动

同步策略决定了 Argo CD 何时以及如何将 Git 仓库中的期望状态应用到目标集群。

  • 自动同步(Automated Sync):当 Git 仓库发生变更(push/tag)时,Argo CD 自动检测差异并执行同步。适合持续交付场景。
  • 手动同步(Manual Sync):需要运维人员通过 UI 或 CLI 手动触发同步。适合变更审批严格、需要人工确认的生产环境。
特性 自动同步 手动同步
触发方式 Git 变更自动触发 人工 UI/CLI 触发
自愈能力 支持(selfHeal: true) 不支持
风险控制 需配合 Prune 策略谨慎使用 完全可控
典型场景 开发/测试环境、CI 流水线 生产环境、变更窗口
注意:自动同步开启 selfHeal: true 后,任何手动 kubectl edit 或直接修改集群资源都会被 Argo CD 立即覆盖回 Git 状态。这是 GitOps 的“单一事实来源”原则,但也意味着集群上的临时调试修改会丢失。

4.3 Prune 策略:资源清理的精细控制

Prune 策略决定了当 Git 仓库中删除某个资源定义时,Argo CD 是否自动从集群中删除对应的资源。错误的 Prune 配置可能导致生产数据丢失。

  • prune: true:自动删除集群中不再存在于 Git 中的资源。必须配合 PruneLast=true 使用,确保先创建新资源再删除旧资源。
  • prune: false:仅同步新增或修改的资源,不删除任何资源。适合数据库、PVC 等有状态服务。
  • syncOptions.PruneLast=true:在同步的最后阶段执行 Prune,避免因删除顺序导致服务中断。
  • syncOptions.PreserveResourcesOnDeletion=true:删除 Application 时保留集群资源,不进行清理。
生产建议:对于关键业务应用,建议在自动同步中设置 prune: false,通过手动触发 Prune 或使用 PreSync Hook 进行安全验证。

4.4 Sync Waves:控制资源部署顺序

Sync Waves 允许你定义资源在同步过程中的部署阶段。每个 Wave 是一个整数(默认 0),数字越小越先部署。同一 Wave 内的资源并行部署,不同 Wave 之间串行等待。

典型的分层部署策略:

  1. Wave -2:部署 CRD(Custom Resource Definitions)和 Namespace
  2. Wave -1:部署 ConfigMap、Secret、ServiceAccount
  3. Wave 0:部署 Deployment、StatefulSet、DaemonSet
  4. Wave 1:部署 Service、Ingress、NetworkPolicy
  5. Wave 2:部署 HPA、PDB、ServiceMonitor
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  annotations:
    argocd.argoproj.io/sync-wave: "0"
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-svc
  annotations:
    argocd.argoproj.io/sync-wave: "1"
调试技巧:使用 argocd app sync my-app --sync-wave 0 可以只同步指定 Wave 的资源,用于分阶段验证。

4.5 Sync Hooks:在同步生命周期中注入自定义逻辑

Sync Hooks 是 Argo CD 提供的强大扩展机制,允许你在同步的不同阶段执行 Job 或 Pod,完成数据库迁移、数据校验、缓存预热等任务。

Hook 类型 执行时机 典型用途
PreSync 同步开始前 数据库 Schema 迁移、备份、健康检查
Sync 同步过程中 自定义资源同步逻辑(较少使用)
PostSync 同步完成后 缓存预热、通知发送、监控指标上报
SyncFail 同步失败时 回滚通知、告警、清理临时资源

以下是一个 PreSync Hook 的示例,用于在部署前执行数据库迁移:

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migration
  annotations:
    argocd.argoproj.io/hook: PreSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
  template:
    spec:
      containers:
      - name: migration
        image: my-app-migration:1.0
        command: ["/bin/sh", "-c", "flyway migrate"]
      restartPolicy: Never
  backoffLimit: 2
关键约束:Hook Job 默认在 60 秒内未完成会被视为失败。可通过 argocd.argoproj.io/sync-wave 注解将 Hook 分配到特定 Wave,实现更精细的执行顺序控制。Hook 失败会导致整个同步失败,除非设置 argocd.argoproj.io/hook-fail-policy: Ignore。

4.6 完整工作流:从 Git 提交到生产部署

下图展示了结合 Sync Waves 和 Hooks 的完整 GitOps 部署流程:

GitOps 同步工作流:Waves + Hooks 执行顺序 PreSync Hook 数据库迁移 / 备份 Wave -2 CRD / Namespace Wave -1 ConfigMap / Secret Wave 0 Deployment / StatefulSet Wave 1 Service / Ingress Wave 2 HPA / PDB / Monitor PostSync Hook 缓存预热 / 通知 说明:同一 Wave 内的资源并行部署;不同 Wave 之间串行等待;Hook 在 Wave 执行前后触发

4.7 压测沙盘中的关键验证点

在配额压测沙盘中,你需要重点验证以下 GitOps 工作流场景:

  • 大规模 Wave 并发:当单个 Application 包含 50+ 资源分布在 5 个 Wave 中时,Argo CD 的调度性能是否稳定。
  • Hook 超时与重试:模拟 PreSync Hook 执行超时(超过 60s),验证 SyncFail Hook 是否正确触发回滚逻辑。
  • Prune 风暴:在 Git 中一次性删除 20 个资源,观察 Argo CD 的 Prune 执行顺序和集群资源清理效率。
  • 自动同步延迟:测量从 Git push 到 Argo CD 检测到差异并开始同步的端到端延迟(正常应 < 30s)。
压测指标参考:在 100 个 Application 并发同步的场景下,Argo CD API Server 的 P99 响应时间应 < 500ms,Controller 的同步队列积压应 < 200 个任务。