ArgoCD RBAC 模型
ArgoCD 使用 Casbin 实现 RBAC 权限控制。权限策略存储在 argocd-rbac-cm ConfigMap 中,基于 p(policy,权限规则)和 g(grouping,角色分配)两种规则。
role:readonly
内置只读角色。可以查看所有 Application、集群、仓库的状态信息,但不能执行任何写操作(同步、修改、删除等)。适合监控人员或普通开发者查看部署状态。
role:admin
内置管理员角色。拥有所有资源的全部权限,包括管理集群、仓库、用户等系统级操作。生产环境应严格限制此角色的分配人数。
policy.csv
自定义权限策略文件,使用 Casbin 的 p/g 语法。p 规则格式为:
p, subject, resource, action, object, allow/deny。# argocd-rbac-cm ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
policy.default: role:readonly # 未匹配用户的默认角色
policy.csv: |
# 定义开发者角色(只能同步 dev 项目的应用)
p, role:dev, applications, get, dev/*, allow
p, role:dev, applications, sync, dev/*, allow
p, role:dev, applications, action, dev/*, allow
# 定义 SRE 角色(可以管理所有应用,但不能删除)
p, role:sre, applications, get, */*, allow
p, role:sre, applications, sync, */*, allow
p, role:sre, applications, update, */*, allow
p, role:sre, clusters, get, *, allow
# 将 GitHub 团队映射到角色
g, my-org:developers, role:dev
g, my-org:sre-team, role:sre
g, alice@example.com, role:admin
AppProject:多租户隔离
AppProject 是 ArgoCD 的多租户机制,通过白名单限制 Application 能访问的资源范围:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-payments
namespace: argocd
spec:
description: 支付团队的应用项目
# 允许从哪些 Git 仓库拉取配置
sourceRepos:
- https://github.com/my-org/payments-config
- https://charts.bitnami.com/bitnami
# 允许部署到哪些集群和命名空间
destinations:
- server: https://prod-cluster.example.com:6443
namespace: payments # 只允许部署到 payments 命名空间
- server: https://dev-cluster.example.com:6443
namespace: payments-* # 通配符匹配
# 允许部署的 K8s 资源类型白名单
clusterResourceWhitelist:
- group: ''
kind: Namespace
namespaceResourceWhitelist:
- group: apps
kind: Deployment
- group: ''
kind: Service
- group: ''
kind: ConfigMap
# 禁止 Prune(防止意外删除生产资源)
syncWindows: # 同步窗口(限制同步时间)
- kind: allow
schedule: '10 2 * * *' # 只允许每天凌晨 2:10 自动同步
duration: 1h
applications: ['*']
SSO 集成:GitHub OAuth
# argocd-cm ConfigMap 配置 Dex GitHub connector
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
url: https://argocd.example.com
dex.config: |
connectors:
- type: github
id: github
name: GitHub
config:
clientID: $dex.github.clientID # 引用 Secret
clientSecret: $dex.github.clientSecret
redirectURI: https://argocd.example.com/api/dex/callback
orgs:
- name: my-org # 只允许此 GitHub 组织成员登录
teams:
- developers
- sre-team
ArgoCD Image Updater
argocd-image-updater 是 ArgoCD 的子项目,它监控容器镜像仓库,当检测到符合策略的新镜像 tag 时,自动更新 Application 的镜像版本(通过修改 Git 仓库或直接更新 Application 参数)。
# Application 上添加 image-updater 注解
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
annotations:
argocd-image-updater.argoproj.io/image-list: myapp=ghcr.io/my-org/my-app
argocd-image-updater.argoproj.io/myapp.update-strategy: semver
argocd-image-updater.argoproj.io/myapp.allow-tags: regexp:^v[0-9]+\.[0-9]+\.[0-9]+$
argocd-image-updater.argoproj.io/write-back-method: git # 写回 Git(GitOps)
argocd-image-updater.argoproj.io/git-branch: main
External Secrets Operator(ESO)
ESO 是另一种主流的 Secrets 管理方案,将 Vault/AWS SSM/Azure KeyVault 中的密钥同步为 K8s Secret,无需修改应用代码:
# SecretStore:定义 Secret 来源(Vault)
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault-backend
spec:
provider:
vault:
server: http://vault:8200
path: secret
auth:
kubernetes:
mountPath: kubernetes
role: argocd-role
---
# ExternalSecret:声明要同步的 Secret
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: app-secrets
spec:
refreshInterval: 5m # 每 5 分钟同步一次
secretStoreRef:
name: vault-backend
kind: SecretStore
target:
name: app-secrets # 生成的 K8s Secret 名称
data:
- secretKey: database-url
remoteRef:
key: my-app/production
property: database-url
本章小结
企业级 ArgoCD 安全体系需要四层防护:RBAC 精细控制操作权限、AppProject 限制部署范围和资源类型、SSO 对接企业身份系统(GitHub/LDAP)、ESO/AVP 安全管理 Secrets。Image Updater 完成自动镜像 CD 的最后一环。syncWindows 提供时间窗口控制,防止在业务高峰期意外触发部署。