2、Argo CD 架构解析:核心组件、工作流程与架构图
在生产环境中,Argo CD 以 Kubernetes Operator 模式运行,由三个核心组件构成:API Server、Repo Server 和 Application Controller。理解这三者的职责与协作关系,是掌握接口调用与故障排查的基础。
2.1 核心组件一览
| 组件 | Pod 名称前缀 | 核心职责 | 对外暴露端口 |
|---|---|---|---|
| API Server | argocd-server-xxx |
REST/gRPC 接口、UI、RBAC、Session 管理 | 443 (HTTPS) |
| Repo Server | argocd-repo-server-xxx |
Git/Helm 仓库克隆、清单生成、缓存 | 8081 (gRPC) |
| Application Controller | argocd-application-controller-xxx |
状态对比、差异计算、自动/手动同步 | 8082 (metrics) |
接口调用视角: 自助目录的接口调用主要与 API Server 交互(REST API),但理解 Repo Server 和 Application Controller 的内部逻辑,能帮助你准确判断同步失败、清单生成错误等问题的根因。
2.2 核心组件详解
2.2.1 API Server
- 入口网关: 所有用户、CI/CD 系统、CLI 的请求统一经过 API Server。
- 认证与授权: 支持 SSO(OIDC、Dex)、Local 用户、JWT ;RBAC 策略在此执行。
- 接口类型: REST API(JSON)和 gRPC(性能敏感场景)。
- 无状态设计: 可水平扩展,所有状态存储在 Kubernetes CRD 中。
2.2.2 Repo Server
- 清单生成引擎: 从 Git 仓库拉取源码,执行
helm template、kustomize build或纯 YAML 渲染。 - 缓存机制: 维护本地 Git 缓存和生成清单的缓存,避免重复克隆。
- 安全隔离: 通过
argocd-repo-server的独立进程执行清单生成,不直接暴露给用户。 - SSH/HTTPS 密钥管理: 存储仓库访问凭证,支持
known_hosts校验。
2.2.3 Application Controller
- 状态循环: 持续监控 Application CRD 的
spec与集群实际资源状态。 - 差异计算: 对比
desired state(来自 Repo Server)与live state(来自目标集群 API)。 - 同步执行: 调用 Kubernetes API 执行
apply、delete、prune操作。 - 健康评估: 根据内置或自定义健康检查规则判断资源状态(Healthy / Degraded / Progressing)。
2.3 工作流程(同步请求生命周期)
以下流程描述一次典型的 手动同步 请求从发起至完成的完整路径:
- 用户/CI 发起同步请求 → 调用 API Server 的
POST /api/v1/applications/{name}/sync。 - API Server 校验权限 → 验证 JWT 与 RBAC 策略,通过后将请求写入 Application CRD 的
status.operationState。 - Application Controller 监听到变更 → 从 CRD 读取同步请求参数。
- Controller 请求 Repo Server → 调用 gRPC 接口
GenerateManifest,传入目标 revision 和路径。 - Repo Server 生成清单 → 拉取 Git 数据,执行模板渲染,返回最终 Kubernetes 资源列表。
- Controller 执行差异对比 → 将清单与集群当前状态对比,生成
diff结果。 - Controller 调用 Kubernetes API → 按顺序执行
apply、prune操作。 - Controller 更新状态 → 将同步结果写回 Application CRD 的
status字段。 - API Server 返回响应 → 用户或 CI 系统通过轮询或 Webhook 获取最终状态。
关键路径: 步骤 4 和 5 是性能瓶颈点。如果 Repo Server 缓存未命中或 Git 仓库过大,同步延迟会显著增加。自助目录的接口调用应尽量复用 Repo Server 的缓存机制(如指定
revision 而非 HEAD)。
2.4 架构图:组件交互与数据流
2.5 组件间通信协议
| 调用方 | 被调用方 | 协议 | 端口 | 用途 |
|---|---|---|---|---|
| 用户 / CLI / CI | API Server | HTTPS (REST) | 443 | 创建、同步、删除 Application |
| API Server | Kubernetes API | HTTPS | 6443 | CRUD Application CRD |
| Application Controller | Repo Server | gRPC (TLS) | 8081 | 请求清单生成 |
| Application Controller | 目标集群 API | HTTPS | 6443 | 同步资源、状态对比 |
| Repo Server | Git / Helm 仓库 | SSH / HTTPS | 22 / 443 | 拉取源码 |
安全注意: Repo Server 与 Git 仓库之间的 SSH 密钥、API Server 与目标集群的 kubeconfig 凭证,是攻击面最大的两个环节。自助目录的接口调用应避免在请求中明文传递凭证,优先使用 Argo CD 预配置的
repository.credentials 和 cluster 资源。
2.6 架构设计要点总结
- 无状态 + 可水平扩展: API Server 和 Repo Server 支持多副本,Application Controller 通过
sharding机制分摊负载。 - CRD 驱动: 所有 Application、AppProject、Repository 等资源均以 CRD 形式存储,API Server 和 Controller 通过 Informer 监听变更。
- 清单生成与同步分离: Repo Server 只负责生成清单,不接触集群;Application Controller 只负责同步,不接触 Git。职责清晰,便于独立扩缩容。
- 缓存层级: Repo Server 维护 Git 裸仓库缓存 + 生成清单缓存;API Server 维护 CRD 缓存。合理利用缓存可大幅降低接口调用延迟。