argocd-agent应用同步实战:Application与AppProject跨集群生命周期管理
argocd-agent应用同步实战:Application与AppProject跨集群生命周期管理
argocd-agent 是 Argo CD 的多集群扩展项目,通过轻量级 agent 与中心化 principal 组件,实现 Application 与 AppProject 的跨集群自动同步和生命周期管理,让你在一个控制台上完成多集群 GitOps 应用部署。本文将从架构原理到落地配置,带你快速掌握这套"拉模式(pull model)"同步方案。
一、为什么传统多集群 Argo CD 会"撑不住" 🤔
经典 Argo CD 多集群部署中,中心化实例要为每个工作集群维持 API 连接、资源缓存和持续 watch,随之而来的是:
| 痛点 | 具体表现 |
|---|---|
| 资源消耗指数增长 | 集群越多,内存、CPU、带宽压力越大 |
| 连接管理复杂 | 每个集群都要配置网络准入、凭据、防火墙规则 |
| 单点故障 | 控制平面故障会拖垮整个 GitOps 体系 |
| 网络强依赖 | 弱网、高延迟、跨云链路下同步频繁中断 |
| 安全风险集中 | 控制面集中保存所有集群凭据,攻击面大 |
argocd-agent 的思路是"翻转":不再由控制平面伸手去够远程集群,而是让每个工作集群里的 agent 主动回连控制平面。详见 架构概览。
二、核心架构:Hub-and-Spoke 回连模型 🏗️
上图展示了 argocd-agent 的简化架构(浅蓝色为现有 Argo CD 组件,浅绿色为 argocd-agent 新增组件):
- Principal(控制平面):运行在中心集群,承载你熟悉的 Argo CD UI/API,负责应用配置的统一管理与状态聚合;
- Agent(工作集群):每个工作集群部署一个轻量 agent,只有 agent 能发起连接,控制平面不需要知道任何集群的拓扑细节;
- 同步通道:双向 gRPC 流(HTTP/2,可降级 HTTP/1.1 WebSocket),全程 mTLS 加密,传输 Application、AppProject、仓库配置等 Argo CD 配置资源。
由于 agent 只同步"Argo CD 配置"而非全量集群资源,这条连接比 application controller 直连远端 API 便宜得多,对弱网、断连、高延迟天然 resilient。协议细节可参考 同步协议文档。
三、两种工作模式:Managed 与 Autonomous 🎛️
每个 agent 运行在两种模式之一,决定了同步方向与"真理之源":
| 维度 | Managed 托管模式 | Autonomous 自治模式 |
|---|---|---|
| 同步方向 | 控制平面 → 工作集群 | 工作集群 → 控制平面 |
| Application 创建位置 | principal 上创建,下发到 agent | agent 集群本地创建,上报到 principal |
| 真理之源 | principal(agent 上被直改会被自动回滚) | agent(principal 是只读镜像) |
| 典型场景 | 统一发布、多租户集中管控 | 边缘站点、气隙环境、集群自管 GitOps |
两种模式可以混合部署——部分集群托管、部分自治,统一在一个仪表盘可见。模式说明见 Agent modes。
下图是"全自治工作集群"集成模式:每个工作集群自带 application-controller、repo-server 与 Redis,控制平面主要承担配置枢纽与可观测性聚合:
四、Application 跨集群同步实战
1. Managed 模式:在控制平面"下命令" 🚀
托管模式下 Application 创建在 principal 集群,由 principal 按映射模式决定路由到哪个 agent:
- Destination-based mapping(推荐):按
spec.destination.name路由,与传统 Argo CD 的集群定向模型一致,天然支持多租户; - Namespace-based mapping(默认,已弃用):Application 所在 namespace 名 = agent 名。官方已宣布将在未来版本移除,新环境建议直接采用 destination-based。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: team-a # 可位于任意命名空间
spec:
project: default
source:
repoURL: https://example.com/your-org/your-apps.git
path: guestbook
destination:
name: production-east # 路由键:精确匹配 agent 名称
namespace: guestbook
agent 收到后会做本地化转换:destination 改写为指向本集群(in-cluster)、命名空间保留原值,并附加 source UID 注解用于溯源。
生命周期管理一览:
| 操作 | 行为 |
|---|---|
| 创建 | 在 principal 上创建,自动分发到匹配 agent |
| 更新 | principal 上的变更自动传播 |
| 删除 | principal 上删除,agent 端自动移除 |
| agent 重连 | 收到所有映射给它的全量 Application |
| 冲突 | 在 agent 集群直改 spec 会被自动回滚,保证 principal 是唯一真理之源 |
两端启用方式:principal 加 --destination-based-mapping 标志,agent 加 --destination-based-mapping --create-namespace。两种模式的完整对比与迁移步骤见 Agent Mapping Modes。
2. Autonomous 模式:工作集群"自己当家" 🦾
自治模式下 Application 直接创建在 agent 集群,随后同步到 principal 上以 agent 命名的专属 namespace(如 production-agent/my-app),并做两项转换:
- project 前缀化:
default变成production-agent-default,避免不同 agent 的同名项目冲突; - destination 改写:
destination.server替换为指向该 agent 已注册集群的destination.name。
此时 principal 是所有自治 agent 的集中视图:spec 修改会被回滚,但 sync、refresh、resource 操作仍可下发转发。
五、AppProject 跨集群同步:路由与隔离 🔐
AppProject 通常位于 argocd 命名空间,无法像 Application 那样直接按 namespace 路由,因此 argocd-agent 采用了基于 glob 模式匹配的分发策略。
Managed 模式——principal 依据两个字段判断 AppProject 应发给哪些 agent:
| 映射模式 | 路由条件 |
|---|---|
| Namespace-based | agent 名须同时匹配 spec.sourceNamespaces 与 spec.destinations[].name |
| Destination-based | 仅需匹配 spec.destinations[].name(sourceNamespaces 保留并控制工作集群内 app 命名空间) |
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: my-project
namespace: argocd
spec:
sourceNamespaces:
- agent-* # namespace-based 模式下:路由条件之一
destinations:
- name: agent-* # 路由条件:匹配所有 agent-* 命名的 agent
namespace: "guestbook"
server: "*"
sourceRepos:
- "*"
下发到 agent 后,AppProject 会被转换:只保留匹配该 agent 的 destinations 并改写为本集群、roles 移除、impersonation 条目按 agent 过滤——ServiceAccount/Role 本体不同步,需平台团队自行保证各集群存在。此外,deny 模式(!name)可显式将某个 agent 排除在分发之外。
Autonomous 模式——AppProject 在 agent 集群创建后上报 principal,名称自动加 agent 前缀(agent-production-my-project),destinations 全部改写为指向该 agent,principal 上的副本用于 API/UI 校验操作合法性,而非参与调和。
完整行为参见 AppProject 同步(managed) 与 AppProject 同步(autonomous)。
六、精细控制:ignore-sync 标签 🏷️
有时你希望某个资源只留在本端:控制平面的基础设施 Application 不该被下发、agent 的本地工具类应用不该被上报。只需加一个标签即可豁免同步:
metadata:
labels:
argocd-agent.argoproj-labs.io/ignore-sync: "true"
该标签对 Application 与 AppProject 均生效,参考 Ignore sync label。
七、常见问题排查清单 🛠️
| 现象 | 排查方向 |
|---|---|
| Application 未出现在 agent | namespace 模式:核对 app namespace 与 agent 名;destination 模式:核对 destination.name 且两端均已启用对应标志 |
| AppProject 未分发 | agent 须为 managed 模式;核对 destinations/sourceNamespaces 的 glob 模式与大小写;确认 agent 已连接 |
| 状态不更新 | 检查 agent 是否在线、agent 集群 application-controller 是否运行、source UID 注解是否正确 |
| UI 提示缓存读取错误 | 确认 principal 与 agent 映射模式一致(混用会导致 Redis 缓存 key 不匹配) |
| 同步冲突 | source UID 不匹配通常可通过重建 Application 自动解决;仍失败则删除后在真理之源侧重建 |
八、最佳实践与延伸阅读 ✅
- 新建环境直接用 destination-based mapping,避免后续迁移带来的 namespace 改写与缓存失效;
- 命名即契约:agent 名、
destination.name、AppProject glob 模式三者保持一致的命名规范; - 禁止在 agent 集群直改托管模式的 Application,所有变更走 principal;
- 用
--allowed-namespaces以 glob 模式收紧 agent 与 principal 可操作的命名空间范围; - 监控两侧的 Application 创建/更新/删除事件、状态上报频率与同步错误指标。
核心文档与源码索引:
- 应用同步(managed):docs/user-guide/managed-agent/applications-managed-mode.md
- 应用同步(autonomous):docs/user-guide/autonomous-agent/applications-autonomous-mode.md
- 映射模式对比与迁移:docs/user-guide/managed-agent/agent-mapping.md
- Application 管理逻辑:internal/manager/application/
- AppProject 管理逻辑:internal/manager/appproject/
- principal 侧 Kubernetes 后端:internal/backend/kubernetes/application/kubernetes.go、internal/backend/kubernetes/appproject/kubernetes.go
掌握以上机制后,你就可以让 Application 与 AppProject 在数百个集群间自主流动,而整个车队始终只有一个入口。


