本文档描述了Keystone与Swift集群的整合使用方法,即Swift通过Keystone完成用户的身份认证与权限控制,而不是采用自带的TempAuth。本文档假定如下前提条件:
用户已阅读文档《Keystone安装部署流程》和《Swift集群部署流程》,并按照上述文
1. 简介
本文档描述了Keystone与Swift集群的整合使用方法,即Swift通过Keystone完成用户的身份认证与权限控制,而不是采用自带的TempAuth。本文档假定如下前提条件:
用户已阅读文档《Keystone安装部署流程》和《Swift集群部署流程》,并按照上述文档分别部署了Keystone与Swift集群。
用户已掌握了Keystone与Swift的基本使用方法。
所有PC使用Ubuntu操作系统。
Keystone部署在PC1上,Swift集群部署在PC2和PC3上。
PC2和PC3都运行Swift的所有服务,既是Proxy Server,又是Storage Server,用户可以向任何一台发起存储服务请求。
Keystone为多Proxy Server的Swift集群提供身份认证与权限控制。(单Proxy Server的情况比较简单,相信看完本文档后你就懂了)
PC2和PC3构成memcached集群来提供Token缓存服务。
所有操作均在root用户下进行,并使用root作为Swift的用户和组。
所有机器都运行在局域网中。
使用回环设备和XFS文件系统作为Swift底层存储。
2. 安装部署
为了能够让Swift通过Keystone完成用户的身份认证与权限控制,我们需要在完成Keystone与Swift集群部署的基础上,稍作修改。
2.1 准备环境
PC 1 | PC 2 | PC 3 | |
机器类型: | PC物理机 | PC物理机 | PC物理机 |
操作系统: | Ubuntu-12.04-desktop | Ubuntu-12.04-desktop | Ubuntu-12.04-desktop |
用户类型: | root | root | root |
数据库: | sqlite3 | sqlite3 | sqlite3 |
IP地址: | 192.168.3.67(局域网) | 192.168.3.52(局域网) | 192.168.3.53(局域网) |
Keystone: | 是 | ||
Proxy Server: | 是 | 是 | |
Storage Server: | 是 | 是 | |
Auth: | Keystone | Keystone | |
Token缓存: | memcached | memcached |
2.2 版本说明
Swift版本:1.7.6
python-swiftclient版本:1.2.0
Keystone版本:git上的Master版
可参照文档《Keystone安装部署流程》和《Swift集群部署流程》。Swift需要调用python-keystoneclient中的组件来访问Keystone,因此需要为其安装python-keystoneclient(可采用安装Keystone依赖项的方式)。因此,请务必确保各处安装的Keystone与python-keystoneclient的版本统一,否则可能出现版本兼容性问题(我就曾遇到Swift中安装的python-keystoneclient和PC1上的Keystone服务的版本不统一,导致的版本兼容性问题,无法通过验证,最后重新下载安装所有的python-keystoneclient与Keystone才予以解决)。
2.3 Keystone的部署
PC1上已经按照文档《Keystone安装部署流程》部署了Keystone,在整合使用过程中无需进行修改。为完整演示Keystone与Swift集群的整合使用过程,我们需要清空Keystone的记录的数据。先删除存储Keystone数据的DB文件,然后同步数据库schema并启动Keystone服务即可。
# rm -f ~/keystone.db |
2.4 Swift集群的部署
PC2和PC3上已经按照文档《Swift集群部署流程》部署了Swift集群,为了使其能通过Keystone完成用户的身份认证与权限控制,需要对PC2和PC3作出一定的修改。以下操作同时应用于PC2和PC3。
1. 停掉Swift的所有服务。
# stopall |
2. Swift需要调用python-keystoneclient中的组件来访问Keystone,因此需要为其安装python-keystoneclient。为了避免版本兼容性问题,推荐采用安装Keystone依赖项的方式,当然你也可以独立地去下载安装python-keystoneclient。我从git上获取最新的Keystone Service代码,安装Keystone的依赖项,并将Keystone安装到Python的package里。这里只安装依赖项中的tools/pip-requires即可,该依赖项中包含了python-keystoneclient。如果安装了tools/test-requires则会覆盖掉已安装的Swift,你就需要自己重新安装Swift了,这在文档《Keystone安装部署流程》中已详细说明。
# cd ~ |
swift-ring-builder account.builder create 9 3 1
swift-ring-builder container.builder create 9 3 1
swift-ring-builder object.builder create 9 3 1
swift-ring-builder account.builder add z1-172.28.6.132:6002/sda1 100
swift-ring-builder account.builder add z2-172.28.6.133:6002/sda1 100
swift-ring-builder account.builder add z3-172.28.6.134:6002/sda1 100
swift-ring-builder container.builder add z1-172.28.6.132:6001/sda1 100
swift-ring-builder container.builder add z2-172.28.6.133:6001/sda1 100
swift-ring-builder container.builder add z3-172.28.6.134:6001/sda1 100
swift-ring-builder object.builder add z1-172.28.6.132:6000/sda1 100
swift-ring-builder object.builder add z2-172.28.6.133:6000/sda1 100
swift-ring-builder object.builder add z3-172.28.6.134:6000/sda1 100
swift-ring-builder account.builder
swift-ring-builder container.builder
swift-ring-builder object.builder
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
swift-ring-builder object.builder rebalance
3. 修改Swift中的proxy-server配置文件/etc/swift/proxy-server.conf。在其中添加authtoken与keystoneauth组件,并将pipeline中的tempauth改为authtoken与keystoneauth,表示采用Keystone而不是TempAuth来完成用户身份认证和权限控制。authtoken是python-keystoneclient中的组件,用于访问Keystone;keystoneauth是Swift中的组件,用于一些附加的条件设置。
[DEFAULT] |
4. 至此,我们已经完成了对Swift的修改。现在可以启动Swift服务了
# startmain |
3. 使用实例
3.1 创建Tenant、User和Role
我们将创建名称为adminTenant的Tenant(租户)、名称为admin的User(用户)以及名称为adminRole的Role(角色),并将它们关联起来。最终的结果表现为:一个名叫admin的用户,拥有名为adminRole的角色身份,并且能够使用名为adminTennant的租户。需要说明的是:2.4节中配置文件里的“operator_roles = adminRole, swiftoperator”项表明,角色为adminRole或swiftoperator的用户才能访问Swift,所以此处才选择创建adminRole角色。
1. 创建Tenant,租户名为adminTenant,描述信息为Admin Tenant。请记住该命令生成的Tenant id,下面添加User时需要用到。
# keystone tenant-create —name adminTenant —description “Admin Tenant” —enabled true |
+——————-+—————————————————+ |
2. 创建User,用户名为admin,密码为openstack。请记住该命令生成的User id,下面的关联命令需要用到。
# keystone user-create —tenant_id 54d3db64adfc4731b5222cac974f8bc5 —name admin —pass openstack —enabled true |
+—————+—————————————————+ |
3. 创建Role,角色名为adminRole。请记住该命令生成的Role id,下面的关联命令需要用到。
# keystone role-create —name adminRole |
+—————+—————————————————+ |
4. 至此,我们已经创建了一个Ttenant,一个Uuser以及一个Rrole,它们的id分别是:
tenant_id:54d3db64adfc4731b5222cac974f8bc5 |
5. 最后,我们要使用上述三个id,并通过下面的命令来将三者关联起来。
# keystone user-role-add —user-id b14c99dbaad14a78a37aa7361201062f —tenant-id 54d3db64adfc4731b5222cac974f8bc5 —role-id 1bf9a3ac155d4fd4abe5646abcc0de7a |
此时,让我们再使用list命令查看一下Tenant、User和Role的信息。
# keystone tenant-list |
+—————————————————+——————-+————-+ |
# keystone user-list |
+—————————————————+———-+————-+———-+ |
注:“_member”角色是Keystone预设的,似乎会和每个用户关联。这是新版本Keystone中出现的,目的暂时不明。
# keystone role-list |
+—————————————————+—————-+ |
3.2 创建Service和Endpoint
为了让上面创建的用户能够使用Swift存储服务,我们将创建名称为Swift的Service(服务),然后根据现有Swift集群的情况为租户添加Endpoint(端点,服务入口),然后用户就能够访问Endpoint来使用Swift存储服务了。需要说明的是:服务和租户关联后成为Endpoint,即该租户可使用该服务,不同服务和不同租户的组合会产生不同的Endpoint;同时,用户又会和租户相关联,表明用户可使用该租户;于是,只要用户所属的角色被允许访问Swift,那么该用户就能真正地访问并使用Swift了;
1. 创建Service,服务名为Swift,服务类型为object-store,描述信息为Swift Object Store Service。请记住该命令生成的Service id,下面添加Endpoint时需要用到。
# keystone service-create —name=Swift —type=object-store —description=”Swift Object Store Service” |
+——————-+—————————————————+ |
2. 由于我们的Swift是集群,并且有两个Proxy Server,如果Swift前端存在某种负载均衡设备,那么该负载均衡设备就是唯一的Endpoint(服务入口),用户通过Keystone的认证后,获得的就是这个负载均衡设备的访问地址;然而,我们没有负载均衡设备,这就意味着Swift存在两个Endpoint(服务入口),分别为PC2和PC3,用户通过Keystone的认证后,应该可以同时获得这两个Endpoint,然后随意选取一个来访问。因此,我们需要为租户添加两个Endpoint,分别对应PC2和PC3。
keystone endpoint-create —region RegionOne —serviceid 254081ccc0494806bc8b6cd6a3ba70a8—publicurl http://hadoop131:8080/v1/AUTH_265614761c50405e82004dcfd2eb1a9c —adminurl http://hadoop131:8082 —internalurl http://hadoop131:8082/v1/AUTH_265614761c50405e82004dcfd2eb1a9c
#keystone endpoint-create —region RegionOne —service_id cab139be777545a893d1bd26a03730c9 —publicurl http://192.168.3.52:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 —adminurl http://192.168.3.52:8080 —internalurl http://192.168.3.52:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 |
+——————-+—————————————————————————————————-+ |
# keystone endpoint-create —region RegionTwo —service_id cab139be777545a893d1bd26a03730c9 —publicurl http://192.168.3.53:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 —adminurl http://192.168.3.53:8080 —internalurl http://192.168.3.53:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 |
+——————-+—————————————————————————————————-+ |
这里解释一下上面的命令:region表示域,原本同一个服务和同一个租户关联产生的Endpoint是唯一的,为使其能支持多个Endpoint(如上文中的PC2和PC3),便加入了域的概念,即同一个服务和同一个租户可以关联产生多个Endpoint,每个Endpoint用region来标示加以区别,如上面的RegionOne和RegionTwo;publicurl表示该Endpoint的公网(外网)服务入口(普通服务);adminurl表示该Endpoint的管理员服务入口,一般为内网;internalurl表示该Endpoint的内网服务入口(普通服务);本文档的前提环境为局域网,因此publicurl和internalurl可以设置为相同的;192.168.3.52和192.168.3.53分别是PC2和PC3的IP地址;AUTH_54d3db64adfc4731b5222cac974f8bc5是“AUTH”前缀加租户ID,“AUTH”前缀在2.4节中已有介绍,而租户ID则表明这些Endpoint是由某个特定的租户和Service关联产生的。
最后,让我们再使用list命令查看一下Service和Endpoint的信息。
# keystone endpoint-list | |
+—————————————————+—————-+—————————————————————————————————-+—————————————————————————————————-+—————————————+—————————————————+ |
3.3 用curl测试
1. 上面已经完成了Tenant、User、Role、Service和Endpoint的创建,于是我们就可以访问Keystone,来获取Token和Endpoint了。我们使用curl命令来访问Keyston,该命令需要给定四个参数,即tenantName(租户名,也可理解为账户名)、username(用户名)、password(用户密码)以及认证与授权申请的地址(http://192.168.3.67:35357/v2.0/tokens或http://192.168.3.67:5000/v2.0/tokens均可)。此外,返回信息会以json格式展现。返回信息比较全面,包括了token和不同region的Endpoint,如下所示:
# curl -d ‘{“auth”: {“tenantName”: “adminTenant”, “passwordCredentials”:{“username”: “admin”, “password”: “openstack”}}}’ -H “Content-type: application/json” http://192.168.3.67:5000/v2.0/tokens | python -mjson.tool |
% Total % Received % Xferd Average Speed Time Time Time Current |
2. 接着就可以用获取到的token和Endpoint访问Swift服务了。先用其中一个Endpoint(PC2)查看该Account的信息。
# curl -v -H ‘X-Auth-Token: c8d5d45c42484c7d81d6d2ddd1c1258b’ http://192.168.3.52:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 |
About to connect() to 192.168.3.52 port 8080 (#0) |
# curl -X HEAD -i -H ‘X-Auth-Token: c8d5d45c42484c7d81d6d2ddd1c1258b’ http://192.168.3.52:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 |
HTTP/1.1 204 No Content |
3. 再尝试另一个Endpoint(PC3)查看该的Account信息。
# curl -v -H ‘X-Auth-Token: c8d5d45c42484c7d81d6d2ddd1c1258b’ http://192.168.3.53:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 |
About to connect() to 192.168.3.53 port 8080 (#0) |
4. 获取该Account中的Container列表,由于未曾创建Container,所以是空的。
# curl -X GET -H ‘X-Auth-Token: c8d5d45c42484c7d81d6d2ddd1c1258b’ http://192.168.3.53:8080/v1/AUTH_54d3db64adfc4731b5222cac974f8bc5 |
3.4 用Swift客户端测试
1. 接着,我们使用Swift客户端进行测试。先查看该Account的信息,提交的参数是Keystone的访问地址、租户名、用户名、用户密码。
# swift -V 2 -A http://192.168.3.67:5000/v2.0 -U adminTenant:admin -K openstack stat |
Account: AUTH_54d3db64adfc4731b5222cac974f8bc5 |
2. 获取该Account中的Container列表,由于未曾创建Container,所以是空的。
# swift -V 2 -A http://192.168.3.67:5000/v2.0 -U adminTenant:admin -K openstack list |
3. 在该Account中创建几个Container。通过查看PC2和PC3上Storage Server的存储目录,可以看到5个Container中有3个存储在PC2上,2个存储在PC3上。
# swift -V 2 -A http://192.168.3.67:5000/v2.0 -U adminTenant:admin -K openstack post myContainer1 |
4. 再次获取该Account中的Container列表。
# swift -V 2 -A http://192.168.3.67:5000/v2.0 -U adminTenant:admin -K openstack list |
myContainer1 |
上述使用实例阐述了如何用Keystone为Swift集群提供身份认证与权限控制。结果表明,Keystone正确地为多Proxy Server的Swift集群提供了身份认证与权限控制。至此,你应该已经完整地了解了Keystone和Swift集群的整合使用。