初识OpenStack_1

由于毕业设计的选题选择了关于使用Openstack和Docker容器技术来构建一个高校云主机申请平台, 现在开始学习了解一下这个云计算框架 - openstack.

扯点闲话

关于Openstack大家都听说过, 这个项目是由NASA和Rackspace发起开源的一个云平台. 最早于2010年发布第一个版本. 关于Openstack的版本号, 是按照26个英文字母的顺序, 用这些字母开头的单词来作为版本号, 例如2010年的第一个版本叫做Austin, 接着是Bexar, Cactus, Diablo….目前最新的版本是R版, 即Rocky. 这一次的我们选择的版本是Q版本, Queen.名字挺好听的吧. 就是他了.

Openstack是一个很复杂和庞大的云计算框架, 不过与其说他是框架, 不如说它是多个项目综合起来的一个更大项目, 最初的Openstack, 仅仅只有最基础的两个服务, 分别是NASA贡献的计算代码Nova和Rackspace贡献的对象存储代码Swift. 到了现在已经有大大小小几十个项目了:

OpenStack Cloud landscape map

这么多组件交互起来是个什么样子呢, 我们只在这里面选取一些必要的组件和一些比较重要的, 一共十二个, 他们交互起来的逻辑架构是这样的:

Logical architecture

还是蛮复杂的.

接下来的几篇关于Openstack的文章, 我们会从单个项目进行入手, 这篇文章我们来看看Openstack的两个核心组件 – Keystone和Glance.

Keystone

为什么所有人都要从这个组件说起? 因为这是一个进行统一的身份验证, token的发放和校验, 服务列表, 还有包括用户权限的定义. 几乎所有的Openstack服务都要经过Keystone, 来获取操作的权限和身份识别. 简单说来, 这是一个Identity Sevice.

官方文档对这么一个服务的表述是:

The OpenStack Identity service provides a single point of integration for managing authentication, authorization, and a catalog of services.

不仅是Openstack的服务要和Keystone打交道, 就连用户第一个打交道的服务就是它, 除了进行鉴权, Keystone还可以进行服务发现, 从而使得其他的服务能够知道有哪些其他服务正在部署.

Keystone自己的维护了一个小型的数据库, 但是他也可以和诸多外部的系统进行交互, 例如memcached, mysql, LDAP等等.

接着在实际了解到keystone之前, 我们要先来介绍概念了.

Credential 这个玩意的英文原意就是证书, 凭证之类的意思 (相较于Certificate, 这个偏非官方非正式一点). 在这里, 这个东西指能够证明用户身份的数据, 例如, 用户名和密码, 用户名和API KEY, 或者是权限服务提供的鉴权token.

Endpoint 这个东西挺好理解的, 很多Web框架里面也有这个概念. 这东西就是指一个网络可访问的地址, 通常就是我们所熟知的URL, 翻译过来就是服务的端点, 也就是访问这些服务的入口.

Region 这个东西就是指一个鉴权服务API V3的实体(官网解释), 看不懂什么意思, 没关系后面有解释. 就代表是一个通用的Openstack部署划分的区域, 说白了就是部署的另外一套Openstack, 他们使用同一个Identity服务, 并且我们还可以进行再去region中再加上一个sub-region, 形成树状结构. 通常情况下, 划分region都是地理上的, 比如说不同的机房, 就会被划分不同的region, 例如: us-east, hk-001之类的. 这个玩意我们叫做区域.

Token 很简单啦. 就是一串字母数字组成的字符串. 就像这样子:

1
2
3
4
5
6
{
"project_id": "d0238da87b624a63a1132886db6f2dc5",
"expires": "2019-03-12T03:27:26+0000",
"user_id": "0625920ca5934f9fa2e47249b03e3d1b",
"id": "gAAAAABchxkOKHqMF890O3Pl_8_ItvrutNPcOgZd0Y18QSv447O4_r17UpQxttXW4NIrTx-t9q5a5OOUkPvq8t704Odsicq9UM6Wr6HSGG7gcYRFymzXr5ZQLiRlNeGHVVQV7mBfbJXKXRg5Of5-yEgY5O-eyEWxMQ4kQJO7zjgpCEbsQMgHvwA"
}

