2. Argo CD 基础架构回顾:核心组件及其在事件流中的角色
在深入事件流还原之前,必须厘清 Argo CD 的三个核心组件——API Server、Repo Server 和 Application Controller。它们各自承担不同的职责,并通过 gRPC 和事件队列协同工作,构成 GitOps 自动化的执行引擎。理解每个组件在事件流中的位置,是后续分析灾备切换和蓝绿发布故障时间线的前提。
2.1 核心组件总览
下表从职责、通信方式、关键数据结构和在事件流中的角色四个维度,对三个组件进行对比:
| 组件 | 核心职责 | 通信方式 | 关键数据结构 | 事件流角色 |
|---|---|---|---|---|
| API Server | 暴露 REST/gRPC 接口,处理用户请求、Webhook 触发、RBAC 校验 | HTTP/gRPC → etcd | Application、AppProject、ApplicationSet | 事件入口:接收 Git Webhook 和用户指令,写入事件队列 |
| Repo Server | 克隆 Git 仓库、生成 Manifests、缓存 Helm/Kustomize 渲染结果 | gRPC(API Server 调用) | Repository、Manifest 缓存、RevisionMetadata | 事件解析:将 Git 提交转换为可比较的期望状态 |
| Application Controller | 轮询比较期望状态与实时状态,执行 Sync/Prune/自愈操作 | gRPC → API Server(状态回写) | Application(status 字段)、SyncOperation、ResourceDiff | 事件执行:驱动集群状态收敛,触发灾备/发布动作 |
2.2 组件详解与事件流定位
2.2.1 API Server — 事件入口
API Server 是 Argo CD 的“前门”,所有外部事件都首先到达这里:
- Git Webhook 事件:当开发者推送代码到 Git 仓库时,Webhook 请求被 API Server 接收,触发
app refresh操作。 - 用户 CLI/UI 操作:手动执行
argocd app sync或修改 Application 资源,API Server 将指令写入 etcd。 - ApplicationSet 控制器回调:当 ApplicationSet 生成或更新 Application 时,API Server 负责持久化。
关键点:API Server 不直接执行同步操作,它只负责将事件转换为 etcd 中的状态变更,然后由 Application Controller 通过 watch 机制感知。
2.2.2 Repo Server — 事件解析
Repo Server 是“配置翻译器”,负责将 Git 仓库中的原始配置转换为 Kubernetes 可理解的 Manifest:
- 仓库克隆与缓存:首次请求时克隆整个仓库,后续通过 git fetch 增量更新,避免重复拉取。
- Manifest 生成:支持 Helm Chart 渲染、Kustomize overlay 合并、纯 YAML 目录扫描。
- Revision 锁定:每次生成 Manifest 时记录 commit SHA,确保期望状态可追溯。
# Repo Server 典型调用流程(gRPC)
1. API Server 调用 GetManifests(repoURL, revision, appPath)
2. Repo Server 检查本地缓存是否命中
3. 若未命中,执行 git clone/fetch + helm template / kustomize build
4. 返回 Manifest 列表 + 依赖元数据
5. 缓存结果(TTL 默认 24h,可通过 --repo-cache-expiration 调整)
2.2.3 Application Controller — 事件执行
Application Controller 是“执行引擎”,它通过 informer 机制监听 Application 资源的变化,并驱动集群状态收敛:
- 差异计算:将 Repo Server 返回的期望状态与集群中实时资源进行 Diff。
- 同步执行:根据 Sync Policy(自动/手动)和 Sync Options(Prune、Apply Out of Sync Only)执行 kubectl apply / delete。
- 自愈循环:每 3 分钟(默认)重新比较一次,发现偏差自动纠正。
常见误区:Application Controller 不直接访问 Git 仓库,它始终通过 gRPC 调用 Repo Server 获取 Manifest。如果 Repo Server 不可用,Controller 将无法执行任何同步操作,但已缓存的 Manifest 仍可用于差异比较。
2.3 组件协作事件流(SVG 架构图)
下图展示了从 Git Push 到集群资源更新的完整事件流,以及三个组件在其中的交互位置:
2.4 组件间通信协议与端口
在生产环境中,组件间的通信安全至关重要。下表列出默认端口和协议:
| 通信对 | 协议 | 默认端口 | 认证方式 |
|---|---|---|---|
| API Server → Repo Server | gRPC(TLS) | 8081 | mTLS 证书 |
| Application Controller → API Server | gRPC(TLS) | 443 | ServiceAccount |
| API Server → etcd | gRPC(TLS) | 2379 | 客户端证书 |
| Repo Server → Git 仓库 | HTTPS / SSH | 22 / 443 | SSH Key / HTTP Basic Auth |
2.5 组件故障对事件流的影响
在灾备场景中,组件故障会直接阻断事件流。理解每个组件失效后的影响范围,是设计高可用架构的基础:
- API Server 不可用:Webhook 无法接收,用户无法执行手动同步,但 Application Controller 仍可基于最后一次缓存的期望状态继续自愈循环。
- Repo Server 不可用:Application Controller 无法获取新的 Manifest,但已缓存的 Manifest 仍可用于差异比较。如果缓存过期,Controller 将无法执行同步。
- Application Controller 不可用:集群状态收敛完全停止,自愈和同步均无法执行,但 API Server 和 Repo Server 仍可正常处理请求。
架构启示:在蓝绿发布和灾备切换场景中,Repo Server 的缓存策略和 Application Controller 的自愈间隔是影响 RTO(恢复时间目标)的关键参数。建议将 Repo Server 缓存 TTL 延长至 48h,并将 Controller 的自愈间隔缩短至 30s,以平衡性能与恢复速度。