找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2399

积分

0

好友

325

主题
发表于 9 小时前 | 查看: 0| 回复: 0

在 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 按钮。

ArgoCD 项目列表与新建按钮

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

创建名为 demo 的 ArgoCD 项目

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)。

配置 dev 角色的详细权限策略

权限验证:使用角色令牌 (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

使用 dev 角色令牌成功列出应用

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 如何利用 ProjectProjectRole 实现多层次的权限控制:

  1. 资源隔离:通过配置 Source Repositories 和 Destinations,将项目可用的代码源和部署目标限制在指定范围。
  2. 操作授权:通过 RBAC 策略,为不同角色(如 dev)定义精细化的操作权限(允许 get, sync,拒绝 delete)。
  3. 安全默认值:遵循最小权限原则,未明确允许的操作均被拒绝。

这种机制非常适合在云栈社区这样的多团队协作场景中落地,它能够清晰界定各团队的责任边界,提升整体的部署安全性与运维效率,是构建企业级 GitOps 平台不可或缺的一环。




上一篇:iFlow CLI实战指南:7个关键认知,助你高效解决工程问题
下一篇:Java多线程开发:Synchronized与ReentrantLock锁机制核心对比与选型指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-25 19:23 , Processed in 0.259950 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表