【GitOps·ArgoCD篇】RBAC与多租户:团队权限隔离实战

前言

当 ArgoCD 管理多个团队的应用时,权限隔离是必须的------A 团队不能看到或操作 B 团队的应用,开发者不能修改生产配置。本篇从零配置 ArgoCD 的 RBAC 和 SSO,实现企业级多租户。


一、ArgoCD 认证体系

复制代码
认证(Authentication): 你是谁?
  - 本地用户(admin 和手动创建的用户)
  - SSO(GitHub/GitLab/Google/LDAP/OIDC)

授权(Authorization): 你能做什么?
  - RBAC 策略
  - AppProject 限制

认证方式对比

方式 适用场景 配置复杂度
本地用户 小团队
SSO - GitHub 团队用 GitHub
SSO - GitLab 团队用 GitLab
SSO - OIDC 企业有 IdP(Okta/Keycloak) 中高
SSO - LDAP 传统企业

二、配置 SSO(以 GitHub 为例)

注册 OAuth App

复制代码
GitHub → Settings → Developer settings → OAuth Apps → New OAuth App
  Application name: ArgoCD
  Homepage URL: https://argocd.mycompany.com
  Authorization callback URL: https://argocd.mycompany.com/api/dex/callback
  → 记录 Client ID 和 Client Secret

配置 Dex

yaml 复制代码
# argocd-cm ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  url: https://argocd.mycompany.com

  # Dex 配置
  dex.config: |
    connectors:
      - type: github
        id: github
        name: GitHub
        config:
          clientID: $GITHUB_CLIENT_ID
          clientSecret: $GITHUB_CLIENT_SECRET
          orgs:
            - name: myorg           # 组织名
              teams:
                - devops-team        # 团队名
                - team-alpha
                - team-beta

          # 加载所有团队(不只是上面列出的)
          loadAllGroups: false

          # 团队名映射
          teamNameField: slug

在 Secret 中存储 OAuth 凭据

bash 复制代码
# 更新 argocd-secret
kubectl create secret generic argocd-secret \
  -n argocd \
  --from-literal=github.clientID=$GITHUB_CLIENT_ID \
  --from-literal=github.clientSecret=$GITHUB_CLIENT_SECRET \
  --dry-run=client -o yaml | kubectl apply -f -

# 重启 Dex Server
kubectl rollout restart deployment argocd-dex-server -n argocd

登录后看到的身份

复制代码
SSO 登录后,用户身份为:
  org:myorg:team:devops-team   → 对应 GitHub 组织 myorg 下的 devops-team
  org:myorg:team:team-alpha    → 对应 team-alpha 团队

三、RBAC 策略配置

策略语法

复制代码
p, <role/user/group>, <resource>, <action>, <project/application>, <allow/deny>

