使用 CephObjectStoreUser(Ceph Driver)控制 COSI Bucket 的访问权限和配额
Kubernetes 管理员可以结合 CephObjectStoreUser(COSU)、BucketClass/BucketClaim 以及 BucketAccessClass/BucketAccess,为由 Ceph RGW 支持的 COSI bucket 实现 最小权限访问 和 配额强制执行。
你将构建的内容
- 一个带有显式 capability 和可选按用户配额的 CephObjectStoreUser;
- 一个 BucketClass,用于告诉 Ceph COSI driver 需要使用哪个 COSU 凭证;
- 一个或多个 BucketClaim,用于创建 bucket;
- 使用 BucketAccessClass/BucketAccess 为不同 workload 提供细粒度凭证(只读、只写、读写),并支持可选的匿名读取。
目录
前提条件步骤 1 — 创建 CephObjectStoreUser(包含 capability 和配额)步骤 2 — 定义绑定到 CephObjectStoreUser 的 BucketClass步骤 3 — 使用 BucketClaim 创建 bucket步骤 4 — 使用 BucketAccessClass/BucketAccess 发放最小权限凭证示例BucketAccessClass(只读)使用 BucketAccess 签发凭证步骤 5 — 匿名公开读取(可选)步骤 6 — 配额控制:在哪里强制以及如何修改运维与故障排查清理前提条件
- 一个运行正常的 Ceph 集群,已安装 RGW 和 Rook。
- 已安装 COSI 插件。
- 集群管理员权限(用于创建集群作用域资源)。
步骤 1 — 创建 CephObjectStoreUser(包含 capability 和配额)
CephObjectStoreUser 是 driver 用于在 RGW 中执行 bucket 操作的 service account。它必须位于 rook-ceph namespace 中,并且目标指向你的 CephObjectStore。
获取生成的访问密钥(Rook 会为该用户创建一个 Secret):
这些 COSU 凭证由 driver(而不是你的应用)使用,用于代表你创建/删除 bucket。
步骤 2 — 定义绑定到 CephObjectStoreUser 的 BucketClass
BucketClass 会指示 driver 在创建 bucket 时使用哪个 COSU Secret。
deletionPolicy控制在删除BucketClaim时 bucket 的物理生命周期(DeletevsRetain)。
步骤 3 — 使用 BucketClaim 创建 bucket
通过引用 BucketClass,在你的应用 namespace 中创建 bucket。
等待 status.bucketReady: true,并记录 status.bucketName,它表示实际的 RGW bucket 名称。
步骤 4 — 使用 BucketAccessClass/BucketAccess 发放最小权限凭证
使用 BucketAccessClass 定义策略模板,并通过 BucketAccess 为每个 workload 签发凭证。支持的策略包括:readonly、writeonly、readwrite。通过设置 parameters.anonymous: "true"(字符串)即可启用匿名读取。
示例 BucketAccessClass(只读)
使用 BucketAccess 签发凭证
driver 会写入一个在 credentialsSecretName 中指定名称的 Secret。对 .data.BucketInfo 进行解码(base64)后,即可获得 S3 client 所需的 secretS3.endpoint、accessKeyID 和 accessSecretKey。
提示:为每个 Deployment/Job 签发不同的凭证,便于在不影响其他 workload 的情况下进行轮换和吊销。
步骤 5 — 匿名公开读取(可选)
如果你需要公开静态资源托管:
将它通过 BucketAccess 绑定到你的 BucketClaim。一旦授予成功,对象即可通过未认证的 HTTP GET 访问(请确保网络暴露方式符合要求)。
步骤 6 — 配额控制:在哪里强制以及如何修改
作用范围: CephObjectStoreUser 上的 quotas 区块按 用户级别 生效,并由 RGW 对该用户拥有的所有 bucket 统一执行。
maxBuckets:用户可创建/拥有的 bucket 数上限。maxObjects:用户可存储的对象总数上限(跨 bucket)。maxSize:允许该用户使用的总逻辑大小。
更新配额 通过编辑 COSU 资源完成:
设计选择: 保持 COSU 配额 相对严格,以限制影响范围。使用 最小权限策略 通过 BAC/BA 限制某一组应用凭证在 bucket 内 可以执行的操作。
运维与故障排查
- Namespace 放置:
CephObjectStoreUser及其 Secret 必须位于rook-ceph。应用级资源(BucketClaim、BucketAccess)应位于应用 namespace 中。 - 策略未生效:确认 BAC 中的
bucketAccessClassName和parameters.policy(readonly|writeonly|readwrite)。 - 匿名读取失败:确保
anonymous: "true"是 字符串,不是布尔值;检查 endpoint 暴露以及 HTTP 访问路径(/<bucket>/<object>)。 - 找不到密钥:检查
BucketAccessSecret,并解码.data.BucketInfo。 - Bucket 一直未就绪:检查 controller/driver 日志(例如
kubectl -n cpaas-system logs deploy/ceph-cosi-driver -c ceph-cosi-driver)。 - 轮换:创建新的
BucketAccess,将 workload 切换到新的 Secret,然后删除旧的 Secret/BA。
清理
- 通过删除其
BucketAccess以及引用的 Secret,移除某个 workload 的凭证。 - 删除 bucket:删除
BucketClaim(行为取决于BucketClass.deletionPolicy)。如果后端因为 bucket 非空而拒绝删除,请先删除对象。