3. Argo CD 核心概念:声明式GitOps、Application与AppProject、Sync策略与钩子
Argo CD 是 Kubernetes 生态中最成熟的声明式 GitOps 工具。理解其三大核心概念——声明式 GitOps 模型、Application 与 AppProject 资源模型、Sync 策略与钩子——是构建平台工程自助目录的基础。本章将逐一拆解这些概念,并展示它们如何在集成实践中协同工作。
3.1 声明式 GitOps:以 Git 为单一事实来源
声明式 GitOps 的核心思想是:将 Git 仓库中的期望状态作为系统配置的唯一权威来源。Argo CD 持续监控 Git 仓库中的 Kubernetes 清单(YAML/JSON/Helm/Kustomize),一旦发现集群实际状态与 Git 中的期望状态存在偏差,便自动或手动执行同步操作,使集群状态收敛至期望状态。
- 声明式描述:所有基础设施和应用配置都以声明式清单形式存储在 Git 中。
- 持续监控与调和:Argo CD 持续对比 Git 状态与集群状态,自动检测漂移。
- 自动/手动同步:通过 Sync 操作将集群状态拉回 Git 定义的期望状态。
- 可审计与可回滚:每次同步都对应一次 Git 提交,支持一键回滚到任意历史版本。
3.2 Application 与 AppProject:资源模型与多租户隔离
Argo CD 通过两个核心 CRD(Custom Resource Definition)来管理应用和租户边界:Application 和 AppProject。
3.2.1 Application:单个应用的完整定义
一个 Application 资源定义了从 Git 到集群的完整映射关系,包括:
- 源(Source):Git 仓库 URL、目标路径、分支/标签、Helm Values 或 Kustomize 参数。
- 目标(Destination):目标集群(可通过 API Server URL 或集群名称指定)和命名空间。
- 同步策略(Sync Policy):自动/手动、自动修剪(Prune)、自愈(Self-Heal)。
- 同步选项(Sync Options):如 Validate、Prune Last、Replace 等。
3.2.2 AppProject:多租户隔离与安全边界
AppProject 是 Argo CD 中实现多租户隔离的核心机制。一个 Project 可以包含多个 Application,并定义:
| 配置项 | 说明 | 典型值 |
|---|---|---|
| 源仓库白名单 | 允许该 Project 下的 Application 从哪些 Git 仓库拉取清单 | https://github.com/my-org/* |
| 目标集群白名单 | 允许部署到哪些集群和命名空间 | https://k8s-prod.example.com:6443, namespace: prod-* |
| 资源限制 | 限制可创建的 Kubernetes 资源类型(如禁止创建 ClusterRole) | Deny: ClusterRole, ClusterRoleBinding |
| 角色绑定 | 将 Project 与 RBAC 角色关联,控制用户/团队的操作权限 | role: admin, groups: [team-a] |
3.3 Sync 策略与钩子:控制部署行为
Sync 策略决定了 Argo CD 如何将 Git 中的期望状态应用到集群。钩子(Hooks)则允许在同步流程中插入自定义任务,如数据库迁移、健康检查、通知等。
3.3.1 同步策略对比
| 策略 | 描述 | 适用场景 |
|---|---|---|
| 手动同步 | 需要人工点击“Sync”按钮或通过 CLI 触发 | 生产环境关键应用,需要人工审批 |
| 自动同步 | Argo CD 检测到 Git 与集群状态不一致时自动执行同步 | 开发/测试环境,追求快速迭代 |
| 自动修剪(Prune) | 同步时自动删除 Git 中已移除的资源 | 需要严格对齐 Git 清单的场景 |
| 自愈(Self-Heal) | 如果集群状态被手动修改,自动回滚至 Git 状态 | 需要防止配置漂移的环境 |
3.3.2 Sync 钩子:在同步流程中注入逻辑
Argo CD 支持在同步生命周期的不同阶段执行钩子资源(Job、Pod、Argo Workflows 等)。钩子通过资源上的 argocd.argoproj.io/hook 注解来标识。
常用钩子类型:
- PreSync:在同步开始前执行,常用于数据库备份、前置检查。
- Sync:在同步过程中执行,与资源应用并行。
- PostSync:在同步完成后执行,常用于数据库迁移、发送通知、触发下游流程。
- SyncFail:在同步失败时执行,用于回滚或告警。
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
annotations:
argocd.argoproj.io/hook: PostSync # 在同步完成后执行
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
backoffLimit: 2
3.3.3 同步选项与波次(Sync Waves)
Argo CD 还支持通过 Sync Waves 控制资源应用的顺序。资源可以通过 argocd.argoproj.io/sync-wave 注解指定波次编号(默认 0),编号越小越先应用。结合钩子,可以实现复杂的部署编排:
| 波次 | 资源/钩子 | 说明 |
|---|---|---|
| -5 | PreSync Hook(Job) | 数据库备份 |
| -3 | ConfigMap, Secret | 先创建配置资源 |
| 0 | Deployment, Service | 核心应用资源 |
| 3 | Ingress | 暴露服务 |
| 5 | PostSync Hook(Job) | 数据库迁移、健康检查 |