示例:
  p, role:admin, applications, *, */*, allow      → admin 可以操作所有应用
  p, role:viewer, applications, get, */*, allow     → viewer 只能查看
  p, org:myorg:team:team-alpha, applications, *, team-alpha/*, allow  → team-alpha 可以操作自己的应用

资源和操作

资源 可选操作 说明
applications get, create, update, delete, sync, *, 应用管理
clusters get, create, update, delete 集群管理
certificates get, create, update, delete 证书管理
repositories get, create, update, delete 仓库管理
accounts get, update 账户管理
projects get, create, update, delete 项目管理
gpgkeys get, create, delete GPG 密钥

RBAC ConfigMap

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
  namespace: argocd
data:
  # 默认策略(未匹配到任何规则的用户)
  policy.default: role:readonly

  # 详细策略
  policy.csv: |
    # === 角色定义 ===

    # 全局管理员
    p, role:admin, applications, *, */*, allow
    p, role:admin, clusters, *, *, allow
    p, role:admin, repositories, *, *, allow
    p, role:admin, projects, *, *, allow
    p, role:admin, accounts, *, *, allow

    # 只读用户
    p, role:readonly, applications, get, */*, allow
    p, role:readonly, clusters, get, *, allow
    p, role:readonly, repositories, get, *, allow
    p, role:readonly, projects, get, *, allow

    # team-alpha 团队
    p, role:team-alpha, applications, *, team-alpha/*, allow
    p, role:team-alpha, projects, get, team-alpha, allow
    p, role:team-alpha, applications, sync, team-alpha/*-prod, deny
    # team-alpha 可以管理自己的应用,但不能同步生产

    # team-beta 团队
    p, role:team-beta, applications, *, team-beta/*, allow
    p, role:team-beta, projects, get, team-beta, allow

    # === 角色绑定 ===

    # GitHub 团队 → ArgoCD 角色
    g, org:myorg:team:devops-team, role:admin
    g, org:myorg:team:team-alpha, role:team-alpha
    g, org:myorg:team:team-beta, role:team-beta

    # 本地用户 → 角色
    g, alice, role:admin
    g, bob, role:readonly

培训要点 :RBAC 策略中 deny 优先于 allow。即使前面的规则 allow 了,后面的 deny 仍然可以阻止。利用这一点可以给某个角色开了权限但禁掉特定操作。


四、AppProject 权限隔离

创建团队 Project

yaml 复制代码
# team-alpha 的 Project
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-alpha
  namespace: argocd
spec:
  description: Team Alpha applications

  # 允许的 Git 仓库
  sourceRepos:
    - https://github.com/myorg/team-alpha-*
    - https://github.com/myorg/shared-deploy

  # 允许的目标
  destinations:
    # 只能部署到 team-alpha- 开头的命名空间
    - server: https://kubernetes.default.svc
      namespace: team-alpha-*
    # 可以部署到共享的 dev 命名空间
    - server: https://kubernetes.default.svc
      namespace: shared-dev

  # 允许的集群
  sourceNamespaces:
    - team-alpha-dev
    - team-alpha-test

  # 允许的资源类型
  namespaceResourceWhitelist:
    - group: '*'
      kind: '*'

  # 禁止的资源类型
  namespaceResourceBlacklist:
    - group: ''
      kind: ResourceQuota      # 不允许创建 ResourceQuota
    - group: ''
      kind: LimitRange

  # 集群资源白名单(如 Namespace)
  clusterResourceWhitelist:
    - group: ''
      kind: Namespace

  # 同步窗口
  syncWindows:
    - kind: allow
      schedule: '0 9 * * 1-5'
      duration: 12h
      applications:
        - '*'
      manualSync: true
    - kind: deny
      schedule: '0 0 * * 0,6'  # 周末禁止同步
      duration: 48h
      applications:
        - '*-prod'
      manualSync: false

  # 角色定义(配合 RBAC)
  roles:
    - name: developer
      description: Team Alpha developers
      policies:
        - p, proj:team-alpha:developer, applications, get, team-alpha/*, allow
        - p, proj:team-alpha:developer, applications, sync, team-alpha/*-dev, allow
        - p, proj:team-alpha:developer, applications, sync, team-alpha/*-prod, deny
      groups:
        - org:myorg:team:team-alpha

    - name: lead
      description: Team Alpha leads
      policies:
        - p, proj:team-alpha:lead, applications, *, team-alpha/*, allow
      groups:
        - org:myorg:team:team-alpha-leads

Application 关联 Project

yaml 复制代码
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-prod
  namespace: argocd
spec:
  project: team-alpha          # 关联到 team-alpha 项目
  source:
    repoURL: https://github.com/myorg/team-alpha-myapp-deploy.git
    path: overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: team-alpha-myapp-prod

五、多租户最佳实践

1. 每个团队一个 Project

复制代码
AppProject:
  team-alpha → 限制到 team-alpha-* 命名空间
  team-beta  → 限制到 team-beta-* 命名空间
  platform   → 可以操作 kube-system 等基础设施命名空间

2. SSO Group → Project Role 映射

复制代码
GitHub Teams:
  myorg:devops-team → ArgoCD role:admin
  myorg:team-alpha  → AppProject team-alpha role:developer
  myorg:team-beta   → AppProject team-beta role:developer

3. 生产环境额外保护

yaml 复制代码
# 生产应用不允许自动同步,必须手动审批
spec:
  project: team-alpha
  syncPolicy:
    # 不配置 automated → 手动同步
    syncOptions:
      - CreateNamespace=true
  # 配合同步窗口限制时间

4. 审计日志

bash 复制代码
# 查看 ArgoCD 操作日志
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-server | grep "GRPC"

# 查看 Application 变更事件
kubectl get events -n argocd --field-selector reason=ApplicationSync

# 定期导出审计日志
argocd admin settings rbac can --policy-file rbac-policy.csv \
  role:team-alpha applications sync team-alpha/myapp-prod
# 输出: yes / no

六、本篇要点回顾

  1. 认证用 SSO(GitHub/GitLab/OIDC),不推荐本地用户管理大量用户
  2. RBAC 策略语法:p, <subject>, <resource>, <action>, <object>, <allow/deny>
  3. deny 优先于 allow,可用于"开了权限但禁特定操作"
  4. AppProject 限制仓库、命名空间、资源类型、同步窗口
  5. SSO Group → Project Role 映射实现团队隔离
  6. 生产环境:手动同步 + 同步窗口 + 禁止自动同步

下一篇预告:《健康检查与资源钩子:自定义健康状态》------从权限进入运维,学习如何让 ArgoCD 更智能地判断应用健康状态。

相关推荐
heimeiyingwang13 天前
【GitOps·进阶篇】与 Terraform 集成:基础设施的 GitOps 管理
terraform·gitops
秋风点枝14 天前
第一篇:认识 Argo CD —— 从传统发布到云原生 GitOps
git·云原生·argocd
heimeiyingwang14 天前
【GitOps·进阶篇】密钥管理:Sealed Secrets、SOPS 与 External Secrets
gitops
秋风点枝14 天前
第二篇:安装 Argo CD + 第一次部署应用
kubernetes·github·argocd
heimeiyingwang14 天前
【GitOps·Flux篇】通知与告警:Webhook 集成与事件通知
flux·gitops
heimeiyingwang15 天前
【GitOps·Flux篇】多集群与多租户:Tenant 模型与权限隔离
flux·gitops
heimeiyingwang16 天前
【GitOps·Flux篇】核心概念:Source、Kustomization与HelmRelease
helm·flux·gitops
nvd1118 天前
K3s + ArgoCD 中的密码管理
数据库·oracle·argocd
heimeiyingwang21 天前
【GitOps·ArgoCD篇】健康检查与资源钩子:自定义健康状态
argocd·gitops