2. Argo CD 核心概念:Application、Project、Sync 策略、健康检查与自动修复
在深入分析资源配额瓶颈之前,必须牢固掌握 Argo CD 的四个核心抽象。它们是理解后续所有运维场景的基石,也是配置滚动升级策略时频繁交互的对象。
2.1 Application:部署单元的最小粒度
Application 是 Argo CD 中管理部署的基本对象,它将 Git 仓库中的期望状态 与 目标集群中的实时状态 绑定在一起。一个 Application 对应一个 Kubernetes 命名空间下的一个或多个资源。
| 字段 | 说明 | 典型值示例 |
|---|---|---|
| Source | 定义 Git 仓库地址、目标修订版本(分支/Tag/Commit)以及路径。 | https://github.com/example/app.git,分支 main,路径 ./deploy |
| Destination | 指定目标集群的 API Server URL 和命名空间。 | https://192.168.1.100:6443,命名空间 production |
| Sync Policy | 控制同步的触发方式与行为(自动/手动、自愈、Prune)。 | automated: { prune: true, selfHeal: true } |
| Health Status | Argo CD 对资源运行状态的评估结果(Healthy/Degraded/Progressing)。 | Healthy |
2.2 Project:多租户与权限边界
Project 是 Argo CD 中用于隔离 Application 和约束部署行为的逻辑分组。它定义了哪些集群、命名空间、Git 仓库可以被该 Project 下的 Application 使用,以及允许部署的资源类型。
- 资源白名单:限制 Project 内的 Application 只能创建特定 Kubernetes 资源(如只允许 Deployment、Service,禁止 ClusterRole)。
- 目标集群限制:指定 Application 只能部署到特定的集群或命名空间。
- Source 仓库限制:只允许从授权的 Git 仓库拉取清单。
- Sync 窗口:定义允许或禁止同步的时间段,用于生产环境的变更窗口控制。
# Project 配置示例(YAML 片段)
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: production-project
spec:
destinations:
- namespace: 'production-*'
server: https://kubernetes.default.svc
sourceRepos:
- 'https://github.com/example/production-repo.git'
clusterResourceWhitelist:
- group: ''
kind: Namespace
namespaceResourceBlacklist:
- group: 'rbac.authorization.k8s.io'
kind: 'RoleBinding'
namespaceResourceQuota 限制,某个 Application 的滚动升级可能因创建大量临时 Pod 而耗尽命名空间配额,导致同 Project 下其他 Application 的 Pod 无法调度。
2.3 Sync 策略:从 Git 到集群的桥梁
Sync 策略决定了 Argo CD 如何将 Git 中的期望状态应用到目标集群。在滚动升级中,策略的选择直接影响升级速度和资源消耗。
| 策略类型 | 触发方式 | 适用场景 | 资源配额影响 |
|---|---|---|---|
| 手动同步 | 用户通过 UI/CLI 触发 | 灰度发布、紧急回滚 | 低(完全由人工控制节奏) |
| 自动同步 | Git 仓库变更时自动触发 | CI/CD 流水线、持续部署 | 高(可能同时触发多个 Application) |
| 自动同步 + 自愈 | 集群状态偏离 Git 时自动纠正 | 故障恢复、配置漂移修复 | 中(仅在检测到偏差时触发) |
自动同步中的 Prune 选项需要特别关注:当 Git 中删除了某个资源定义,Argo CD 会自动删除集群中对应的资源。在滚动升级中,如果 Deployment 的 revisionHistoryLimit 设置不当,Prune 可能会过早删除旧的 ReplicaSet,导致无法快速回滚。
2.4 健康检查与自动修复
健康检查是 Argo CD 判断应用是否运行正常的核心机制,而自动修复则是基于健康状态的闭环控制。
2.4.1 内置健康检查逻辑
Argo CD 为常见的 Kubernetes 资源提供了内置的健康检查规则。以 Deployment 为例,健康状态判定如下:
- Progressing:新的 ReplicaSet 正在创建或更新 Pod,且尚未达到期望副本数。
- Healthy:所有 Pod 均处于 Ready 状态,且更新策略(RollingUpdate)已完成。
- Degraded:Pod 启动失败、CrashLoopBackOff、或更新过程中可用 Pod 数低于
minReadySeconds阈值。 - Suspended:Deployment 的副本数被设置为 0。
2.4.2 自定义健康检查(Lua 脚本)
对于自定义资源(CRD)或复杂应用,可以通过 Lua 脚本扩展健康检查逻辑。这在滚动升级中非常有用,例如检查数据库迁移 Job 是否完成,或验证 Service Mesh 的 sidecar 是否就绪。
# 自定义健康检查示例(Lua 脚本片段)
health = {}
function health.check(obj)
if obj.status ~= nil and obj.status.phase == "Succeeded" then
return { status = "Healthy", message = "Job completed successfully" }
end
if obj.status ~= nil and obj.status.phase == "Failed" then
return { status = "Degraded", message = "Job failed" }
end
return { status = "Progressing", message = "Job is still running" }
end
return health
2.4.3 自动修复(Self-Heal)
当启用 selfHeal 后,Argo CD 会持续监控集群状态。一旦检测到与 Git 期望状态不一致(例如有人手动修改了 Deployment 的副本数),它会自动将集群状态纠正回 Git 中的定义。
selfHeal,或使用 sync-wave 控制资源同步顺序。
2.5 核心概念在滚动升级中的协同
在滚动升级场景中,这四个概念协同工作:
- Application 定义升级的目标(Deployment 版本)和来源(Git 新配置)。
- Project 确保升级操作不会越界到其他团队或生产命名空间。
- Sync Policy 决定升级是自动触发还是手动控制,以及是否自动清理旧资源。
- Health Check 实时反馈升级进度,一旦检测到 Degraded 状态,Self-Heal 可自动回滚到上一个稳定版本。
spec.syncPolicy.automated 中设置 prune: true 和 selfHeal: true,但需要配合 sync-wave 注解控制资源创建顺序,避免因依赖资源未就绪导致升级失败。