2. 核心架构解析:Argo CD 组件与通信流程

Argo CD 采用微服务架构,由四个核心组件构成:API Server、Repo Server、Application Controller 和 Redis。每个组件职责单一,通过 gRPC 和 HTTP 协议协同工作,共同实现 GitOps 声明式持续交付。

2.1 组件总览与职责

组件 核心职责 通信协议 关键特性
API Server 暴露 REST/gRPC 接口,处理用户/CI/CD 请求,认证授权,Webhook 接收 HTTPS / gRPC 无状态,可水平扩展,TLS 终止
Repo Server 克隆 Git 仓库,生成 Helm/Kustomize/Jsonnet 清单,缓存生成结果 gRPC (内部) 无状态,可水平扩展,仓库凭证管理
Application Controller 持续对比期望状态(Git)与实际状态(集群),执行同步/回滚操作 gRPC / Kubernetes API 有状态(跟踪应用状态),多集群管理
Redis 缓存 Repo Server 生成的清单、API Server 会话、Controller 锁 TCP (Redis 协议) 可选高可用(Sentinel/Cluster),持久化非必需
架构要点:API Server 和 Repo Server 是无状态组件,可以轻松水平扩展;Application Controller 虽然维护应用状态,但状态存储在 Kubernetes CRD 中,因此 Controller 实例本身也可以多副本运行(通过 leader election 保证只有一个活跃控制器)。

2.2 组件通信流程

下图展示了 Argo CD 四个核心组件之间的通信关系与数据流向:

Argo CD 核心组件通信架构图 Argo CD 核心组件通信架构 用户 / CI/CD 系统 API Server REST/gRPC 接口 Repo Server 清单生成引擎 Application Controller 状态对比与同步 Redis 缓存 / 会话 / 锁 目标 Kubernetes 集群 Git 仓库 HTTPS/gRPC gRPC 获取清单 gRPC 同步指令 会话/缓存 git clone/fetch 缓存清单 分布式锁 Kubernetes API 说明:实线箭头表示主要通信路径。API Server 是唯一对外暴露的组件,Repo Server 和 Application Controller 通过内部 gRPC 与 API Server 通信。

2.3 组件通信流程详解

Argo CD 的请求处理遵循以下典型流程:

  1. 用户发起请求:用户通过 CLI、UI 或 API 调用向 API Server 发送请求(如创建 Application、触发同步)。
  2. API Server 处理请求:API Server 验证用户身份与权限,将请求转换为内部 gRPC 调用或直接更新 Kubernetes CRD(Application 资源)。
  3. 清单生成:当需要生成 Kubernetes 清单时,API Server 调用 Repo Server 的 gRPC 接口。Repo Server 从 Git 仓库拉取代码,执行 Helm template / Kustomize build 等操作,生成最终清单并缓存到 Redis。
  4. 状态对比与同步:Application Controller 持续监听 Application CRD 的变化。它从 Redis 或 Repo Server 获取期望清单,通过 Kubernetes API 对比目标集群的实际状态,发现差异后执行同步操作。
  5. 结果回写:Application Controller 将同步结果(成功/失败、资源状态)写回 Application CRD 的 status 字段,API Server 通过 Watch 机制获取更新并返回给用户。
关键通信路径:
  • API Server ↔ Repo Server:gRPC 双向流,用于请求清单生成和接收生成结果。
  • Repo Server ↔ Redis:缓存生成的清单,避免重复生成,提升性能。
  • Application Controller ↔ Redis:使用 Redis 实现分布式锁,确保多副本 Controller 只有一个活跃实例执行同步。
  • Application Controller ↔ 目标集群:通过 Kubernetes API 直接操作目标集群,支持多集群管理。

2.4 组件高可用与扩展性

组件 高可用方案 扩展性说明
API Server 多副本 + Service 负载均衡 无状态,按请求量水平扩展
Repo Server 多副本 + Service 负载均衡 无状态,按仓库数量和清单生成频率扩展
Application Controller 多副本 + Leader Election(基于 Redis) 活跃副本数固定为 1,但可通过分片(Sharding)管理大量应用
Redis Sentinel 或 Redis Cluster 缓存容量按需扩展,持久化非必需
注意:Application Controller 的 Leader Election 依赖 Redis 的分布式锁。如果 Redis 不可用,Controller 将无法选举新的 Leader,导致同步暂停。在生产环境中,建议为 Redis 配置高可用(Sentinel 或 Cluster),并设置合理的超时和重试策略。

2.5 组件通信协议与端口

通信对 协议 默认端口 认证方式
用户 → API Server HTTPS / gRPC 443 / 8080 JWT / OIDC / SSO
API Server → Repo Server gRPC (TLS) 8081 mTLS / 服务账户
API Server → Redis Redis 协议 6379 密码 / TLS
Application Controller → Repo Server gRPC (TLS) 8081 mTLS / 服务账户
Application Controller → Redis Redis 协议 6379 密码 / TLS
Application Controller → 目标集群 Kubernetes API (HTTPS) 6443 Kubeconfig / 服务账户
安全建议:在生产环境中,所有内部通信应启用 TLS/mTLS 加密。API Server 对外暴露时,建议使用 Ingress 或 Load Balancer 终止 TLS,并配置 OIDC 或 SSO 进行身份认证。