又出现了两个概念, projectuser. 在说到这个之前, 我们再说一个刚刚就已经提到过的概念:

Service 就是Openstack中的一个服务, 比如我们现在正在说的Keystone, 还有例如计算服务Nova这些, 能够提供一个或者多个endpoint, 使得用户能够访问到资源和进行操作.

接下来我们介绍一组概念, 分别是User, Role, Project, Domain.

初次接受这一组概念可能有点迷糊, 多看看就好了.

在一些低版本的课程中, (2016年之前的版本), 会有一个叫做租户的概念, 说是一个用户组的意思, 这个概念在M版本(2016)之后逐渐的被弱化, 现在已经没有了, 取而代之的就是上面的Project概念.

Project 这个就是用来分组和隔离资源或者权限对象的一个容器. 说的直白点就是命名空间一样的概念.

Domain 这个东西就是在Project之上的一个更大的空间, 包括了多个project和users, 定义了一个鉴权实体的管理边界(这样说不知道你们能不能明白)

UserRole 这两个概念我们放在一起来解释, 先来看这个图吧:

user&role

可以看到, 用户就相当于是一个人, 系统或者服务的表示形式, 用户可以被project来contain, 而role就是一组来执行特定操作的用户权限的形态, 用户可以和role来进行关联, 当用户进行操作的时候, 服务会去寻找用户所关联上的role是啥, 然后判定可进行的操作范围. 另外, 就像上图所展示的, 不同Project的同一个用户也可以拥有不同的角色.

以上就是关于Keystione的诸多概念了. 大体上的感觉就像这样子:

keystone_concept

随手用visio画的, 看看就好.

关于Keystone的安装和基本部署, 官方文档都写的十分详细了(起码CentOS 7版本是这样子的), 所以照着做下来就不会有大问题. 我也没有踩到什么坑. 倒是下面的Glance踩到了坑.

Glance

说完了Keystone, 我们再来说下一个服务. 为了创建一个虚拟机, 我们需要一个image映像才可以, 而glance就是

这么一个用于虚拟机映像的发现注册和获取的服务.glance支持使用文件后端(simple fs),或者是使用对象文件存储系统以及诸多外部存储系统.

Glance包含这些组件:

  • glance-api
  • glance-registry – (该组件已经在Q版本中标记为DEPRECATED, 并且将在S版本中去除)
  • database
  • Storage repository for image files
  • Metadata definition service
1
2
3
4
5
6
[root@control_node ~]# openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 057ff68c-0d24-404b-9a3f-d017058c0262 | cirros | active |
+--------------------------------------+--------+--------+

Glance所维护的映像文件都会被赋予一个唯一的ID, 并且这些映像会有这些状态:

  • Queued: 镜像ID已经保留, 但是镜像还没有上传
  • Saving: 镜像正在被上传
  • Active: 镜像已经可以使用
  • Killed: 镜像损坏或者不可用
  • Deleted: 镜像被删除

对于磁盘映像文件的支持, glance除了支持亚马逊定义的三种image格式之外, 还支持很多市面上普遍的格式, 例如无结构的raw格式, vhd, vmdk, vdi, iso, qcow2. 其中得益于qcow2的动态增加文件大小和云系统的相性不错, 比较常用.

接着我们说说在Glance配置的时候踩到的坑:

配置的时候你会看到官方文档这样的给示例: (api和registery配置文件都是这样的)

1
2
3
4
5
6
7
8
9
10
11
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = GLANCE_PASS

但实际上, 这里的auth_url根本就已经被废弃掉了. 另外很多配置项也是已经消失不见了, 在Q版本的配置文件中, 有一个叫做**www_authenticate_uri**的配置选项, 你可以把这个当做上面示例给的auth_uri, 这个配置项的意义其实就是公共(public)验证服务的的endpoint.

但是, 搞笑的是, 你还不能不配这个已经被废弃掉的值, 如果没有给它赋值, 即使数据库都成功写入了. 当启动服务的时候会因为缺少这个auth_url配置, 疯狂报错然后就退出.

所以最后在这个section需要配置的选项有:

1
2
3
4
5
6
[keystone_authtoken]
# ...
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password

然后就可以尝试启动服务和使用了.

以上就是关于Opensatck中权限组件和映像服务的相关说明了