2. Argo CD 核心概念深度解析
在深入多集群 GitOps 流水线之前,必须透彻理解 Argo CD 的六大核心模型:Application、Project、Repository、Cluster Secret、Sync Policy 和 Health Status。这些模型构成了 Argo CD 声明式配置与自动化调谐的基石。
2.1 核心模型总览
下表从职责、作用域和关键属性三个维度对比六大模型,帮助建立全局认知:
| 核心模型 | 职责 | 作用域 | 关键属性 |
|---|---|---|---|
| Application | 定义“从哪个仓库、同步到哪个集群、如何同步”的完整单元 | 命名空间级 | source, destination, syncPolicy, syncStatus |
| Project | 逻辑隔离与权限边界,约束 Application 的行为 | 集群级 | sourceRepos, destinations, roles, syncWindows |
| Repository | 存储 Git 仓库连接凭证与元数据 | 集群级 | url, type, sshPrivateKey, password |
| Cluster Secret | 存储目标集群的 kubeconfig 或 API 端点凭证 | 集群级 | server, config, name, namespaces |
| Sync Policy | 控制同步触发方式、自动行为与资源修剪策略 | Application 内嵌 | automated, syncOptions, retry |
| Health Status | 评估已部署资源是否处于预期健康状态 | Application 内嵌 | status, message, resources.health |
2.2 Application:GitOps 的最小部署单元
Application 是 Argo CD 中最核心的 CRD(Custom Resource Definition)。它完整描述了一个部署单元的“三要素”:
- Source:Git 仓库路径、Helm Chart 或 Kustomize 目录。
- Destination:目标集群 API Server 地址 + 目标命名空间。
- Sync Policy:自动/手动同步、修剪策略、重试机制。
一个典型的 Application YAML 示例如下:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook-prod
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
path: guestbook
destination:
server: https://kubernetes.default.svc
namespace: guestbook-prod
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
syncPolicy.automated.prune:当 Git 中删除资源时,自动从集群中删除对应资源。syncPolicy.automated.selfHeal:当集群资源被手动修改时,自动回滚到 Git 中的期望状态。syncOptions.ApplyOutOfSyncOnly:仅同步状态不一致的资源,大幅提升大规模集群的同步效率。
2.3 Project:多租户隔离与安全边界
Project 是 Argo CD 中实现多团队、多环境隔离的核心机制。它限制了 Application 可以引用的仓库、目标集群和命名空间,并支持细粒度的 RBAC 角色绑定。
Project 的典型约束维度:
| 约束类型 | 字段 | 示例值 |
|---|---|---|
| 允许的仓库 | spec.sourceRepos |
https://github.com/team-a/* |
| 允许的目标集群 | spec.destinations |
server: https://cluster-prod.example.com |
| 允许的命名空间 | spec.destinations.namespace |
team-a-* |
| 同步窗口 | spec.syncWindows |
kind: deny, schedule: "0 0 * * 1-5" |
destinations 支持通配符 *,但生产环境应避免使用。始终为每个环境(dev/staging/prod)定义独立的 Project,并明确列出允许的集群和命名空间。
2.4 Repository 与 Cluster Secret:凭证管理模型
Repository 和 Cluster Secret 是 Argo CD 连接 Git 和 Kubernetes 集群的“桥梁”。它们都以 Kubernetes Secret 的形式存储敏感信息,但用途截然不同。
Repository 存储 Git 仓库的访问凭证:
- 支持 HTTPS(用户名+密码/)和 SSH(私钥)两种认证方式。
- 通过
argocd repo add命令或 UI 添加后,Argo CD 会将其加密存储。 - 多集群场景下,所有 Argo CD 实例共享同一套 Repository 配置(通过 ConfigMap 分发)。
Cluster Secret 存储目标 Kubernetes 集群的连接信息:
- 核心字段:
server(API Server 地址)、config(kubeconfig 或 bearer )。 - 命名规范:Secret 名称必须包含
cluster-前缀,且位于 Argo CD 安装的命名空间。 - 多集群管理时,每个目标集群对应一个独立的 Cluster Secret。
# 查看已注册的集群
argocd cluster list
# 输出示例
SERVER NAME STATUS MESSAGE
https://kubernetes.default.svc in-cluster Successful
https://prod-cluster:6443 prod Successful
https://staging-cluster:6443 staging Successful
argocd cluster add 命令自动生成 Cluster Secret,避免手动编写 kubeconfig。对于跨云场景,优先使用 bearer 而非完整的 kubeconfig 文件,以降低凭证泄露风险。
2.5 Sync Policy:同步行为控制引擎
Sync Policy 决定了 Argo CD 如何将 Git 中的期望状态应用到目标集群。它不是一个独立的 CRD,而是内嵌在 Application 的 spec.syncPolicy 字段中。
同步策略的核心维度:
| 策略维度 | 可选值 | 说明 |
|---|---|---|
| 同步模式 | automated / manual |
自动模式:Argo CD 定期检测差异并自动同步;手动模式:需人工触发 |
| 修剪策略 | prune: true/false |
是否允许删除集群中 Git 已移除的资源 |
| 自愈策略 | selfHeal: true/false |
是否自动修复集群中被手动修改的资源 |
| 同步选项 | syncOptions |
如 CreateNamespace=true、ApplyOutOfSyncOnly=true、PruneLast=true |
| 重试策略 | retry |
失败重试次数、间隔和回退因子 |
automated.prune: true —— 确保集群状态与 Git 完全一致。automated.selfHeal: true —— 防止配置漂移。syncOptions[0]: CreateNamespace=true —— 自动创建目标命名空间。syncOptions[1]: ApplyOutOfSyncOnly=true —— 减少不必要的 API 调用。retry.limit: 5 —— 网络抖动时自动重试。
2.6 Health Status:资源健康评估体系
Argo CD 不仅关注“同步状态”(Synced/OutOfSync),还关注“健康状态”(Healthy/Progressing/Degraded)。健康状态评估是 GitOps 自动化运维的核心能力。
健康状态分为三个层级:
- Application 级别:
status.health.status,取值Healthy、Progressing、Degraded、Suspended、Missing。 - 资源级别:
status.resources[].health,每个 Kubernetes 资源独立评估。 - 自定义健康检查:通过
resource.customizations扩展对 CRD 的健康评估逻辑。
常见资源的健康判定逻辑:
| 资源类型 | Healthy 条件 | Degraded 条件 |
|---|---|---|
| Deployment | 可用副本数 ≥ 期望副本数 | 可用副本数 < 期望副本数,且持续超过阈值 |
| StatefulSet | Ready 副本数 = 期望副本数 | Ready 副本数 < 期望副本数 |
| Service | 存在 Endpoints | 无 Endpoints 或 LoadBalancer 挂起 |
| Ingress | Admitted 状态为 True | Admitted 状态为 False |
| Job | Complete | Failed 或 Active 超时 |
argocd.argoproj.io/health 注解或全局 resource.customizations 配置自定义 Lua 脚本。
2.7 核心模型关系图
下图展示了六大核心模型之间的依赖与数据流关系:
2.8 多集群场景下的模型协同
在多集群 GitOps 架构中,上述模型需要协同工作才能实现“一次配置,多集群生效”。典型的协同模式如下:
- Repository 共享:所有集群共用同一个 Git 仓库,通过不同目录或分支区分环境。
- Cluster Secret 独立:每个目标集群有独立的 Cluster Secret,Argo CD 通过
argocd cluster add管理。 - Project 隔离:每个团队或环境使用独立的 Project,限制其可操作的集群和命名空间。
- Application 模板化:使用 ApplicationSet 生成器(如 Cluster Generator)为每个集群自动生成 Application。
- Sync Policy 差异化:生产集群启用
prune: true和selfHeal: true,开发集群可关闭自愈以允许临时调试。 - Health Status 聚合:通过 Argo CD 的
status.health字段,在控制面统一查看所有集群的部署健康度。
假设有 3 个集群(dev、staging、prod),每个集群对应一个 Cluster Secret。通过一个 ApplicationSet 和 Cluster Generator,Argo CD 会自动为每个集群创建一个 Application,这些 Application 共享同一个 Project(如
team-a)和 Repository,但 Destination 指向不同的 Cluster Secret。当 Git 仓库中的清单更新时,所有集群的 Application 会按照各自的 Sync Policy 执行同步。