文章目录
OpenStack镜像管理
Glance简介
镜像服务Glance
- GLANCE
- 提供发现、注册和检索虚拟机镜像功能
- 提供的虚拟机实例镜像可以存放在不同地方,例如本地文件系统、Swift对象存储、Cinder块存储等
- 首次出现在OpenStack的"Bexar"版本中
- 依赖Keystone认证服务
Glance在OpenStack中的定位
- Glance
- Glance即OpenStack Image service,Glance有一个RESTful API,允许查询VM镜像元数据以及检索实际镜像
- 如图所示,Glance属于共享服务层,用户可以在其中上传和发现能与其他服务一起使用的数据资产

!tip
目前数据资产包括:
镜像:Glance镜像服务包括发现、注册和检索VM镜像。Glance有一个RESTful API,允许查询VM镜像元数据以及检索实际镜像。通过Glance提供的VM镜像可以存储在各种位置,从简单的文件系统到Swift等对象存储系统。
元数据定义:Glance托管一个metadefs目录。这为OpenStack社区提供了一种以编程方式确定可应用于OpenStack资源的各种元数据键名和有效值的方法。我们在这里谈论的只是一个目录,除非使用负责这些资源的服务提供的 API 或客户端工具将键和值应用于各个OpenStack资源,否则键和值实际上不会做任何事情。
Glance在OpenStack中的作用
- 查询、获取镜像元数据和镜像本身
- 维护镜像信息(元数据和镜像本身)
- 注册、上传VM镜像(镜像创建、上传、下载和管理)
- 对VM创建快照,备份VM状态或者创建新的镜像
- 支持多种方式存储镜像

!tip
在OpenStack上创建虚拟机时,必须为其选择需要安装的操作系统,glance服务就是为该选择提供不同的操作系统镜像。
镜像的元数据保存在数据库中,而镜像本身是通过Glance Store Drivers存放到各种backend store中。
Glance与其他服务的交互关系
- GLANCE
- Glance依赖Keystone认证服务
- 通过Nova模块创建虚拟机实例,Nova调用Glance模块提供的镜像服务
- Glance提供的镜像可以通过Swift对象存储机制进行保存
Glance架构
Glance架构

Glance各组件作用(一)
| 组件 | 作用 |
|---|---|
| Client | 使用Glance服务的应用程序,可以是命令行工具、horizon、nova等 |
| REST API | Glance是一个client-server架构,提供一个REST API,而使用者就是通过REST API来执行关于镜像的各种操作 |
| Glance Domain Controller | 是Glance内主要的中间件实现,就相当于一调度员,作用是将Glance内部服务的操作分发到各层(Auth认证、Notifier、Policy策略、Quota、Location及DB数据库连接)具体任务由每个层实现 |
| Registry Layer | 属于可选的层,用来组织安全。通过使用这个单独的服务,来控制Glance Domain Controller与Glance DB之间的通信 |
Glance各组件作用(二)
| 组件 | 作用 |
|---|---|
| Glance DB | Glance服务Database Abstraction Layer (DAL) -数据库抽象层。使用一个核心库Glance DB,该库对Glance内部所有依赖数据库的组件来说是共享的 |
| Glance Store | 用来组织处理Glance和各种存储后端的交互。所有的镜像文件操作都是通过调用Glance Store库执行的,它负责与外部存储端或本地文件系统的交互。Glance Store提供了一个统一的接口来访问后端存储 |
Glance架构简化

