在 GitOps 实践与团队协作中,如何安全、清晰地进行权限隔离是至关重要的一环。ArgoCD 通过 Project(项目) 这一顶层设计单元,提供了强大的访问控制与资源隔离能力,确保不同团队或应用程序之间的界限分明,互不干扰。
ArgoCD Project 是什么?
Project 是 ArgoCD 的顶层设计单元,一个 Project 可以用来管理一组应用 (Applications)。它的核心价值在于,通过配置访问控制策略,实现对应用资源的精细化管理与隔离。这不仅是多团队协同的最佳实践,也是保障运维安全的基础。
具体来说,一个 ArgoCD Project 可以控制以下三个维度的权限:
- 源仓库访问:控制该项目允许从哪些 Git 仓库拉取配置。
- 部署目标:限制该项目中的应用可以部署到哪些 Kubernetes 集群及命名空间。
- 操作权限:基于 RBAC,限制可以对项目内资源执行哪些操作(如 get, sync, create, delete)。
一个典型的最佳实践是,为每个 GitLab Group 在 ArgoCD 中创建对应的 Project,从而实现组级资源的天然隔离。
实战:创建与配置 Project
1. 创建 Project
在 ArgoCD 管理界面,进入 Settings -> Projects,点击 + NEW PROJECT 按钮。

在弹出的创建窗口中,填写项目名称(例如 demo)和描述,然后点击 CREATE。

2. 配置 Project 资源范围
创建完成后,进入项目的配置页面。这里需要设置两个关键限制:
- SOURCE REPOSITORIES(源仓库):指定该项目允许访问的 Git 仓库路径,支持通配符。例如
https://git.example.com/my-group/*,表示只允许拉取该 my-group 下的仓库。
- DESTINATIONS(目标):指定该项目中的应用允许部署到的 Kubernetes 集群和命名空间。
通过这种配置,可以严格约束 demo 项目只能使用特定 Git 组的代码,并只能发布到指定的集群和命名空间,从而实现物理层面的资源隔离。

配置 ProjectRole 实现 RBAC 控制
ProjectRole 是在 Project 范围内进行访问控制的资源,它允许你对项目内的资源操作进行细粒度授权,例如定义“开发者只能同步应用,不能删除”。
在 Project 的配置页面,切换到 ROLES 标签页,点击 + ADD ROLE。

