Growing ⇈ !
随着OpenStack项目逐步发展,其支持项目已从小型的数据中心走向更大规模的部署/应用场景。在一些大型项目中,常见到类似VDC等概念,需要整个组织级别能够逐级细分,并且要求各级组织间能提供严格的ACL控制与配额管理能力。
Keystone作为OpenStack中提供统一身份认证管理的组件,自Diablo版本发布以来,从仅支持小的扁平的租户组织架构,到v3版本引入Domain/Group等概念,逐步在完善分级管理的能力。
那么,面对日渐复杂的分级诉求,其支持能力如何呢?下文结合一个需求案例,来具体分析下当前Keystone对于多级租户管理的支持度。
某IT公司包含几个部门,每个部门下又有数个科室,要求资源能够逐级分配;且公司级运维管理员能够对部门资源进行管理,而部门管理员需要对科室资源执行部分操作。
分析以上需求描述中,包含了三层诉求:
以上内容对应到OpenStack中,可大致转化为以下模型:
+---------------------------------+
| |
| +---------+ |
| | Prj_0 | |
| +---------+ |
| |quota=100| |
| +---------+ |
| /\ |
| / \ |
| / \ |
| / \ |
| / \ |
| +---------+ +---------+ |
| | Prj_1_a | | Prj_1_b | |
| +---------+ +---------+ |
| |quota=50 | |quota=20 | |
| +---------+ +---------+ |
| /\ |
| / \ |
| / \ |
| / \ |
| / \ |
| +---------+ +---------+ |
| | Prj_2_a | | Prj_2_b | |
| +---------+ +---------+ |
| | quota=8 | |quota=10 | |
| +---------+ +---------+ |
| |
+---------------------------------+
下文针对这三点诉求,基于OpenStack Ocata版本,采用实际操作来求证下,之后根据验证结果来给出具体解析。
这里先验证下多级租户的支持度。
陆续指定各租户的从属关系,逐个创建新租户。可见,当创建到第6层时提示已达最大层级深度。
简单说明下:
可见,多级租户设置这里,是能满足需求的。
按照之前需求,这一部分需要能够针对不同层级的管理员,提供不同的操作能力。
这一部分与Policy有关,当前OpenStack中规则管理还是分散在各组件”policy.json”中,需根据角色来指定对应规则。这一部分本文不展开。
有了之前的验证基础,还剩多级配额的相关功能需要验证下。同样先在环境上实际验证下。
可见,租户不指定domain时默认同为default。且:
无父租户的Project,其父租户是默认domain;
有父租户的Project,其父租户即指定的父租户。
将父租户中的用户,在子租户中也设置为”admin”角色。
注:当前版本OpenStack CLI 移除了之前的”inherited”选项,需要单独指定下。
这里选取keypair为实验对象:
将父租户的keypair 配额限定为1。而子租户keypair配额保持100不变。
先使用父租户管理员用户,在子租户内尝试创建keypair:
在子租户内创建两个keypair,结果成功。——似乎说明子租户的资源与父租户独立,父租户配额限制不影响子租户。
切换回父租户,重新创建keypair:
在父租户内创建keypair,直接提示配额不足。且通过查询接口,在父租户内能够查询到之前父租户管理员用户在子租户内创建的两个keypair。——从结果来看,似乎说明父租户的资源配额,是会包括子租户资源的。
首先将父租户配额修改为3:
在父租户内继续创建keypair:
再次创建第二个keypair 时,就会提示超过配额。调用查询接口,可以看到当前能够查到的keypair为3,符合配额限制:
根据上文测试结果,总结下上面的判断行为为:
不过仔细想想,这里是只”底层影响上层的配额”,感觉和一般理解的控制流方向相反,逻辑似乎不太对?
回到我们的测试场景。
先删掉之前父租户管理员用户在子租户内创建的keypair。之后回到子租户,切换到子租户管理员用户来重新测试:
重新在子租户内创建两个keypair:
接着,我们回到父租户用户,再次查看下当前父租户资源用量。见下图,可见当前仅能看到最开始时,父用户自己创建的一个keypair,而子用户刚在上一步创建的两个keypair 却看不到了:
陆续创建两个keypair后,再创建第三个后才提示失败,满足配额预期。
综上,第二次与第一次的结果,似乎截然相反。
按照这次的测试结论,应该是——父子租户间配额互不影响,彼此独立。看上去,似乎第二种更符合逻辑些。
那么,这里究竟哪种正确呢?
这里解释下,为何会出现以上两种现象。
答案其实是,keypair 在Nova中是按照用户名来查询,而不是租户。因此:
在第一次中:
而在第二次:
综上,归根结底,以上现象是由于keypair 在Nova中的特殊性造成的。
其实,对于虚拟机等普通对象来说,父子租户间的配额都是互不影响,彼此独立的。
下面拿虚拟机试试。
首先在父租户中创建一个虚拟机。之后切换到子租户中,分别用两个用户查询虚拟机,发现都看不到:
之后在子租户中使用子用户创建虚拟机,然后切换回父租户,发现也只能看到最开始的那个,新虚拟机也看不到。
最后在子租户中,使用父租户管理员用户创建一个虚拟机,之后返回父租户,继续使用原用户查询,发现依然看不到:
可见,虚拟机对象是与我们之前预期一样,是仅按租户来区分权限的。
说到这里,就顺便聊聊Keystone 社区有关多级租户相关的发展现状。
有关Keystone多级租户设置,以Domain-Project 为基本结构的嵌套模型,租户权限部分已经实现。
而本文最关心的,各大组件配额嵌套的问题,其实社区之前就将BP同步给各个组件了。不过之前仅Cinder完成了,Nova的BP几个版本都没提进去已废弃,而其余模块甚至都还没开始动。
不过,社区近期已开始关注相关议题。在今年2月底的首届OpenStack PTG(The Project Teams Gathering)上,Nova专门就Quota分级进行了讨论,新的BP在去年底也已重新提出,相关组件功能设计已经开始快速推进。
具体信息汇总如下:
此外,有关分级管理的其他功能,Keystone在Pike版本的规划如下,此处一并附上:
Keystone 在Mitaka版本已支持多级租户设置,最大嵌套层级默认为5;
但多级各租户间的配额关联还未实现,父子租户间配额独立;
因此,若想实现类似”省市县”的多级管理,且要求配额统分功能的话;在不修改Keystone代码的前提下,建议采用如下方式实现:
鉴于后续社区发展和现状分析,个人更推荐方案二和方案一。