3. Argo CD 核心概念:Application、Project、Sync Policy、Sync Wave、Hook 机制详解

Argo CD 作为声明式 GitOps 引擎,其核心抽象模型围绕 Application(应用)、Project(项目)、Sync Policy(同步策略)、Sync Wave(同步波次)和 Hook(钩子)构建。理解这五个概念是掌握 Argo CD 平台工程能力的基础。

3.1 Application:GitOps 的最小部署单元

Application 是 Argo CD 中最核心的 CRD(Custom Resource Definition),它定义了“从哪个 Git 仓库拉取什么清单”以及“部署到哪个目标集群/命名空间”。

字段 说明 示例值
spec.source.repoURL Git 仓库地址 https://github.com/example/app-config.git
spec.source.path 仓库内清单目录路径 environments/prod
spec.destination.server 目标 Kubernetes API Server 地址 https://kubernetes.default.svc
spec.destination.namespace 目标命名空间 production
spec.project 所属 Project 名称 default
关键原则:Application 遵循“声明式最终一致”模型。Argo CD 持续对比 Git 中的期望状态与集群中的实时状态,当出现偏差时,根据同步策略自动或手动纠正。

3.2 Project:多租户隔离与权限边界

Project 是 Argo CD 实现多租户隔离的顶层逻辑分组。一个 Project 可以包含多个 Application,并统一约束其行为。

  • 源仓库白名单:限制 Application 只能从指定的 Git 仓库拉取清单。
  • 目标集群/命名空间白名单:限制 Application 只能部署到特定的集群和命名空间。
  • 资源类型黑名单/白名单:控制 Project 内允许或禁止创建的 Kubernetes 资源类型(如禁止创建 ClusterRole)。
  • 同步窗口:定义允许或禁止自动同步的时间段。
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: platform-team
spec:
  sourceRepos:
  - 'https://github.com/platform-*'
  destinations:
  - namespace: 'team-*'
    server: 'https://kubernetes.default.svc'
  clusterResourceWhitelist:
  - group: ''
    kind: 'Namespace'
  - group: 'rbac.authorization.k8s.io'
    kind: 'ClusterRole'

3.3 Sync Policy:同步行为的自动化控制

Sync Policy 定义了 Application 在检测到 Git 与集群状态不一致时的响应行为。它分为自动同步和手动同步两种模式。

策略类型 子选项 行为描述
自动同步 prune: true 自动删除集群中 Git 中已不存在的资源
selfHeal: true 自动修复集群中被手动修改的资源,使其回归 Git 状态
allowEmpty: true 允许 Git 目录为空时清空目标命名空间
手动同步 — 仅当用户通过 UI/CLI 触发时执行同步,适合生产环境审批流程
平台工程建议:生产环境推荐使用手动同步 + 自动自愈(selfHeal: true),既保留人工审批环节,又能防止集群状态被意外篡改。

3.4 Sync Wave:资源部署的顺序编排

Sync Wave 解决了 Kubernetes 资源部署时的依赖顺序问题。Argo CD 允许为每个资源设置 argocd.argoproj.io/sync-wave 注解,数值越小,部署优先级越高。

Sync Wave 执行顺序示意图 Wave -2 CRD / 命名空间 Wave -1 ServiceAccount / RBAC Wave 0 ConfigMap / Secret Wave 1 Deployment / StatefulSet Wave 2 Service / Ingress Wave 3 HPA / PDB 执行规则 同一 Wave 内资源并行部署 不同 Wave 按数值升序串行执行
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  annotations:
    argocd.argoproj.io/sync-wave: "1"   # 在 ConfigMap 之后部署
spec:
  ...
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  annotations:
    argocd.argoproj.io/sync-wave: "0"   # 优先部署
data:
  ...

3.5 Hook 机制:同步生命周期的精细化干预

Hook 允许在同步流程的特定阶段执行 Job 或 Pod,用于完成数据库迁移、预检查、通知等任务。Argo CD 通过资源注解 argocd.argoproj.io/hook 来识别 Hook 资源。

Hook 类型 触发时机 典型用途
PreSync 在 Sync Wave 执行之前 数据库 Schema 校验、前置依赖检查
Sync 在 Sync Wave 执行期间 执行数据迁移脚本、初始化缓存
PostSync 在所有 Sync Wave 执行完成后 发送部署通知、更新 CMDB、触发集成测试
SyncFail 同步失败时 回滚数据库、发送告警、清理临时资源
Hook 在同步生命周期中的位置 同步开始 PreSync Hook 前置检查 Sync Wave 资源部署 PostSync Hook 通知/测试 SyncFail Hook 回滚/告警 同步失败
apiVersion: batch/v1
kind: Job
metadata:
  name: db-migration
  annotations:
    argocd.argoproj.io/hook: PreSync          # 在同步前执行
    argocd.argoproj.io/hook-delete-policy: HookSucceeded  # 成功后自动删除 Job
spec:
  template:
    spec:
      containers:
      - name: migration
        image: myapp/migration:latest
        command: ["/bin/sh", "-c", "flyway migrate"]
      restartPolicy: Never
注意事项:Hook 资源默认不会出现在 Application 的最终状态中。如果 Hook 执行失败,Argo CD 会阻止后续同步流程。建议为关键 Hook 设置合理的超时和重试机制。

3.6 概念关系总结