2. Argo CD 核心架构:组件详解与通信拓扑
Argo CD 遵循 Kubernetes 原生控制器模式,由三个核心组件构成:API Server、Repo Server 和 Application Controller。理解这三个组件的职责及其通信拓扑,是进行故障排查和构建内部开发者平台(IDP)的基础。
2.1 三大核心组件职责对比
| 组件 | 核心职责 | 关键特性 | 故障排查关注点 |
|---|---|---|---|
| API Server | 对外暴露 REST/gRPC 接口,处理用户请求、Webhook、CLI 与 UI 交互 | RBAC 鉴权、JWT 验证、Project 资源管理、Application 状态缓存 | 过期、RBAC 配置错误、API 限流、TLS 证书问题 |
| Repo Server | 连接 Git/Helm 仓库,拉取并缓存清单,执行模板渲染(Kustomize/Helm/Jsonnet) | 仓库凭证管理、Git 子模块支持、多版本缓存、并发拉取控制 | SSH/HTTPS 认证失败、仓库不可达、模板渲染超时、缓存不一致 |
| Application Controller | 持续对比 Git 声明状态与集群实时状态,执行同步、自愈、资源 Prune | Informer 监听、Diff 计算、Sync/Health 状态机、资源钩子管理 | Informer 断连、Diff 算法异常、资源 OwnerReference 冲突、Sync 卡死 |
2.2 组件间通信拓扑
三个组件通过 gRPC 和 Kubernetes API 进行通信,形成闭环拓扑。下图展示了核心数据流与依赖关系:
2.3 组件间通信协议与端口
| 通信方向 | 协议 | 默认端口 | 用途 |
|---|---|---|---|
| 用户 → API Server | HTTPS / gRPC | 443 / 8080 | REST API 调用、WebSocket 日志流、CLI 交互 |
| API Server → Repo Server | gRPC (TLS) | 8081 | 请求渲染后的 Kubernetes 清单 |
| API Server → Application Controller | gRPC (TLS) | 8082 | 推送 Application 事件、状态更新通知 |
| Repo Server → Git/Helm 仓库 | SSH / HTTPS | 22 / 443 | 拉取仓库源码、Chart 包 |
| Application Controller → K8s API | HTTPS | 6443 | Watch/Get/Apply/Delete 资源 |
| 所有组件 → Redis | TCP | 6379 | 缓存清单、应用状态、集群信息 |
2.4 请求生命周期示例:用户触发同步
- 用户发起同步:通过
argocd app sync或 UI 点击同步按钮,请求到达 API Server。 - API Server 鉴权与校验:验证 JWT 、RBAC 权限、Project 约束,通过后创建
ApplicationSync操作。 - API Server 请求 Repo Server:通过 gRPC 调用
GetManifests,传递 Application 的 source 信息(Git 仓库、分支、路径、Helm Values)。 - Repo Server 拉取并渲染:连接 Git 仓库,拉取指定 commit,执行 Kustomize/Helm 渲染,返回最终的 Kubernetes 清单列表。
- API Server 将清单转发给 Application Controller:通过 gRPC 推送期望清单和同步参数。
- Application Controller 执行 Diff 与 Sync:对比期望清单与集群实时状态,生成 Patch/Apply/Delete 操作,调用 Kubernetes API 执行。
- 状态回写:Application Controller 将同步结果、资源健康状态写回 Application 资源状态,API Server 通过 Informer 感知并更新缓存。
故障排查提示: 当同步卡在 "ComparisonError" 或 "SyncFailed" 时,优先检查 Repo Server 的日志(
argocd-repo-server-xxx)确认 Git 拉取和模板渲染是否正常;其次检查 Application Controller 日志确认 Diff 计算是否超时。
2.5 高可用部署架构要点
- API Server:无状态,可水平扩展,前端需配置负载均衡器(如 Ingress/Nginx)。
- Repo Server:有状态(依赖本地缓存),建议使用
replicas: 2并挂载共享 PVC 或启用 Redis 缓存层以保持一致性。 - Application Controller:有状态(维护 Informer 连接),默认仅运行一个副本;可通过
--sharding参数启用分片模式,按 Application 名称哈希分配到多个 Controller 实例。 - Redis:推荐使用 Sentinel 或 Cluster 模式保障高可用,避免单点故障导致缓存雪崩。
常见陷阱: 在 IDP 场景中,如果 Repo Server 的缓存未及时刷新,可能导致用户看到的 Application 状态与实际 Git 仓库不一致。建议配置
repo.server.timeout.seconds 和合理的缓存 TTL,并在关键操作后手动触发 argocd app sync --refresh。