3. Argo CD 核心概念:Application、Project、Repository、Sync Policy、Sync Status、Health Status 详解
在深入资源配额校准与性能调优之前,必须透彻理解 Argo CD 的六大核心概念。这些概念构成了 GitOps 工作流的骨架,也是后续配置 Envoy 流量治理与资源限制的基础。本章将逐一拆解每个概念的定义、作用域、配置方式及常见陷阱。
3.1 Application(应用)
Application 是 Argo CD 中最核心的 CRD(Custom Resource Definition),它定义了一个部署单元:从哪个 Git 仓库拉取清单、部署到哪个目标集群/命名空间、以及如何同步。每个 Application 实例代表一条从“声明式期望状态”到“运行时实际状态”的持续交付管道。
| 字段 | 说明 | 示例值 |
|---|---|---|
spec.source | Git 仓库地址、路径、分支、Helm/Kustomize 参数 | https://github.com/example/app-config.git |
spec.destination | 目标集群(server/name)与命名空间 | server: https://kubernetes.default.svc, namespace: prod |
spec.project | 所属 Project,默认为 default | production |
spec.syncPolicy | 自动同步策略、自愈、Prune 行为 | automated: { prune: true, selfHeal: true } |
source 与 destination 的差异来决定同步动作。一个 Application 可以管理多个 Kubernetes 资源(Deployment、Service、ConfigMap 等),但通常建议按微服务或业务域拆分。
3.2 Project(项目)
Project 是 Argo CD 中逻辑隔离与权限控制的单元。它定义了哪些用户/角色可以访问哪些 Application、允许部署到哪些目标集群/命名空间、以及允许从哪些 Git 仓库拉取清单。Project 是 RBAC 与资源配额管理的边界。
- 源白名单(sourceRepos):限制 Application 只能引用指定的 Git 仓库。
- 目标白名单(destinations):限制 Application 只能部署到指定的集群和命名空间。
- 集群资源黑名单(clusterResourceBlacklist):禁止 Application 创建集群级别的资源(如 ClusterRole、PersistentVolume)。
- 命名空间资源黑名单(namespaceResourceBlacklist):禁止创建特定命名空间资源类型。
default Project 管理生产环境。务必为每个环境(dev/staging/prod)或每个团队创建独立的 Project,并配置严格的源/目标白名单。这是防止配置漂移和越权部署的第一道防线。
3.3 Repository(仓库)
Repository 是 Argo CD 连接 Git 仓库的凭证与配置对象。它存储仓库 URL、认证方式(SSH 密钥、HTTPS 用户名密码、GitHub App 等)、以及连接状态。Argo CD 通过 Repository 对象来拉取 Application 中定义的 source 内容。
| 认证方式 | 适用场景 | 安全等级 |
|---|---|---|
| SSH 密钥 | 私有仓库,推荐用于生产 | 高 |
| HTTPS + 用户名/密码 | 简单场景,不推荐长期使用 | 中 |
| GitHub App | 大规模多仓库管理,自动轮换 | 高 |
| OAuth / 个人访问令牌 | CI/CD 集成,临时授权 | 中 |
argocd-secret 中,通过 argocd repo add 命令或 UI 添加。建议使用 SSH 密钥并定期轮换,避免使用长期有效的静态密码。
3.4 Sync Policy(同步策略)
Sync Policy 决定了 Argo CD 如何将 Git 中的期望状态应用到目标集群。它分为手动同步和自动同步两大类,自动同步下可进一步配置自愈(Self-Heal)和允许删除资源(Prune)。
- 手动同步(Manual):默认策略。需要人工点击“Sync”按钮或调用 API 触发同步。适用于变更审批流程严格的环境。
- 自动同步(Automated):Argo CD 定期检测 Git 与集群的差异,自动执行同步。
prune: true:允许删除集群中不再存在于 Git 中的资源。selfHeal: true:当集群资源被手动修改(配置漂移)时,自动回滚到 Git 中的状态。
- 同步选项(Sync Options):如
Validate=false(跳过服务端校验)、PruneLast=true(先创建新资源再删除旧资源)、ApplyOutOfSyncOnly=true(仅同步不同步的资源)。
automated: { prune: true, selfHeal: true },但需配合 syncOptions: [ApplyOutOfSyncOnly=true] 减少不必要的 API 调用。对于有状态应用或数据库迁移,可先使用手动同步 + 预检查。
3.5 Sync Status(同步状态)
Sync Status 表示 Application 的期望状态与实际状态的一致性。Argo CD 通过对比 Git 中的清单与集群中运行的资源来判定状态。状态变化是触发同步策略的依据。
| 状态 | 含义 | 典型原因 |
|---|---|---|
| Synced | Git 中的清单与集群资源完全一致 | 正常状态 |
| OutOfSync | 集群资源与 Git 清单存在差异 | 手动修改了集群资源、Git 提交了新变更 |
| Syncing | 正在执行同步操作 | 自动或手动触发同步中 |
| Failed | 同步操作失败 | YAML 语法错误、资源冲突、权限不足 |
| Unknown | 无法获取状态 | 集群连接断开、Repository 凭证失效 |
3.6 Health Status(健康状态)
Health Status 评估 Application 管理的资源是否正常运行。Argo CD 内置了针对常见 Kubernetes 资源(Deployment、StatefulSet、Service、Ingress 等)的健康检查逻辑,也支持通过 Lua 脚本自定义健康检查。
| 状态 | 含义 | 示例 |
|---|---|---|
| Healthy | 所有资源均正常运行 | Deployment 的可用副本数达到期望值 |
| Degraded | 部分资源异常,但未完全宕机 | Deployment 可用副本数低于期望但大于 0 |
| Progressing | 正在滚动更新或扩缩容中 | 新版本 Pod 正在创建,旧版本 Pod 正在终止 |
| Suspended | 资源被暂停(如 HPA 暂停、CronJob 暂停) | HPA 的 spec.suspend: true |
| Missing | 资源在集群中不存在 | Git 中定义了 Deployment,但集群中未创建 |
| Unknown | 无法判断健康状态 | 自定义资源(CRD)未注册健康检查 |
3.7 核心概念关系图
下图展示了 Application、Project、Repository 以及 Sync/Health 状态之间的逻辑关系,帮助理解 Argo CD 的配置流与状态流。
3.8 状态流转与典型场景
理解 Sync Status 与 Health Status 的组合,是 SRE 日常排障的核心技能。下表列出常见状态组合及对应的运维动作。
| Sync Status | Health Status | 典型场景 | 推荐动作 |
|---|---|---|---|
| Synced | Healthy | 一切正常 | 无需操作 |
| OutOfSync | Healthy | Git 有新提交,但集群尚未同步 | 等待自动同步或手动触发 |
| Synced | Degraded | 配置一致,但 Pod 启动失败或资源不足 | 检查 Pod 日志、资源配额、存储卷 |
| OutOfSync | Degraded | 配置漂移且应用异常,常见于手动 kubectl edit | 先同步恢复配置,再排查应用健康 |
| Syncing | Progressing | 正在滚动更新或扩缩容 | 等待完成,监控进度 |
| Failed | Unknown | 同步失败,如 YAML 错误或权限不足 | 查看同步日志,修复配置后重试 |
3.9 多集群与多仓库场景下的概念映射
在企业级部署中,一个 Argo CD 实例通常管理多个集群和多个 Git 仓库。下图展示了多集群场景下 Application、Project、Repository 的映射关系。
- 一个 Repository 可以被多个 Application 引用(如 shared-lib 被 frontend 和 backend 共用)。
- 一个 Project 可以包含多个 Application,但一个 Application 只能属于一个 Project。
- 一个 Application 只能部署到一个目标集群的一个命名空间;如需跨集群部署,需创建多个 Application。
- Project 的
destinations白名单可以限制 Application 只能部署到特定集群,实现环境隔离。
3.10 实战:Application 完整 YAML 示例
以下是一个生产级 Application 配置,集成了自动同步、自愈、Prune 以及自定义健康检查(通过 Lua 脚本)。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: production-frontend
namespace: argocd
spec:
project: production
source:
repoURL: 'https://github.com/company/frontend-config.git'
targetRevision: main
path: k8s/overlays/prod
helm:
valueFiles:
- values-prod.yaml
destination:
server: 'https://kubernetes.default.svc'
namespace: frontend-prod
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- ApplyOutOfSyncOnly=true
- PruneLast=true
- Validate=false
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas
health:
lua: |
hs = {}
if obj.status ~= nil and obj.status.availableReplicas ~= nil then
if obj.status.availableReplicas >= obj.spec.replicas then
hs.status = "Healthy"
hs.message = "All replicas are available"
else
hs.status = "Degraded"
hs.message = "Not enough replicas"
end
else
hs.status = "Progressing"
hs.message = "Waiting for status"
end
return hs
ignoreDifferences:忽略 Deployment 的spec.replicas差异,避免 HPA 自动扩缩容导致 OutOfSync。health.lua:自定义健康检查,覆盖默认逻辑,更精确地判断应用健康。PruneLast=true:先创建新资源再删除旧资源,减少滚动更新期间的停机时间。