OpenStack Swift Quotas初探(Grizzly)

Swift组件是Openstack的对象存储(Object Storage)解决方案。在早期的版本中,swift对于配额是没有限制的,不能够对不同用户所使用的空间进行限制。后来出现了开源的中间件 swquota(https://github.com/cschwede/swquota)可以对swift做出配额的限制,如今在2013年4月发布的Grizzly版本Openstack中,swift(1.8.0)集成了swquota中间件,以下是对此功能的初步探究。

在新版本的swift中的配额主要体现在Container Quotas与Account Quotas两个功能上,分别是对Container和Account上传文件的大小、个数等方面进行限制,需要使用此功能首先要在/etc/swift/proxy-server.conf文件中进行配置,修改完后重启swift服务:

#1.修改[pipeline:main]

[pipeline:main]

pipeline = catch_errors healthcheck cache ratelimit authtoken keystoneauth account-quotas container-quotas proxy-logging proxy-server

#2.加入[filter:container-quotas]与[filter:account-quotas]
[filter:container-quotas]
use = egg:swift#container_quotas
[filter:account-quotas]
use = egg:swift#account_quotas


配置重启完毕,需要对配额进行设置,这个过程需要设置reseller用户角色
1. 假定添加名为bingo的tenant
keystone --os-username admin --os_password adminpwd --os_tenant_name admin --os_auth_url :5000/v2.0 tenant-create --name bingo --description bingo_tenant --enabled true
2.在bingo下添加用户reseller
keystone --os-username admin --os_password adminpwd --os_tenant_name admin --os_auth_url :5000/v2.0 user-create --name reseller --tenant-id tenant_id --pass bingo --email bingo@example.com --enabled true
3.将reseller加入ResellerAdmin角色中
keystone role-list
keystone user-role-add --user-id xxxxx --role-id xxxxx --tenant-id xxxxx

添加reseller用户之后就可以设置相关的配额了:

Container_Quotas:

1. X-Container-Meta-Quota-Bytes -- 目标container可上传的最大字节数

2. X-Container-Meta-Quota-Count -- 目标container可上传的最大文件个数

Account_Quotas:

1. X-Account-Meta-Quota-Bytes -- 单个上传最大字节数

2. Quota-Byes -- 1必须配合2才能有效果

设置方法:

swift -V 2 -A :5000/v2.0 -U test:reseller -K reseller post -m quota-bytes:5000

注:reseller用户必须在ResellerAdmin角色中,这个限额只针对test tenant有效

取消设置

swift -V 2 -A :5000/v2.0 -U test:reseller -K reseller post -m quota-bytes:

Bug fix:

使用keystone做认证时,针对Quota-Byes设置可能会出现 [403 Forbidden] 错误

修改swift/common/middleware/account_quotas.py 文件

new_quota = request.headers.get('X-Account-Meta-Quota-Bytes')

#Add by kevin start
eccp_roles = request.environ.get('HTTP_X_ROLES', '')
if isinstance(eccp_roles, basestring):
    if (set(eccp_roles.split(',')) & set({'reseller','reseller_admin','ResellerAdmin'})):
        request.environ['reseller_request'] = True
#Add by kevin end

if request.environ.get('reseller_request') is True:
    if new_quota and not new_quota.isdigit():
        return HTTPBadRequest()
    return self.app

使得当用户加入ResellerAdmin角色之后能够通过验证。

另外需要注意的是在实验过程中不断发生swift与keystone验证401 Unauthorized的问题,经调试发现是keystone中关于swift的endpoint的注册IP地址使用的是虚拟机分配的地址(本人是在虚拟机的环境下再安装虚拟机实验,所以第一层虚拟机的地址是由openstack自动分配的fixed ip10.0.0.x类型,这样其他几台机器如果通过这个地址进行权限验证就可能出现问题,解决方法是将endpoint的地址修改为浮动ip),使用winpdb( )进行调试是非常不错的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/57eebc9f8aad27ece74fc533f55565db.html