rgw multi-tenancy 多租户理解
一. 什么是multi-tenancy
在 J版之前,同一个ceph集群中不允许有同名的bucket和用户,这会引发一个比较诡异的问题,比如用户在创建bucket的时候回提示,”bucket” 已经存在,但是却没有访问的权限,因为这个bucket是其他用户创建的,用户创建的bucket默认只有创建者有访问权限(这个关系到bucket的policy) , 从J版开始,引入tenant(租户)的概念,不同一个tenant下得用户和bucket可以同名。
二. 测试multi-tenancy
为了兼容,J版之前的版本,rgw 默认创建一个tenant ,是个空的字符串 “”, 在创建用户的时候如果没有显式的指定tenant名字 就默认加入到 “” tenant
- 创建指定tenant的用户
# radosgw-admin user create --tenant tenant_test_1 --uid tenant_test_1_user1 --display-name "tenant_test_1_user1"
–tenant 指定
我们来看看这个用户的信息,这里需要显示的指定tenant,不然就会默认从 “” tenant 查找这个用户了
# radosgw-admin user info --uid tenant_test_1_user1 --tenant tenant_test_1 { "user_id": "tenant_test_1$tenant_test_1_user1", "display_name": "tenant_test_1_user1", "email": "", "suspended": 0, "max_buckets": 1000, "auid": 0, "subusers": [], "keys": [ { "user": "tenant_test_1$tenant_test_1_user1", "access_key": "LL95584F6ARSZ2R", "secret_key": "AmOy3iBVvxwT7Ct0lwPeOu7HJGsnek" } ], "swift_keys": [], "caps": [], "op_mask": "read, write, delete", . . .
可以看到用户的名字结构是
$ 组成的,目的是为了区分,通过 user list 一样可以看到。 - 不同tenant 下相同的user_id
# radosgw-admin user create --tenant tenant_test_2 --uid tenant_test_1_user1 --display-name "tenant_test_1_user1" # radosgw-admin user list [ "tenant_test_1$tenant_test_1_user1", "tenant_test_2$tenant_test_1_user1" ]
可以看到是不冲突的
- 测试不同tenant下相同id的bucket
用boto3 api,用两个不同用户的key创建相同id的bucket
创建部分代码如下
import boto3 import uuid class S3Cli(object): """S3 client""" def __init__(self, endpoint, key, secret): """inti connect param""" self.endpoint = endpoint self.key = key self.secret = secret self.s3 = object def connect(self): """return a connect""" self.s3 = boto3.client('s3', aws_access_key_id=self.key , aws_secret_access_key=self.secret , endpoint_url=self.endpoint) if __name__ == "__main__": endpoint = "http://172.26.2.52:7480" access_key = "xxxxx" secret_key = "xxxxxxxxxxxx" bid = "test-20181008" s3cli = S3Cli(endpoint, access_key, secret_key) s3cli.connect() s3cli.s3.create_bucket(Bucket=bid)
这里并不需要指定tenant,因为rgw是以key跟secret 去实践区分用户数据哪一个tenant,更换key和secret 执行两次代码
看看结果如何
# radosgw-admin bucket list [ "tenant_test_1/test-20181008", "tenant_test_2/test-20181008", ]
可以看到,bucket 是以
/ 区分的
这一有一个疑问,用户是可以访问不同bucket的,那用户可以访问不同tenant的bucket吗?要怎么访问?这个关系到bucket policy,用一篇关于bucket policy详细解释。