!tip
在Newton之前的版本中,Glance支持REST API V1和V2。
在V2 API版本中,Glance-Registry的内容被整合进了Glance-API。如果Glance-API接收到与镜像元数据有关的请求,则会直接操作数据库,不需要再通过Glance-Registry。
在V1 API版本中,Glance-Registry与Glance-API一样,也是一个WSGI Server,但是Glance-Registry处理的是与镜像元数据相关的RESTful请求。Glance-API在接收到用户的RESTful请求后,如果该请求与元数据相关,则将其转发给Glance-Registry。需要注意的是,Glance-Registry提供的REST API是给Glance-API使用的 ,不对OpenStack外部用户暴露。
在Newton版本中V1已经过时,并从Stein版本开始,Glance-Registry被废弃,由Glance-API代替,然后通过Store模块的接口实现对各种不同后台存储系统的支持,包括Glance架构图中的Amazon S3、Cinder/Swift、Ceph、Sheepdog等存储后端。
Glance工作原理和流程
OpenStack中的镜像、实例和规格
- 镜像、实例和规格的关系:
- 用户可以从同一个镜像启动任意数量的实例
- 每个启动的实例都是基于镜像的一个副本,实例上的任何修改都不会影响到镜像
- 启动实例时,必须指定一个规格,实例按照规格使用资源
| 概念 | 描述 |
|---|---|
| 镜像(Image) | 虚拟机镜像包含一个虚拟磁盘,其上包含可引导的操作系统,为虚拟机提供模板 |
| 实例(Instance) | 实例是在OpenStack上运行的虚拟机 |
| 规格(Flavor) | 规格定义了实例可以有多少个虚拟CPU,多大的RAM以及多大的临时磁盘 |
!tip
创建实例时必须指定镜像和规格。
Glance镜像磁盘格式
- 将镜像添加到Glance时,必须指定虚拟机镜像的磁盘格式和容器格式
| 磁盘格式 | 描述 |
|---|---|
| raw | 一种非结构化的磁盘镜像格式 |
| vhd | VMware,Xen,Microsoft,VirtualBox等使用的常见磁盘格式 |
| vhdx | vhd格式的增强版本,支持更大的磁盘容量和其他功能 |
| vmdk | 常见的磁盘格式 |
| vdi | VirtualBox和QEMU支持的磁盘格式 |
| iso | 光盘(例如CDROM)的存档格式 |
| ploog | Virtuozzo支持和使用的磁盘格式,用于运行OS Containers |
| qcow2 | QEMU支持的磁盘格式,支持动态扩展和写时复制 |
| aki | Amazon Kernel Image |
| ari | Amazon Ramdisk Image |
| ami | Amazon Machine Image |
!tip
其他镜像,可以先转换成OpenStack支持的格式,再导入使用。
Glance镜像容器格式
- 将镜像添加到Glance时,必须指定虚拟机镜像的磁盘格式和容器格式
| 容器格式 | 描述 |
|---|---|
| bare | 这表明镜像中没有容器或元数据信封 |
| ovf | 这是OVF容器格式 |
| ova | 这表明Glance中存储的是OVA tar归档文件 |
| docker | 这表明Glance中存储的是容器文件系统的Docker tar归档文件 |
| compressed | 未指定压缩文件的确切格式 |
| aki | 这表明Glance中存储的是Amazon内核镜像 |
| ari | 这表明Glance中存储的是Amazon虚拟磁盘镜像 |
| ami | 这表明Glance中存储的是Amazon机器镜像 |
!tip
容器格式是指虚拟机镜像是否采用还包含有关实际虚拟机的元数据的文件格式。
需要注意的是:容器格式字符串在当前并不会被glance或其他OpenStack组件使用,所以如果你不确定,将容器格式指定为bare是安全的。
Glance状态机
- Glance中有两种状态机:镜像状态和任务状态
| 镜像状态 | 描述 |
|---|---|
| queued | 已在glance-registry中保留镜像标识符,但镜像数据未上传,镜像大小未初始化 |
| saving | 镜像的原始数据正在上传到Glance中 |
| uploading | 对镜像调用了import data-put请求 |
| importing | 导入镜像中,但镜像尚未就绪 |
| active | 镜像创建完成,可以使用 |
| deactivated | 禁止任何非管理员用户访问镜像 |
| killed | 镜像上传时出错,镜像不可用 |
| deleted | Glance保留了镜像信息,但不能继续使用,镜像在一定时间后会被自动清理掉 |
| pending_delete | 类似deleted,Glance尚未删除镜像数据,处于该状态的镜像可恢复 |
| 任务状态 | 描述 |
|---|---|
| pending | 任务挂起 |
| processing | 任务正在处理中 |
| success | 任务执行成功 |
| failure | 任务执行失败 |
Glance状态机转化图

!tip
!tip
queued:没有上传image数据,只有db中的元数据。
saving:正在上传image data,当注册一个镜像使用POST /images并且当前携带了一个x-image-meta-location头,这个镜像将不会进入saving状态(镜像的数据已经是可以获得的,不能重传)。
active:当镜像数据上传完毕,镜像就可以被使用了(可获得的),此时处于active状态。
deactivated:表示任何非管理员用户都无权访问镜像数据,禁止下载镜像,也禁止像镜像导出和镜像克隆之类的操作(请求镜像数据的操作)。
killed:表示上传过程中发生错误,并且镜像是不可读的。
deleted:glance已经保存了该镜像的数据,但是该镜像不再可用,处于该状态的镜像将在不久后被自动删除。
pending_delete: 与deleted相似,glance还没有清除镜像数据,只是处于该状态的镜像不可恢复。
镜像与实例交互流程-实例启动前

!tip
Glance store包含一定数量的镜像,计算节点包含可用的vCPU,内存和本地磁盘资源,Cinder-volume包含一定数量的卷。
镜像与实例交互流程-实例从镜像启动

