OpenStack 镜像管家 Glance:架构、镜像格式、状态机与镜像制作全讲解

文章目录

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社区网站:

https://docs.openstack.org/image-guide/obtain-images.html。

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
相关推荐
Erishen4 小时前
能算的绝不调模型:resolve-harness 的确定性 Fast Path 运行时
架构·开源
阿拉斯攀登4 小时前
CTF-Web题型刷题思路:CTFHub、攻防世界题型拆解
架构
阿拉斯攀登4 小时前
CTF-Writeup规范:解题思路、漏洞分析、复盘总结
架构
TunerT_TQ4 小时前
智能体评测的哲学——当“跑分”不再等于“能力”|第0期 · 序章
安全·架构·agent
JouYY4 小时前
我用DSH高效管理了我的prompt收藏
架构·llm·agent
岁月如歌77865 小时前
分布式锁完全指南:从数据库到 Redisson 的演进
java·后端·架构
阿拉斯攀登5 小时前
中间件漏洞专项:Tomcat、Nginx、Apache漏洞复现与修复
架构
潮族大Z5 小时前
App 架构演进:MVC → MVP → MVVM → MVI,一篇看懂
架构
2601_962218475 小时前
万象生鲜系统智能报表引擎技术为生鲜企业提供数字化经营分析能力
大数据·运维·微服务·云原生·架构
阿拉斯攀登5 小时前
Java-PHP反序列化漏洞原理与实战
架构