在弹出的角色配置界面,我们可以创建一个名为 dev 的角色,并为其配置权限策略 (Policy Rules)。例如,我们定义以下规则:
- 允许 (
allow) 对 demo 项目下的所有应用 (demo/*) 执行 get(查看)和 sync(同步)操作。
- 拒绝 (
deny) 对 demo 项目下的所有应用执行 delete(删除)操作。
对于未显式配置的权限(如 create),ArgoCD 的默认策略是拒绝 (deny)。

权限验证:使用角色令牌 (Token) 进行操作
配置好角色后,我们通过生成该角色的 JWT Token 来模拟开发者用户,验证权限控制是否生效。
1. 创建角色令牌
使用 ArgoCD CLI 为 demo 项目下的 dev 角色创建一个长期有效的令牌。
argocd proj role create-token demo dev
命令输出如下:
Create token succeeded for proj:demo:dev.
ID: 93b31f9b-2500-436f-a601-b2faae119cee
Issued At: 2026-01-15T11:26:37+08:00
Expires At: Never
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJwcm9qOmRlbW86ZGV2IiwibmJmIjoxNzY4NDQ3NTk3LCJpYXQiOjE3Njg0NDc1OTcsImp0aSI6IjkzYjMxZjliLTI1MDAtNDM2Zi1hNjAxLWIyZmFhZTExOWNlZSJ9.EY2R8GZJTv2TUjCUeyVRP1EpvsFEZsSCVZu_zORShpE
2. 使用 Token 进行授权操作
首先,我们登出当前的 admin 账户。
argocd logout 10.218.191.10:32698
然后,使用上一步获取的 Token 来执行操作。请注意,所有命令都需要附带 --auth-token <TOKEN> 参数。
a. 测试允许的操作:查看应用列表
argocd app list --auth-token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJwcm9qOmRlbW86ZGV2IiwibmJmIjoxNzY4NDQ3NTk3LCJpYXQiOjE3Njg0NDc1OTcsImp0aSI6IjkzYjMxZjliLTI1MDAtNDM2Zi1hNjAxLWIyZmFhZTExOWNlZSJ9.EY2R8GZJTv2TUjCUeyVRP1EpvsFEZsSCVZu_zORShpE
命令成功执行,列出了 demo 项目下的应用,例如 argocd-demo-app。

b. 测试允许的操作:触发应用同步
argocd app sync argocd-demo-app --auth-token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJwcm9qOmRlbW86ZGV2IiwibmJmIjoxNzY4NDQ3NTk3LCJpYXQiOjE3Njg0NDc1OTcsImp0aSI6IjkzYjMxZjliLTI1MDAtNDM2Zi1hNjAxLWIyZmFhZTExOWNlZSJ9.EY2R8GZJTv2TUjCUeyVRP1EpvsFEZsSCVZu_zORShpE
同步操作成功,返回了同步详情。
...
Sync Status: Synced to (9477d4a)
Health Status: Healthy
...
Phase: Succeeded
Message: successfully synced (all tasks run)
c. 测试拒绝的操作:删除应用
argocd app delete argocd-demo-app --auth-token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJwcm9qOmRlbW86ZGV2IiwibmJmIjoxNzY4NDQ3NTk3LCJpYXQiOjE3Njg0NDc1OTcsImp0aSI6IjkzYjMxZjliLTI1MDAtNDM2Zi1hNjAxLWIyZmFhZTExOWNlZSJ9.EY2R8GZJTv2TUjCUeyVRP1EpvsFEZsSCVZu_zORShpE
操作被拒绝,并返回明确的权限错误信息。
{"level":"fatal","msg":"rpc error: code = PermissionDenied desc = permission denied: applications, delete, demo/demo-app, sub: proj:demo:dev, iat: 2026-01-15T03:26:37Z","time":"2026-01-15T14:30:34+08:00"}
d. 测试未配置的操作:创建应用
我们并没有为 dev 角色配置 create 权限。
argocd app create demo-app2 --project demo --repo https://hgit.xxx.net/s02136/argo-demo.git --path manifests/ --sync-policy automatic --dest-namespace yunsheng --dest-server https://10.222.62.166:6443 --directory-recurse --auth-token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJwcm9qOmRlbW86ZGV2IiwibmJmIjoxNzY4NDQ3NTk3LCJpYXQiOjE3Njg0NDc1OTcsImp0aSI6IjkzYjMxZjliLTI1MDAtNDM2Zi1hNjAxLWIyZmFhZTExOWNlZSJ9.EY2R8GZJTv2TUjCUeyVRP1EpvsFEZsSCVZu_zORShpE
操作同样被拒绝,这验证了 ArgoCD 在 ProjectRole 中的默认策略是 “拒绝所有,显式允许”。
{"level":"fatal","msg":"rpc error: code = PermissionDenied desc = permission denied: applications, create, demo/demo-app2, sub: proj:demo:dev, iat: 2026-01-15T03:26:37Z","time":"2026-01-15T14:33:38+08:00"}
总结
通过上述实战,我们完整演示了 ArgoCD 如何利用 Project 和 ProjectRole 实现多层次的权限控制:
- 资源隔离:通过配置 Source Repositories 和 Destinations,将项目可用的代码源和部署目标限制在指定范围。
- 操作授权:通过 RBAC 策略,为不同角色(如
dev)定义精细化的操作权限(允许 get, sync,拒绝 delete)。
- 安全默认值:遵循最小权限原则,未明确允许的操作均被拒绝。
这种机制非常适合在云栈社区这样的多团队协作场景中落地,它能够清晰界定各团队的责任边界,提升整体的部署安全性与运维效率,是构建企业级 GitOps 平台不可或缺的一环。