!tip
启动实例时,需要选择一个镜像,规格和任何可选属性。选定的规格提供一个系统盘,标记为vda,另外一个临时盘被标记为vdb,cinder-volume提供的卷被映射到第三个虚拟磁盘并将其称为vdc。
镜像服务将基本镜像从镜像存储复制到本地磁盘。vda是实例访问的第一个磁盘。如果镜像文件越小,则通过网络复制的数据越少,实例启动就会越快。
实例启动时还会创建一块空的临时磁盘vdb,删除实例时将删除此磁盘。
计算节点使用iSCSI 连接到cinder-volume提供的某个卷。该卷被映射到第三个磁盘vdc。计算节点为实例提供vCPU和内存资源后,实例将从根卷vda启动。该实例运行并更改磁盘上的数据(图中红色标示磁盘)。
如果cinder-volume位于单独的网络上,则存储节点配置文件中my_block_storage_ip选项会将镜像流量定向到计算节点。
注意:
此示例场景中的某些详细信息可能与实际环境不同。例如,可以使用不同类型的后端存储或不同的网络协议。常见的一种场景是vda,vdb存放在SAN存储,而不是本地磁盘上。
镜像与实例交互流程-实例删除后

!tip
实例被删除后, 除cinder-volume卷之外的其他资源都会被回收。临时磁盘无论是否加密过,都将会被清空,内存和vCPU资源将会被释放。在这个过程中镜像不会发生任何改变。
注意:
如果创建实例时选择了"删除实例时删除卷",则实例删除时,cinder-volume卷也会被删除。
Glance镜像制作
Glance镜像制作-直接下载镜像文件
- 最简单的Glance镜像制作方法是下载系统供应商官方发布的OpenStack镜像文件。大多数镜像预安装了cloud-init包,支持SSH密钥对登录和用户数据注入功能。
- CentOS
- CirrOS
- Debian
- Fedora
- Windows
- Ubuntu
- openSUSE
- SUSE Linux Enterprise
- Red Hat Enterprise Linux
!tip
!tip
镜像的具体下载链接,请参考OpenStack社区网站:
Glance镜像制作-手动制作镜像
- 如果直接下载的镜像不符合要求,可以手动制作Glance镜像文件
- 以制作Ubuntu 18.04为例:
| 操作步骤 | 对应命令 |
|---|---|
| 使用virt-manager创建一个Ubuntu 18.04虚拟机并安装系统 | |
| 登录虚拟机并安装cloud-init | $ sudo apt install cloud-init |
| 虚拟机内部,停止虚拟机 | $ sudo shutdown --h now |
| 预清理虚拟机 | $ sudo virt-sysprep --d VM ID |
| 释放虚拟机定义 | $ virsh undefine VM_ID |
| 制作镜像 | $ qemu-img create |
| 上传镜像 | $ openstack image create |
!tip
Virt-manager是一套图形化的虚拟机管理工具,提供虚拟机管理的基本功能,如开机、挂起、重启、关机、强制关机/重启、迁移等。
Glance镜像制作-常用工具
- 镜像制作工具
-
Diskimage-builder
-
自动化磁盘映像创建工具,可以制作Fedora,Red Hat Enterprise Linux,Ubuntu,Debian,CentOS和openSUSE镜像
-
示例:
bash$ disk-image-create ubuntu vm
-
-
Packer
- 使用Packer制作的镜像,可以适配到不同云平台,适合使用多个云平台的用户
-
virt-builder
- 快速创建新虚拟机的工具,可以在几分钟或更短的时间内创建各种用于本地或云用途的虚拟机镜像
-
Glance镜像制作-镜像转换
- 命令行qemu-img convert
| 镜像格式 | qemu-img参数 |
|---|---|
| QCOW2 (KVM,Xen) | qcow2 |
| QED (KVM) | qed |
| RAW | raw |
| VDI (VirtualBox) | vdi |
| VHD (Hyper-V) | vpc |
| VMDK (Vmware) | vmdk |
-
示例:raw转换为qcow2
bash$ qemu-img convert -f raw -O qcow2 image.img image.qcow2 -
VBoxManage:VDI (VirtualBox)转换为RAW
bash$ VBoxManage clonehd image.vdi image.img -format raw
irtualBox) | vdi |
| VHD (Hyper-V) | vpc |
| VMDK (Vmware) | vmdk |
-
示例:raw转换为qcow2
bash$ qemu-img convert -f raw -O qcow2 image.img image.qcow2 -
VBoxManage:VDI (VirtualBox)转换为RAW
bash$ VBoxManage clonehd image.vdi image.img -format raw