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
实践要点: 在滚动升级场景中,建议为每个微服务创建独立的 Application,而不是将整个环境的所有资源放在一个巨型 Application 中。这可以避免因单个资源回滚导致整个应用集同步失败,同时也能更精细地控制资源配额。

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'
配额瓶颈关联: 当多个 Application 共享同一个 Project 时,如果 Project 未设置合理的 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 中的定义。

滚动升级中的风险: 自动修复与滚动升级同时启用时,如果升级过程中某个中间状态被 Argo CD 误判为“偏离期望状态”,可能会触发不必要的回滚。建议在滚动升级期间临时关闭 selfHeal,或使用 sync-wave 控制资源同步顺序。
Argo CD 核心概念关系图 Argo CD 核心概念关系图 Application Source (Git Repo) Destination (Cluster) Project Sync Policy Health & Self-Heal Project 为 Application 提供权限边界;Sync Policy 控制同步行为;Health & Self-Heal 确保集群状态与 Git 一致。

2.5 核心概念在滚动升级中的协同

在滚动升级场景中,这四个概念协同工作:

  1. Application 定义升级的目标(Deployment 版本)和来源(Git 新配置)。
  2. Project 确保升级操作不会越界到其他团队或生产命名空间。
  3. Sync Policy 决定升级是自动触发还是手动控制,以及是否自动清理旧资源。
  4. Health Check 实时反馈升级进度,一旦检测到 Degraded 状态,Self-Heal 可自动回滚到上一个稳定版本。
最佳实践: 在配置滚动升级的 Application 时,始终在 spec.syncPolicy.automated 中设置 prune: true 和 selfHeal: true,但需要配合 sync-wave 注解控制资源创建顺序,避免因依赖资源未就绪导致升级失败。