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 之间串行等待。
典型的分层部署策略:
- Wave -2:部署 CRD(Custom Resource Definitions)和 Namespace
- Wave -1:部署 ConfigMap、Secret、ServiceAccount
- Wave 0:部署 Deployment、StatefulSet、DaemonSet
- Wave 1:部署 Service、Ingress、NetworkPolicy
- 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 部署流程:
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 个任务。