OpenStack Glance是一种提供发现,注册,和下载的镜像服务。OpenStack Glance是一个提供虚拟机镜像的集中式仓库。通过Glance的RESTful API,可以查询镜像元数据下载镜像。虚拟机的镜像可以很方便的存储在各种地方,从简单的文件系统到对象存储系统(如OpenStack Swift项目)。
在Glane里镜像被当做模板来存储,用于启动新实例。 Glance是一个可以组织和管理大量虚拟磁盘镜像的独立服务。Glance为云磁盘镜像提供了一个端到端的解决方案。它还可以从正在运行的实例建立快照用于备份虚拟机的状态。
Glance 组件
Glance有以下几个组件:
glance-api, 接收镜像发现,查询,和存储镜像的api调用。
glance-registry, 存储,处理和查询镜像的元数据信息。
database, 存储镜像元数据
repository, 集成了各种openstack组件,比如文件系统,S3, 以及其它的http镜像存储。
Glance接收来自终端用户或Nova组件的镜像的API请求,镜像文件可以存储在对象存储服务swift上或者其它存储仓库。
镜像服务支持以下几种后端存储:
文件系统 Openstack的镜像默认存储在文件系统后端。在本地的文件系统里进行保存镜像。
对象存储 swift
Block Storage cinder.
VMware ESX/ESXi or vCenter.
S3 亚马逊的s3等等.
HTTP 可以使用英特网上的http服务获取镜像。这种方式只能只读。
RADOS Block Device (RBD) 使用Ceph的RBD接口存储到Ceph集群中
Sheepdog 专为QEMU/KVM提供的一个分布式存储系统.
GridFS 使用MongoDB存储镜像.
Glance 架构
Glance具有客户端 - 服务器体系结构,并提供Rest API,通过Rest API来请求服务。通过客户端发送Rest API的请求,并等待Keystone认证。 Glance域控制器管理所有内部操作,这些分为很多层,每层实现自己的任务。
Glance store是glacne和外部存储后端或者本地文件系统提供通信的一个层,并提供统一的访问接口。数据库为每一个组件提供一个集中的数据访问。
Glance架构由以下几个组件组成:
Client - 任何应用都可以通过Client来使用glance服务。
REST API – 通过REST方式暴露Glance功能。
Database Abstraction Layer (DAL) –统一Glance和数据库交互的一个应用层接口。
Glance Domain Controller –完成glance主要的功能的中件间:
authorization,notifications, policies, database connections.
Glance Store – 集成glance和各种后端存储服务.
Registry Layer –可选层,通过使用单独的服务来组织domain和DAL之间的安全通信。
Glance 格式
当我们上传镜像时,我们需要指定虚拟机镜像的格式。 Glance支持各种格式,如磁盘格式和容器格式。虚拟磁盘类似于物理服务器的引导驱动程序,只会压缩到文件中。不同的虚拟化支持不同的磁盘格式。
磁盘格式
虚拟机镜像的磁盘格式是底层磁盘镜像的格式。以下是OpenStack支持的磁盘格式。
容器格式
正如OpenStack glance也支持容器格式的概念,它描述了文件格式,并包含关于实际虚拟机的额外元数据。
以下是OpenStack Glance支持的Container格式.
这里注意下,Glance或其他OpenStack组件目前并不支持使用容器格式。如果不确定,最好使用'bare'作为容器格式,比如我们上传镜像到glance,bare就是没有容器.
使用如下命令上传镜像到glance
root@CONTROLLER:~#glance image-create --name "cirros-0.3.4-x86_64" --file/tmp/images/cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-formatbare --visibility public --progress
这里使用image-create来上传镜像,其--name表示上传镜像后镜像的名称,--file表示要上传镜像的路径,磁盘格式--disk-format以qcow2和--container-format为bare。可见性--visibility public表示镜像可以公开访问,进度--pogress表示显示上传进度条。
Glance状态流
上传镜像时Glance会显示镜像的各种状态。当我们第一步上传镜像时,第一步就是入队列,经过短时间的验证,镜像进入queued状态,保存镜像并开始上传。之后镜像会进入saving的状态,表示还没有完全上传完毕。镜像完全上传后,状态会变成Active。如果上传失败,将会变成killed或deleted状态。另外我们还可以使用命令停用或者重新激活完全上传成功的镜像。
下图为glance镜像的状态流转图。
queued
在Glance registry里已经通过验证可以开始存储. 暂时没有镜像数据被上传到glance,镜像大小在上传时设置为0。
saving
表示正在上传镜像到Glance。通过POST /images接口注册镜像,如果有x-image-meta-location http头,这个镜像将不会处于saving状态(因为镜像数据在其他位置已经可用)。
active
表示在glance里是一个完全可用的镜像。当镜像上传成功后,会切换到这个状态。.
deactivated
表示不允许任何非管理的用户访问。禁止下载镜像,同时也禁止所以可能获取镜像数据的操作,比如镜像导出和镜像克隆等操作。
killed
表示上传镜像时发生错误,这个镜像不可用。
deleted
Glance仍然保留了镜像的相关信息,但不能在被使用。这个状态下的镜像将会被自动删除。
Deactivatingand Reactivating an image
可以停用镜像。也可以重新激活,或者删除。当管理员对镜像进行更新时,可以先把镜像停用,这样镜像对非管理员用户就不可见了,当更新完成后,可以重新激活镜像,以便用户可以用更新后镜像启动虚拟机。
我们需要token 和镜像id来停用镜像,以下是停用和重新激活镜像的步骤。
替换镜像id和token可以执行以下的curl命令
root@CONTROLLER:~#curl -X POST -H 'X-Auth-Token: fbdab45ff753408c9e042aa6892e055b' http://192.168.1.110:9292/v2/images/17449a2e-8711-4700-af8f-439927159b7c/actions/deactivate
这个镜像被停用后,我们使用glance image-list来列出镜像
因为被停用,我们将会得到这样的输出。.
我们同样可以用curl命令去重新激活镜像,只要修改token,用以下步骤就可以重新激活被停用的镜像。
root@CONTROLLER:~#curl -X POST -H 'X-Auth-Token: 88878e52d01f43c29a915b2220295641'http://192.168.1.110:9292/v2/images/17449a2e-8711-4700-af8f-439927159b7c/actions/reactivate
下一步执行glance image-list 检查
Glance 配置文件
Glance-api.conf : Glance api 服务配置文件.
Glance-registry.conf : Glanceregistry服务配置文件,用户存储镜像有关的元数据。
glance-scrubber.conf : 用于清理已删除的镜像的服务。
policy.json : 镜像服务的访问控制。在这里,我们可以定义角色和策略,是OpenStack Glance中的安全特性。
镜像和实例
如前所述,磁盘镜像作为模板存储。镜像服务存储和管理镜像。实例是在计算节点上运行的单个虚拟机,计算节点管理这些实例。用户可以从用同一个镜像启动任意数量的实例。每个启动的实例都是基于镜像的一个副本,所以实例上的任何修改都不会影响到镜像。我们可以对正在运行实例做快照,并可以用快照于启动另一个新的实例。
当我们启动一个实例时,我们需要指定Flavor。Flavor定义了实例可以有多少个虚拟CPU,多大的RAM以及临时磁盘的大小。 OpenStack提供了预定义的flavor,我们也可以新创建和编辑Flavor。
下图显示了启动实例的系统状态。glance store包含一定数量的镜像,计算节点包含可用的vcpu,内存和本地磁盘资源,cinder-volume包含一定数量的volume。
启动实例之前,需要选择一个镜像,flavor和任何可选属性。选定的 flavor提供一个系统盘,标记为vda,另外一个临时盘被标记为vdb,cinder-volume提供的volume被映射到第三个虚拟磁盘并将其称为vdc。
在该图中,基础镜像从image store复制到本地磁盘。 vda是实例的第一个磁盘,如果镜像文件越小,则通过网络复制的数据越少,实例启动就会更快。实例创建时会创建一块空的临时数据盘vdb,当实例终止时,它将被删除。
vdc使用iSCSI连接到cinder-volume。随后计算节点提供vCPU和内存资源之后,该实例将从vda.启动。该实例运行并更改磁盘上的数据。如果volume store位于单独的网络上,需要在计算节点nova.conf里指定的my_block_storage_ip,将会通过存储网络直接通信。
实例被删除后, 除volume之外的其它资源都会被回收。临时盘将会被清空,内存和vCPU资源被会被释放。在这个过程中镜像不会发生任何改变。
本文翻译自以下链接:
http://www.sparkmycloud.com/blog/openstack-glance/