2. Argo CD 架构基础:核心组件、数据流与工作原理解析
在深入监控与故障排查之前,必须理解 Argo CD 的内部架构。Argo CD 遵循 Kubernetes Operator 模式,由四个核心组件构成,它们协同工作以实现 GitOps 的声明式同步与自动化。
2.1 核心组件概览
| 组件 | 职责 | 关键端口 | 高可用要求 |
|---|---|---|---|
| API Server | 暴露 gRPC/REST API,处理认证、授权、Webhook 与 UI 请求 | 443 (gRPC/HTTPS) | 无状态,可多副本 |
| Repo Server | 克隆 Git 仓库、生成 Manifests(Helm/Kustomize/Jsonnet) | 8081 (gRPC) | 无状态,可多副本 |
| Application Controller | 持续对比 Desired State 与 Live State,执行 Sync/Health 操作 | 8082 (Metrics) | 有状态(Leader Election),多副本 |
| Redis | 缓存 Repo Server 生成的 Manifests、存储用户 Session | 6379 | 有状态,需持久化或 Sentinel |
监控要点: 四个组件中,Application Controller 是同步异常的核心故障点,其 Metrics 端口(8082)是 Grafana 数据采集的首要目标。
2.2 核心组件详解
2.2.1 API Server
- 入口网关: 所有用户操作(CLI、UI、API)均通过 API Server。
- 安全层: 集成 RBAC、SSO(OIDC/LDAP)、Webhook 认证。
- 代理转发: 将 Manifest 生成请求转发给 Repo Server,将同步请求转发给 Application Controller。
- 无状态设计: 所有状态存储在 Redis 或 Kubernetes 资源中,支持水平扩展。
2.2.2 Repo Server
- Manifest 工厂: 接收 Git 仓库 URL、Revision、Path 和模板参数,生成纯 Kubernetes YAML。
- 缓存机制: 生成的 Manifests 以
repoServerCache形式存入 Redis,避免重复克隆与渲染。 - 支持多种工具链: Helm、Kustomize、Jsonnet、纯 YAML 目录。
- 安全隔离: 运行在独立的 Pod 中,通过 gRPC 与 API Server 通信,不直接暴露给外部。
2.2.3 Application Controller
- 核心循环: 持续监控 Application 对象,对比
spec.source(期望状态)与集群中status.liveState(实际状态)。 - 同步执行器: 当检测到差异时,执行 Sync 操作(Create/Update/Delete 资源)。
- 健康评估: 根据内置或自定义健康检查规则,判断资源是否健康。
- Leader 选举: 多副本模式下,只有一个 Controller 实例执行同步操作,其他实例作为热备。
2.2.4 Redis
- 缓存层: 存储 Repo Server 生成的 Manifests(TTL 默认 24h),减少 Git 仓库拉取频率。
- Session 存储: 保存 API Server 的用户登录会话。
- 高可用: 生产环境建议使用 Redis Sentinel 或 Redis Cluster,避免单点故障导致缓存丢失。
2.3 数据流与工作原理解析
下图展示了 Argo CD 从 Git 提交到集群资源同步的完整数据流:
2.4 同步循环详解
Application Controller 内部运行一个 Reconciliation Loop(调谐循环),这是同步的核心机制:
- 获取期望状态: 从 Redis 或 Repo Server 获取
spec.source对应的 Manifests。 - 获取实际状态: 通过 Kubernetes API Watch 或 List 获取集群中所有受管资源。
- 差异对比: 使用
diff算法比较期望状态与实际状态的 YAML 结构。 - 状态更新: 将对比结果写入
status.conditions和status.sync.status。 - 执行同步: 如果
syncPolicy允许自动同步,则调用 Kubernetes API 执行 Apply/Delete。 - 健康检查: 同步完成后,评估资源健康状态,更新
status.health.status。
故障排查关键点: 如果同步循环卡在步骤 3(差异对比)或步骤 5(执行同步),通常表现为
OutOfSync 或 SyncFailed 状态。此时应优先检查 Application Controller 的日志与 Metrics。
2.5 关键交互协议
| 交互路径 | 协议 | 数据内容 | 故障影响 |
|---|---|---|---|
| API Server ↔ Repo Server | gRPC (TLS) | 仓库信息、模板参数 | Manifest 生成失败,同步无法启动 |
| Repo Server ↔ Redis | TCP (Redis 协议) | 缓存 Manifests | 缓存未命中,增加 Git 拉取频率 |
| Application Controller ↔ Kubernetes API | HTTPS (K8s API) | 资源 CRUD、Watch 事件 | 同步失败、状态无法更新 |
| API Server ↔ Application Controller | gRPC (TLS) | 同步请求、状态查询 | 用户操作无响应 |
2.6 高可用架构要点
- API Server: 无状态,通过 Service 负载均衡,建议 2+ 副本。
- Repo Server: 无状态,通过 Service 负载均衡,建议 2+ 副本。
- Application Controller: 有状态,通过 Leader Election 保证只有一个活跃实例执行同步,建议 2+ 副本。
- Redis: 有状态,生产环境必须使用 Sentinel 或 Cluster 模式,避免单点故障。
常见陷阱: 如果 Redis 宕机,Repo Server 的缓存将失效,导致每次同步都重新拉取 Git 仓库,增加网络延迟和 Repo Server 负载。监控 Redis 的
up 和 memory_usage 是预防此类问题的关键。
2.7 架构总结
Argo CD 的架构设计遵循 职责分离 原则:
- Repo Server 负责“生成期望状态”。
- Application Controller 负责“对比与执行”。
- API Server 负责“用户交互与安全”。
- Redis 负责“加速与状态缓存”。