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 四个核心组件之间的通信关系与数据流向:
2.3 组件通信流程详解
Argo CD 的请求处理遵循以下典型流程:
- 用户发起请求:用户通过 CLI、UI 或 API 调用向 API Server 发送请求(如创建 Application、触发同步)。
- API Server 处理请求:API Server 验证用户身份与权限,将请求转换为内部 gRPC 调用或直接更新 Kubernetes CRD(Application 资源)。
- 清单生成:当需要生成 Kubernetes 清单时,API Server 调用 Repo Server 的 gRPC 接口。Repo Server 从 Git 仓库拉取代码,执行 Helm template / Kustomize build 等操作,生成最终清单并缓存到 Redis。
- 状态对比与同步:Application Controller 持续监听 Application CRD 的变化。它从 Redis 或 Repo Server 获取期望清单,通过 Kubernetes API 对比目标集群的实际状态,发现差异后执行同步操作。
- 结果回写: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 进行身份认证。