注意
本文档适用于 Ceph 的开发版本。
RGW 多租户
版本 Jewel 新增。
多租户功能允许通过将存储桶和用户隔离到所谓的 租户 下,同时使用同名的存储桶和用户。例如,这可能对于允许 Swift API 用户创建名称容易冲突的存储桶(如“test”或“trove”)很有用。
从 Jewel 版本开始,每个用户和存储桶都位于一个租户下。为了兼容性,提供了一个名称为空的“旧版”租户。每当引用存储桶时没有明确指定租户时,就会使用一个隐式租户,该隐式租户取自执行操作的用户。由于现有的用户位于旧版租户下,他们可以像以前一样继续创建和访问存储桶。RADOS 中的对象布局以兼容的方式扩展,确保平稳升级到 Jewel。
管理带有明确租户的用户
租户本身没有任何操作。当管理用户时,它们会根据需要出现和消失。为了创建、修改和删除带有明确租户的用户,可以提供一个额外的选项 --tenant,或者在 radosgw-admin 命令的参数中使用语法 ‘<tenant>$<user>’。
示例
创建用户 testx$tester 以通过 S3 访问
# radosgw-admin --tenant testx --uid tester --display-name "Test User" --access_key TESTER --secret test123 user create
创建用户 testx$tester 以通过 Swift 访问
# radosgw-admin --tenant testx --uid tester --display-name "Test User" --subuser tester:test --key-type swift --access full user create
# radosgw-admin --subuser 'testx$tester:test' --key-type swift --secret test123
注意
带有明确租户的子用户必须在 shell 中引用。
租户名称只能包含字母数字字符和下划线。
访问带有明确租户的存储桶
当客户端应用程序访问存储桶时,它始终使用特定用户的凭据进行操作。如上所述,每个用户都属于一个租户。因此,每个操作在其上下文中都有一个隐式租户,用于在未明确指定租户时使用。因此,只要引用的存储桶和引用的用户属于同一个租户,就保持与先前版本的完全兼容性。换句话说,只有在访问另一个租户的存储桶时才会发生不寻常的情况。
用于指定明确租户的扩展因所使用的协议和身份验证系统而异。
S3
对于 S3,使用冒号字符分隔租户和存储桶。因此,示例 URL 将是
https://ep.host.dom/tenant:bucket
这是一个简单的 Python 示例
1 from boto.s3.connection import S3Connection, OrdinaryCallingFormat
2 c = S3Connection(
3 aws_access_key_id="TESTER",
4 aws_secret_access_key="test123",
5 host="ep.host.dom",
6 calling_format = OrdinaryCallingFormat())
7 bucket = c.get_bucket("test5b:testbucket")
请注意,无法使用主机名提供明确的租户。主机名不能包含冒号或任何其他在存储桶名称中无效的分隔符。使用句点会创建模糊的语法。因此,必须使用 URL 路径中的存储桶格式。
由于原生 S3 API 不处理多租户而 radosgw 的实现处理多租户,在处理签名 URL 和公共读取 ACL 时情况变得有点复杂。
签名 URL 确实包含
AWSAccessKeyId查询参数,radosgw 可以从中辨别拥有存储桶的正确用户和租户。换句话说,生成签名 URL 的应用程序应该能够只获取未带前缀的存储桶名称,并生成一个签名 URL,该 URL 本身包含不带租户前缀的存储桶名称。但是,如果选择这样做,也可以包含前缀。因此,访问属于租户
7188e165c0ae4424ac68ae2e89a05c50的容器foo中的对象bar的签名 URL,可以通过http://<host>:<port>/foo/bar?AWSAccessKeyId=b200fb6634c547199e436a0f93c0c46e&Expires=1542890806&Signature=eok6CYQC%2FDwmQQmqvY5jTg6ehXU%3D访问,也可以通过http://<host>:<port>/7188e165c0ae4424ac68ae2e89a05c50:foo/bar?AWSAccessKeyId=b200fb6634c547199e436a0f93c0c46e&Expires=1542890806&Signature=eok6CYQC%2FDwmQQmqvY5jTg6ehXU%3D访问,具体取决于在签名生成时是否传入了租户前缀。具有 公共读取 ACL 的存储桶旨在由 HTTP 客户端读取,而 不 包含任何允许 radosgw 辨别租户的查询参数。因此,可公开读取的对象必须始终使用带有租户前缀的存储桶名称进行访问。
因此,如果在一个属于租户
7188e165c0ae4424ac68ae2e89a05c50的容器foo中的对象bar上设置了公共读取 ACL,您需要通过公共 URLhttp://<host>:<port>/7188e165c0ae4424ac68ae2e89a05c50:foo/bar访问该对象。
使用内置身份验证器的 Swift
待定 -- 尚未在 test_multen.py 中
使用 Keystone 的 Swift
在默认配置中,尽管原生 Swift 具有固有的多租户特性,但 radosgw 并未为 Swift API 启用多租户。这是为了确保带有旧版存储桶(即 radosgw 支持多租户之前创建的存储桶)的设置中,这些存储桶保留其双 API 能力,可以使用 S3 或 Swift 进行查询和修改。
如果要为 Swift 启用多租户,特别是如果您的用户仅通过 OpenStack Keystone 进行身份验证,则应使用以下 ceph.conf 配置选项启用基于 Keystone 的多租户
rgw keystone implicit tenants = true
启用此选项后,任何新连接的用户(无论他们是使用 Swift API 还是 Keystone 身份验证的 S3)都会提示 radosgw 创建一个名为 <tenant_id>$<tenant_id 的用户,其中 <tenant_id> 是 Keystone 租户(项目)UUID --- 例如,7188e165c0ae4424ac68ae2e89a05c50$7188e165c0ae4424ac68ae2e89a05c50。
每当该用户创建 Swift 容器时,radosgw 会在内部将给定的容器名称转换为 <tenant_id>/<container_name>,例如 7188e165c0ae4424ac68ae2e89a05c50/foo。这确保了如果有两个或多个不同的租户都创建了一个名为 foo 的容器,radosgw 能够通过它们的租户前缀透明地辨别它们。
也可以通过将 rgw keystone implicit tenants 设置为 s3 或 swift 来限制隐式租户的影响仅适用于 swift 或 s3。这可能主要对以前使用过较旧版本 ceph 的隐式租户的用户有用,因为在较旧版本中隐式租户仅适用于 swift 协议。
注意事项和已知问题
需要明确的是,目前无法在其他租户中创建存储桶。新创建的存储桶的所有者是从身份验证信息中提取的。