注意

本文档适用于 Ceph 开发版本。

RGW多租户

Jewel 版本中的新增功能。

多租户功能允许通过在所谓的tenants下隔离它们来同时使用同名存储桶和用户。

从Jewel版本开始,每个用户和存储桶都位于一个租户下。

使用显式租户管理用户

租户本身没有任何操作。它们根据需要出现和消失,当管理用户时。为了创建、修改和删除具有显式租户的用户,可以提供额外的选项--tenant,或者在radosgw-admin命令的参数中使用语法‘<租户>$<用户>’。

示例

创建一个用户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

Note

带有显式租户的子用户必须在shell中加引号。

租户名称只能包含字母数字字符和下划线。

使用显式租户访问存储桶

当客户端应用程序访问存储桶时,它始终使用特定用户的凭证。如上所述,每个用户都属于一个租户。因此,每个操作在其上下文中都有一个隐式租户,如果未显式指定租户,则使用该租户。因此,只要引用的存储桶和引用的用户属于同一个租户,就会保持与之前版本的完全兼容性。only.

用于指定显式租户的扩展根据使用的协议和认证系统而有所不同。

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时,事情会变得有些复杂。

  • A 签名URL包含了AWSAccessKeyId查询参数,radosgw能够从中识别出拥有存储桶的正确用户和租户。换句话说,生成签名URL的应用程序应该能够仅获取未加前缀的存储桶名称,并生成一个本身包含存储桶名称而不带租户前缀的签名URL。然而,如果选择,也可以包括前缀来。

    因此,访问属于租户bar的容器foo中的对象7188e165c0ae4424ac68ae2e89a05c50可以通过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识别租户的查询参数。因此,必须始终使用带有租户前缀的存储桶名称来访问公开可读的对象。

    因此,如果您在属于租户bar的容器foo中的对象7188e165c0ae4424ac68ae2e89a05c50上设置了公共读取ACL,则需要通过公共URL访问该对象http://<host>:<port>/7188e165c0ae4424ac68ae2e89a05c50:foo/bar.

带有内置认证器的Swift

TBD -- 尚未在test_multen.py中实现

带有Keystone的Swift

在默认配置中,虽然原生Swift具有固有的多租户功能,但radosgw不会为Swift API启用多租户。这是为了确保具有旧存储桶的设置——即在使用radosgw支持多租户之前创建的存储桶——这些存储桶保留其双API功能,可以使用S3或Swift进行查询和修改。

如果您想为Swift启用多租户,特别是如果您的用户只针对OpenStack Keystone进行身份验证,您应该使用以下配置选项启用基于Keystone的多租户:ceph.conf配置选项:

rgw keystone implicit tenants = true

启用此选项后,任何新连接的用户(无论他们使用Swift API还是Keystone验证的S3)都会提示radosgw创建一个名为<tenant_id>$<tenant_id,其中<tenant_id>的用户,其中7188e165c0ae4424ac68ae2e89a05c50$7188e165c0ae4424ac68ae2e89a05c50.

每当该用户创建一个Swift容器时,radosgw内部会将给定的容器名称转换为<tenant_id>/<container_name>,例如7188e165c0ae4424ac68ae2e89a05c50/foo。这确保了如果有两个或多个不同的租户都创建一个名为foo的容器,radosgw能够通过租户前缀透明地识别它们。

还可以通过设置rgw keystone implicit tenantss3swift来限制隐式租户仅适用于swift或s3的效果。这将主要对那些之前使用隐式租户与旧版ceph的用户有用,其中隐式租户仅适用于swift协议。

注意事项和已知问题

毋庸置疑,目前无法在其他租户中创建存储桶。新创建存储桶的所有者从认证信息中提取。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.