2. ArgoCD 基础架构:组件解析
ArgoCD 遵循 Kubernetes 原生的控制器模式,由四个核心组件构成:API Server、Repo Server、Application Controller 和 Redis。每个组件职责单一、可独立扩展,共同支撑起 GitOps 声明式交付的完整闭环。
2.1 API Server
API Server 是 ArgoCD 的统一入口,对外暴露 gRPC/REST 接口和 Web UI。它负责认证、授权、请求路由以及 Application/AppProject 等 CRD 的校验与持久化。
| 功能维度 | 说明 |
|---|---|
| 认证与授权 | 支持 OIDC、LDAP、SAML、GitHub OAuth 及本地用户;RBAC 基于 Project 和资源动作 |
| CRUD 代理 | 所有 Application、AppProject、ApplicationSet 的创建/更新/删除均经过 API Server 写入 Kubernetes |
| Web UI 与 CLI | 提供可视化仪表盘和 argocd 命令行工具,底层均调用同一套 gRPC 服务 |
| 集群管理 | 注册/注销目标 Kubernetes 集群,存储集群凭据(加密后存入 Secret) |
生产建议:API Server 应至少部署 2 个副本,并配置 HPA 以应对 Webhook 和 CLI 并发请求。启用 TLS 和 RBAC 审计日志是安全基线。
2.2 Repo Server
Repo Server 是 ArgoCD 的清单生成引擎。它负责克隆 Git 仓库、执行 Helm/Kustomize/Ksonnet 等模板渲染,并将最终生成的 Kubernetes 资源清单返回给其他组件。
- Git 操作:使用
git clone --depth=1浅克隆,支持 SSH/HTTPS 认证、子模块、Git LFS。 - 清单生成:根据 Application 中定义的
source类型(Helm Chart、Kustomize overlay、纯 YAML 目录)生成完整资源列表。 - 缓存机制:将生成的清单按仓库+Revision+路径 缓存到 Redis,避免重复克隆和渲染。
- 无状态设计:Repo Server 本身不存储状态,所有持久化依赖 Redis 和 Kubernetes API。
关键指标:Repo Server 的 CPU 消耗主要来自 Helm 模板渲染和 Kustomize 构建。当管理超过 500 个 Application 时,建议将 Repo Server 的副本数提升至 3-5 个,并启用
--parallelism-limit 参数控制并发数。
2.3 Application Controller
Application Controller 是 ArgoCD 的状态比较与同步引擎。它持续监控每个 Application 的期望状态(Git 仓库)与实际状态(目标集群),并在检测到漂移时触发自动或手动同步。
| 核心循环 | 描述 |
|---|---|
| 1. 状态比较 | 每 3 分钟(默认)对比 Repo Server 生成的期望清单与集群中实际资源的状态 |
| 2. 漂移检测 | 使用 diff 算法逐资源比较,支持忽略特定字段(ignoreDifferences) |
| 3. 同步执行 | 调用 Kubernetes API 执行 apply / create / delete,支持 sync-wave 波次编排 |
| 4. 健康评估 | 根据资源类型(Deployment、Service、Pod 等)内置健康检查规则,更新 Application 健康状态 |
注意:Application Controller 是 ArgoCD 中资源消耗最高的组件。每个 Application 的同步循环都会产生 API 调用和 diff 计算。当 Application 数量超过 1000 时,必须调整
--status-processors 和 --operation-processors 参数,并考虑分拆到多个 ArgoCD 实例。
2.4 Redis
Redis 在 ArgoCD 中扮演缓存与去重中间件的角色,并非持久化数据库。它存储以下三类数据:
- 清单缓存:Repo Server 生成的资源清单按
repo+revision+path缓存,TTL 默认 24 小时。 - Git 操作锁:防止同一仓库的并发克隆冲突,使用 Redis 分布式锁实现。
- WebSocket 会话:API Server 与 Web UI 之间的实时事件推送依赖 Redis Pub/Sub 进行跨副本广播。
| 缓存键模式 | 示例 | TTL |
|---|---|---|
manifest:<repo>:<revision>:<path> |
manifest:git@github.com:org/app.git:main:deploy/ |
24h |
gitlock:<repo> |
gitlock:git@github.com:org/app.git |
30s |
session:<> |
session:eyJhbGciOiJSUzI1NiIs... |
24h |
高可用部署:生产环境建议使用 Redis Sentinel 或 Redis Cluster 替代单实例。ArgoCD 支持
--redis 参数指定 Sentinel 地址,并自动处理故障转移。Redis 数据丢失不会导致 ArgoCD 功能中断,只会触发缓存重建和短暂的性能下降。
2.5 组件协作流程
一次完整的 GitOps 同步请求经过以下路径:
- 用户提交:通过
argocd app sync或 Web UI 发起同步请求到 API Server。 - 请求验证:API Server 校验 RBAC、Project 权限,将同步请求写入 Application CRD 的
status.operationState。 - 清单获取:Application Controller 监听到同步请求,向 Repo Server 请求最新清单。
- 清单生成:Repo Server 克隆仓库、执行模板渲染,将结果返回给 Application Controller,同时写入 Redis 缓存。
- 状态比较:Application Controller 将期望清单与集群实际资源进行 diff,生成同步计划。
- 同步执行:按
sync-wave顺序调用 Kubernetes API 执行资源变更,更新 Application 状态。 - 结果回写:Application Controller 将同步结果写回 Application CRD,API Server 通过 WebSocket 推送给 UI。
性能基线:在标准配置下(4 核 8G,100 个 Application),一次完整同步的平均耗时约为 2-5 秒,其中 Repo Server 的清单生成占 60%,Application Controller 的 diff 计算占 30%,API 调用占 10%。