Argo CD灾备准入策略审计与故障诊断 - 第2节
Argo CD 核心架构回顾:控制平面与数据平面
在深入灾备与准入策略之前,必须重新理解 Argo CD 的架构本质。Argo CD 遵循典型的 控制平面 / 数据平面 分离模式,这种设计直接决定了其灾备恢复的复杂度与策略选择。
架构核心认知:控制平面是 Argo CD 的大脑,负责决策与状态管理;数据平面是 Git 仓库与目标集群之间的实际交付通道。灾备策略必须分别覆盖这两个平面的故障场景。
控制平面 vs 数据平面
| 维度 | 控制平面 | 数据平面 |
|---|---|---|
| 职责 | 编排、决策、状态存储、API 暴露 | 实际资源同步、部署执行、健康检查 |
| 核心组件 | API Server、Application Controller、状态存储 | Repo Server、Redis(缓存层) |
| 故障影响 | 无法创建/更新 Application,状态丢失 | 同步停滞,新部署无法下发 |
| 灾备重点 | etcd 备份、API Server 多副本、Controller 选举 | Repo Server 缓存预热、Redis 重建 |
核心组件详解
1. API Server
API Server 是 Argo CD 的入口组件,所有用户交互、CLI 命令、Web UI 请求、CI/CD 系统集成均通过 gRPC/REST API 接入。它负责认证、授权、请求路由与业务逻辑编排。
- 认证与授权:支持本地用户、OIDC、LDAP、GitHub/GitLab OAuth,RBAC 策略在此执行。
- 请求代理:将 Application 创建/更新请求写入 etcd,将同步请求转发给 Application Controller。
- 高可用:无状态设计,多副本部署,前端通过 Ingress/Service 负载均衡。
灾备要点:API Server 本身无状态,灾备主要依赖 etcd 的可用性。API Server 重启后可从 etcd 恢复全部状态,无需额外数据恢复操作。
2. Repo Server
Repo Server 负责与 Git 仓库交互,生成 Kubernetes 清单。它是数据平面的核心执行者,也是性能瓶颈的常见来源。
| 功能 | 说明 | 灾备影响 |
|---|---|---|
| Git 克隆与拉取 | 维护本地 Git 缓存,支持浅克隆与稀疏检出 | 缓存丢失后需重新克隆,首次同步延迟增加 |
| 清单生成 | 执行 Helm/Kustomize/Ksonnet 等模板引擎 | 无状态,但 CPU 密集,需预留资源 |
| 缓存管理 | 使用 Redis 缓存生成的清单,避免重复计算 | Redis 故障导致缓存穿透,Repo Server 负载飙升 |
3. Application Controller
Application Controller 是 Argo CD 的“执行大脑”,负责监控 Application 状态、执行同步操作、管理生命周期。它运行在控制平面,但直接操作数据平面(目标集群)。
- 状态循环:每个 Application 对应一个 goroutine,定期对比期望状态(Git)与实际状态(集群)。
- 同步引擎:调用 Repo Server 获取清单,通过 Kubernetes API 应用到目标集群。
- 健康评估:内置资源健康检查,支持自定义健康检查 Lua 脚本。
- 选举机制:多副本部署时通过 leader election 确保同一时间只有一个 Controller 执行同步。
故障排查关键:Application Controller 的 leader election 依赖 etcd 的租约机制。etcd 网络分区或性能下降会导致 Controller 频繁 re-elect,造成同步抖动甚至双主风险。
状态存储:etcd 与 Redis
Argo CD 使用两种存储系统,分别承载不同维度的数据,灾备策略必须区分对待。
etcd — 持久化状态存储
etcd 存储 Argo CD 的全部持久化状态,包括 Application 定义、同步状态、历史记录、RBAC 配置、Project 定义等。它是灾备恢复的第一优先级。
| 数据类别 | 示例 | 恢复优先级 |
|---|---|---|
| Application CRD | Application 名称、源仓库、目标集群、同步策略 | 最高 |
| 同步状态 | 当前同步阶段、资源状态哈希、操作历史 | 高 |
| RBAC 配置 | 角色、绑定、策略规则 | 高 |
| Project 定义 | 项目边界、允许的源仓库、目标集群白名单 | 高 |
| 集群凭证 | 目标集群 kubeconfig 加密存储 | 最高(需配合加密密钥) |
Redis — 缓存与临时状态
Redis 主要用作 Repo Server 的缓存层,存储 Git 仓库的已生成清单、仓库元数据、会话令牌等。Redis 数据丢失不会导致永久性故障,但会引发性能下降。
- 清单缓存:避免每次同步都重新执行 Helm/Kustomize 渲染,减少 Repo Server 负载。
- 仓库缓存:存储 Git 仓库的 commit SHA、分支引用,加速后续拉取。
- 会话存储:Web UI 与 API 的 JWT 令牌黑名单、CSRF 令牌。
灾备策略差异:etcd 需要定期快照备份与跨区域复制;Redis 可采用主从 + 持久化(RDB/AOF),但灾备恢复时允许缓存预热重建,优先级低于 etcd。
组件交互流程
理解组件间的数据流是故障排查的基础。以下是一个典型的 Application 同步流程:
- 用户触发同步:通过 CLI/API/Web UI 向 API Server 发送 Sync 请求。
- API Server 验证:检查用户权限、Project 约束、源仓库可访问性。
- 请求转发:API Server 将 Sync 请求写入 etcd,Application Controller 通过 watch 机制感知状态变更。
- Controller 获取清单:Application Controller 调用 Repo Server 的
GenerateManifestgRPC 接口。 - Repo Server 处理:从 Git 拉取最新代码,执行模板渲染,返回生成的 Kubernetes 清单。
- Controller 应用:通过 Kubernetes API 将清单应用到目标集群,记录同步结果到 etcd。
- 状态回写:Application Controller 更新 etcd 中的 Application 状态,API Server 通过 watch 推送给用户。
故障排查切入点:当同步卡住时,优先检查 Repo Server 的 Git 拉取日志(步骤 5)和 Application Controller 与目标集群的连通性(步骤 6)。etcd 的 watch 延迟通常表现为状态更新滞后。
架构设计对灾备的影响
| 架构特性 | 灾备优势 | 灾备挑战 |
|---|---|---|
| 控制/数据平面分离 | 控制平面故障不影响已部署的应用运行 | 故障排查时需分别定位两个平面的问题 |
| 无状态 API Server | 快速扩缩容,重启不丢数据 | 依赖 etcd 可用性,etcd 故障导致 API 不可用 |
| etcd 作为单一事实源 | 备份恢复简单,只需恢复 etcd 快照 | etcd 数据损坏影响全局,恢复时间取决于快照大小 |
| Redis 缓存层 | 缓存丢失不影响数据一致性 | 大规模集群下缓存重建可能导致 Repo Server 过载 |
| Application Controller 选举 | 支持多副本高可用 | etcd 性能抖动导致频繁 re-elect,同步中断 |