2. ArgoCD 基础架构:组件解析

ArgoCD 遵循 Kubernetes 原生的控制器模式,由四个核心组件构成:API Server、Repo Server、Application Controller 和 Redis。每个组件职责单一、可独立扩展,共同支撑起 GitOps 声明式交付的完整闭环。

ArgoCD 核心组件架构图 用户 / CI 系统 API Server gRPC / REST / Web UI Repo Server Git 克隆 / 清单生成 Application Controller 状态比较 / 同步执行 Redis 缓存 / 去重 / 会话 说明:实线表示主请求/响应路径,虚线表示缓存/状态查询路径

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 同步请求经过以下路径:

  1. 用户提交:通过 argocd app sync 或 Web UI 发起同步请求到 API Server。
  2. 请求验证:API Server 校验 RBAC、Project 权限,将同步请求写入 Application CRD 的 status.operationState。
  3. 清单获取:Application Controller 监听到同步请求,向 Repo Server 请求最新清单。
  4. 清单生成:Repo Server 克隆仓库、执行模板渲染,将结果返回给 Application Controller,同时写入 Redis 缓存。
  5. 状态比较:Application Controller 将期望清单与集群实际资源进行 diff,生成同步计划。
  6. 同步执行:按 sync-wave 顺序调用 Kubernetes API 执行资源变更,更新 Application 状态。
  7. 结果回写:Application Controller 将同步结果写回 Application CRD,API Server 通过 WebSocket 推送给 UI。
性能基线:在标准配置下(4 核 8G,100 个 Application),一次完整同步的平均耗时约为 2-5 秒,其中 Repo Server 的清单生成占 60%,Application Controller 的 diff 计算占 30%,API 调用占 10%。