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 进行通信,形成闭环拓扑。下图展示了核心数据流与依赖关系:

Argo CD 核心组件通信拓扑 Argo CD 核心组件通信拓扑 用户 / CLI / UI / CI/CD API Server REST / gRPC / RBAC gRPC 清单请求 Repo Server Git / Helm 渲染 SSH/HTTPS Git gRPC 事件推送 App Controller Diff / Sync / Health Watch / Apply / Delete Kubernetes API 目标集群 Redis 缓存层 状态缓存 清单缓存 通信拓扑关键说明: 1. API Server 是唯一对外暴露的组件,所有用户请求、Webhook、CLI 均通过它接入。 2. Repo Server 不直接与 Kubernetes API 通信,仅负责从 Git/Helm 仓库拉取并渲染清单。 3. Application Controller 通过 Informer 监听 Kubernetes 资源,并与 Repo Server 返回的期望状态进行 Diff。 4. Redis 作为可选缓存层,存储 Repo Server 的渲染结果和 API Server 的应用状态快照。

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 请求生命周期示例:用户触发同步

  1. 用户发起同步:通过 argocd app sync 或 UI 点击同步按钮,请求到达 API Server。
  2. API Server 鉴权与校验:验证 JWT 、RBAC 权限、Project 约束,通过后创建 ApplicationSync 操作。
  3. API Server 请求 Repo Server:通过 gRPC 调用 GetManifests,传递 Application 的 source 信息(Git 仓库、分支、路径、Helm Values)。
  4. Repo Server 拉取并渲染:连接 Git 仓库,拉取指定 commit,执行 Kustomize/Helm 渲染,返回最终的 Kubernetes 清单列表。
  5. API Server 将清单转发给 Application Controller:通过 gRPC 推送期望清单和同步参数。
  6. Application Controller 执行 Diff 与 Sync:对比期望清单与集群实时状态,生成 Patch/Apply/Delete 操作,调用 Kubernetes API 执行。
  7. 状态回写: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。