4. Argo CD 高可用架构:核心组件的 HA 部署
在生产环境中,Argo CD 作为 GitOps 的核心控制面,其自身的可用性直接决定了应用交付的连续性。本章深入剖析 Argo CD 三大核心组件——api-server、repo-server、application-controller——的高可用部署策略、状态管理及故障切换机制。
4.1 组件角色与 HA 挑战
Argo CD 采用微服务架构,每个组件承担不同职责,其 HA 部署的侧重点也各不相同。下表总结了各组件的核心功能与 HA 关键点:
| 组件 | 核心职责 | HA 关键挑战 | 推荐副本数 |
|---|---|---|---|
| api-server | REST API 端点、CLI/UI 交互、RBAC、Webhook 接收 | 无状态,需负载均衡;TLS 证书与 OIDC 配置一致性 | ≥2 |
| repo-server | Git 仓库克隆、清单渲染(Helm/Kustomize/Jsonnet) | 缓存一致性、并发渲染隔离、Git 凭证管理 | ≥2 |
| application-controller | 应用状态监控、差异计算、自动同步、健康评估 | Leader 选举、分片(Sharding)策略、状态缓存 | ≥2(启用分片) |
4.2 组件 HA 部署架构总览
下图展示了 Argo CD 在 Kubernetes 集群中的 HA 部署拓扑,重点体现组件间的流量路径与状态依赖关系:
4.3 api-server HA 部署
api-server 是 Argo CD 的入口网关,处理所有外部请求。其 HA 部署相对简单,核心在于无状态化与流量分发。
- 无状态设计: api-server 不持久化任何运行时状态,所有会话信息存储在 Redis 中。因此可以安全地运行多个副本。
- 负载均衡: 通过 Kubernetes Ingress 或 Service Mesh(如 Istio)将流量分发到多个 api-server Pod。建议配置
sessionAffinity: None实现均匀分发。 - 配置一致性: 所有 api-server 副本共享相同的 ConfigMap(argocd-cm)和 Secret(argocd-secret),确保 RBAC 策略、OIDC 配置、TLS 证书一致。
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-server
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: argocd-server
template:
spec:
containers:
- name: argocd-server
image: quay.io/argoproj/argocd:v2.12.0
args:
- /usr/local/bin/argocd-server
- --insecure # 生产环境建议在 Ingress 层终止 TLS
env:
- name: ARGOCD_REDIS_SERVER
value: "argocd-redis-ha-haproxy:6379"
ports:
- containerPort: 8080
- containerPort: 8083 # gRPC
4.4 repo-server HA 部署
repo-server 负责 Git 仓库操作与清单渲染,是 Argo CD 中 CPU 和内存消耗较高的组件。HA 部署需关注缓存一致性与并发控制。
| 关注点 | 策略 | 说明 |
|---|---|---|
| 缓存一致性 | 共享 Redis 缓存 | 所有 repo-server 副本使用同一 Redis 集群缓存 Git 仓库元数据与渲染结果,避免重复克隆。 |
| 并发渲染 | 并行限制(parallelism) | 通过 --parallelismlimit 参数控制每个副本的最大并发渲染数,防止 OOM。 |
| Git 凭证 | 共享 Secret + SSH 密钥 | 所有副本挂载相同的 Secret,确保对私有仓库的访问权限一致。 |
| 存储卷 | emptyDir 或 tmpfs | 临时克隆目录使用内存文件系统,提升 I/O 性能,Pod 重建后自动清理。 |
--repo-cache 并配置独立的 Redis 缓存实例,避免缓存穿透导致 Git 仓库被频繁克隆,触发 Git 服务端的速率限制。
4.5 application-controller HA 部署
application-controller 是 Argo CD 中最复杂的组件,负责持续监控应用状态并执行同步操作。其 HA 部署依赖 Leader 选举 和 分片(Sharding) 机制。
4.5.1 Leader 选举机制
application-controller 使用 Kubernetes 的 Lease 对象进行 Leader 选举。只有 Leader 副本执行全局协调任务(如分片分配、状态汇总),Follower 副本处于待命状态。
- 选举周期: 默认 15 秒心跳,45 秒过期。可通过
--leader-election-lease-duration调整。 - 故障切换: 当 Leader 副本故障时,Follower 在 Lease 过期后自动发起选举,新的 Leader 在 1-2 个周期内接管。
- 分片分配: Leader 负责将 Application 对象均匀分配到各个 controller 副本(包括自身)。
4.5.2 分片(Sharding)策略
分片是 application-controller 实现水平扩展的核心机制。每个 controller 副本负责管理一个分片内的 Application,互不干扰。
data:
controller.parallelism: "10" # 每个副本最大并发同步数
controller.status.processors: "20" # 状态处理协程数
controller.sharding.enabled: "true" # 启用分片
controller.sharding.replicas: "3" # 分片总数(需与 Deployment replicas 一致)
4.6 状态层 HA:Redis 集群
Argo CD 使用 Redis 作为共享状态层,存储会话、缓存、锁等信息。Redis 的 HA 直接影响 Argo CD 的可用性。
| 部署模式 | 适用场景 | 推荐配置 |
|---|---|---|
| Redis Sentinel | 中小规模集群(< 500 Application) | 1 主 2 从 + 3 Sentinel 节点 |
| Redis Cluster | 大规模集群(≥ 500 Application) | 6 节点(3 主 3 从),数据自动分片 |
| 外部托管 Redis | 企业合规要求,已有 Redis 基础设施 | AWS ElastiCache / Azure Redis / GCP Memorystore |
argocd-redis-ha Helm Chart 部署 Redis Sentinel 模式,它自动处理故障切换,且与 Argo CD 的 --redis 参数天然兼容。对于生产环境,务必为 Redis 配置持久化存储(AOF + RDB)和资源限制。
4.7 故障恢复验证清单
完成 HA 部署后,建议执行以下故障注入测试,验证各组件的恢复能力:
- api-server 故障: 随机删除一个 api-server Pod,验证 Ingress 是否将流量自动切换到剩余副本,CLI/UI 是否无感知。
- repo-server 故障: 停止一个 repo-server 副本,触发一次 Application 同步,确认请求被路由到其他副本,且缓存命中正常。
- controller Leader 故障: 删除当前 Leader 的 controller Pod,观察 Lease 过期后新 Leader 是否在 60 秒内接管,分片分配是否重新平衡。
- Redis 主节点故障: 手动触发 Redis Sentinel 故障切换,验证 Argo CD 组件是否自动重连到新的主节点,期间同步操作是否失败重试。