一、OpenStack镜像服务
1、什么是镜像
- 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。
- 虚拟机所使用的虚拟磁盘,实际上是一种特殊格式的镜像文件。
- 云环境下尤其需要镜像。
- 镜像就是一个模板,类似于VMware的虚拟机模板,其预先安装基本的操作系统和其他应用软件。
- OpenStack中的镜像就是虚拟机镜像,是包含有可启动的操作系统的虚拟机实例磁盘的单个文件。
2、什么是镜像服务
- 镜像服务就是用来管理镜像的,用途就是让用户能够发现、获取和保存镜像。
- OpenStack中提供镜像服务的是Glance项目,其功能有:
- 查询和获取镜像的元数据和镜像本身。
- 注册和上传虚拟机镜像,包括镜像的创建、下载和管理。
- 维护镜像信息,包括镜像的元数据和镜像本身。
- 支持多种方式存储镜像。
- 对虚拟机实例执行创建快照命令来创建新的镜像,或备份虚拟机实例的状态。
- Glance是关于镜像的中心,可以被终端用户或Nova计算服务访问,接受磁盘或镜像的API请求,定义镜像元数据的操作
3、Glance架构
Glance不负责实际存储,只实现镜像管理功能,功能单一,包含组件较少。
- 客户端:Glance服务的使用者。
- glance-api:系统后台运行的服务进程,是Glance服务的入口,对外提供REST API,负责接受来自客户端的RESTful请求,响应镜像查询、获取和存储的调用。
- 与镜像本身存取相关操作,glance-api会将请求转发给该镜像的存储后端,由后端提供相应操作。
- 与镜像的元数据相关操作,glance-api会直接操作数据库,存取镜像的元数据(大小、类型等信息)
- 数据库:Glance的数据库模块用于存储镜像的元数据,可以选用MySQL、MariaDB等
- 存储后端:Glance服务本身不存储镜像文件,而是将文件存放在后端存储系统中。例如:
- 本地文件存储(或任何挂载到glance-api控制节点的文件系统):默认配置
- 对象存储:Swift
- RADOS块设备(RBD)
- Sheepdog:一个分布式存储系统,为QEMU提供块存储服务,为支持互联网SCSI协议的客户端提供存储服务,同时支持RESTful接口的对象存储服务。
- 块存储:Cinder
- VMware数据存储
4、验证OpenStack的Glance服务
4.1、查看Glance配置文件
[root@node-a ~]# cd /etc/glance
[root@node-a glance]# ls
glance-api.conf # Glance API服务器配置文件
glance-registry.conf
metadefs
rootwrap.d
glance-cache.conf # 定义镜像缓存配置
glance-scrubber.conf # 定义镜像删除相关配置
policy.json # 镜像服务的策略配置文件
schema-image.json
glance-image-import.conf
glance-swift.conf
rootwrap.conf
4.2、验证Glance服务
# 查看当前运行的Glance服务
[root@node-a glance]# systemctl status *glance*.service
● openstack-glance-api.service - OpenStack Image Service (code-named Glance) API server
Loaded: loaded (/usr/lib/systemd/system/openstack-glance-api.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-04-09 14:23:29 CST; 6 days ago
...
● openstack-glance-registry.service - OpenStack Image Service (code-named Glance) Registry server
Loaded: loaded (/usr/lib/systemd/system/openstack-glance-registry.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-04-09 14:23:29 CST; 6 days ago
...
Glance有两个子服务。glance-registry是系统后台 运行的Glance注册服务进程,负责处理与镜像源数据相关的RESTful请求。从Queens版本开始弃用,这里为了兼容早期版本。
4.3、使用镜像服务的API
请求一个admin项目作用域的令牌
[root@node-a ~]# curl -i -H "Content-Type: application/json" -d '
{ "auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "admin",
"domain": { "id": "default" },
"password": "admin账号的密码"
}
}
},
"scope": {
"project": {
"name": "admin",
"domain": { "id": "default" }
}
}
}
}' "http://localhost:5000/v3/auth/tokens" ;
导出环境变量OS_TOKEN,并将其设置为上述操作获取的令牌ID,尝试通过Images API v1获取当前镜像列表
[root@node-a ~]# export OS_TOKEN="上述获取到的TOKEN"
[root@node-a ~]# curl -s -H "X-Auth-Token: $OS_TOKEN" http://localhost:9292/v1/images
v1无法使用,要求使用Image API v2
[root@node-a ~]# curl -s -H "X-Auth-Token: $OS_TOKEN" http://localhost:9292/v2/images
通过认证令牌向本地运行的服务(端口9292)发起请求,获取关于镜像的信息,然后通过管道将这些信息传递给Python的json.tool模块,格式化输出JSON数据。
[root@node-a ~]# curl -s -H "X-Auth-Token: $OS_TOKEN" http://localhost:9292/v2/images | python -mjson.tool
二、管理OpenStack镜像
1、虚拟机镜像的磁盘格式和容器格式
1.1、虚拟机镜像的磁盘格式
磁盘格式 | 说明 |
---|---|
.raw | 无结构的磁盘格式 |
.vhd | VHD磁盘格式。该格式通用于VMware、Xen、Microsoft、VirtualBox以及其他虚拟机实例管理程序 |
.vhdx | VHDX磁盘格式。VHD格式的增强版本,支持更大的磁盘尺寸 |
.vmdk | 另一种比较通用的虚拟机实例磁盘格式 |
.vdi | 由VirtualBox虚拟机实例监控程序和QEMU仿真器支持的磁盘格式 |
.iso | 用于光盘(如CD-ROM)数据内容的档案格式 |
.ploop | 由Virtuozzo支持,用于运行OS容器的磁盘格式 |
.qcow2 | 由QEMU仿真器支持,可动态扩展,支持写时复制(Copy on Write)的磁盘格式 |
.aki | 在Glance中存储的Amazon内核格式 |
.ari | 在Glance中存储的Amazon虚拟内存盘(Ramdisk)格式 |
.ami | 在Glance中存储的Amazon虚拟机实例格式 |
1.2、虚拟机镜像的容器格式
容器格式 | 说明 |
---|---|
.bare | 没有容器或元数据封头的镜像 |
.ovf | 开放虚拟化格式(Open Virtualization Format) |
.ova | 开放虚拟化设备格式(Open Virtualization Appliance Format) |
.aki | 在Glance中存储的Amazon内核格式 |
.ari | 在Glance中存储的Amazon虚拟内存盘(Ramdisk)格式 |
.ami | 在Glance中存储的Amazon机器格式 |
.docker | 在Glance中存储的容器文件系统的Docker的tar档案 |
.compressed | 未指定压缩文件的精确格式。特定的OpenStack服务可能支持特定的格式。可以假定任何使用这种压缩容器格式镜像创建的OpenStack服务能够使用这种镜像 |
2、镜像的状态
3、镜像的访问权限
- Public(公共的):可以被所有的项目使用。
- Private(私有的):只能被镜像所有者所在的项目使用。
- Shared(共享的):一个非共有的镜像可以共享给其他项目。
- Protected(受保护的):镜像不能被删除。
4、镜像的元数据
- 镜像的元数据即镜像属性,提供关于由镜像服务所存储的虚拟磁盘的信息。
- 元数据作为与镜像数据关联的镜像记录的一部分由镜像服务存储。
- 相关的OpenStack组件和驱动通过镜像元数据与镜像服务交互。
- 元数据定义服务提供了一个通用的API来自定义可用的键值对元数据。
5、命令行的镜像管理方法
5.1、查看镜像(语法)
# 查看已有的镜像列表,查询结果包括镜像的ID和名称,以及状态
openstack image list
# 查看镜像详细信息
openstack image show 镜像名称或ID
# 创建镜像
openstack image create [选项] 镜像名称
# 更改镜像
openstack image set [选项] 镜像名称
# 取消镜像更改
openstack image unset [选项] 镜像名称
# 删除镜像
openstack image delete <镜像名称或ID>
# 将镜像与项目关联
openstack image add project [--project-domain 项目所属域] 镜像名或ID 项目名或ID
# 将镜像与项目解除关联
openstack image remove project [--project-domain 项目所属域] 镜像名或ID 项目名或ID
6、实操
6.1、获取镜像
FDO官网: Image resources — RDO (rdoproject.org)
OpenStack官网: CentOS Cloud images
6.2、查看镜像
普通云用户一般通过Web图形界面来使用镜像:
-
镜像列表-demo:
-
镜像详细信息:
测试时使用命令行工具查看镜像:
6.3、创建镜像
将下载的镜像通过xftp工具上传到虚拟机中的Downloads文件夹下:
本例下载的文件是CentOS-7-x86_64-GenericCloud-2003.qcow2.xz,这是一个.xz格式的压缩包,需要先解压缩才能使用。
[root@node-a ~]# yum install xz # 解压缩工具
# 执行命令将下载的镜像压缩包解压缩
[root@node-a ~]# xz -d /root/Downloads/CentOS-7-x86_64-GenericCloud-2003.qcow2.xz
# 加载云管理员admin的环境脚本,以admin用户身份进行操作
[root@node-a ~]# source keystonerc_admin
# 向OpenStack云上传一个.qcow2格式的CentOS 7镜像并进行注册。
[root@node-a ~(keystone_admin)]# openstack image create --disk-format qcow2 --container-format bare --public --file ~/Downloads/CentOS-7-x86_64-GenericCloud-2003.qcow2 centos7
# 查看镜像列表(可以看到新建成功
[root@node-a ~(keystone_admin)]# openstack image list
+--------------------------------------+---------+--------+
| ID | Name | Status |
+--------------------------------------+---------+--------+
| c6cb27d8-4d93-427d-b67a-af6349dab979 | centos7 | active |
| 3669a079-518f-4cb5-b1c1-677dad16096e | cirros | active |
| 190b8365-19bc-43a1-8314-e8139d5d8be6 | fedora | active |
+--------------------------------------+---------+--------+
# 查看刚刚新建的centos7镜像的详细信息
[root@node-a ~(keystone_admin)]# openstack image show centos7
6.4、管理镜像
Web图形界面管理镜像:
-
镜像管理操作界面:
-
编辑镜像界面:
-
编辑镜像的元数据界面:
命令行工具为镜像设置元数据:
-
在创建镜像的openstack image create命令或修改镜像的openstack image set命令中,通过--property选项以键值对的形式定义元数据。
# 通过元数据设置将“fedora”镜像的架构(architecture)设置为x86_64、Hypervisor_type类型设置为qemu。
[root@node-a ~(keystone_admin)]# openstack image set --property architecture=x86_64 --property hypervisor_type=qemu fedora
-
#OpenStack镜像通用的镜像元数据在/etc/glance/schema-image.json 配置文件中定义。
6.5、转换镜像格式
使用qemu-img工具的convert子命令将镜像从一种格式转换为另一种格式。
# 格式
qemu-img convert [-f 源格式] [-O 目标格式] [-o 选项] 源文件路径 目标文件路径
# 将.raw格式的cirros镜像转换为.qcow2格式的镜像
[root@node-a ~]# qemu-img convert -f raw -O qcow2 ~/Downloads/cirros-0.5.1-x86_64-disk.img ~/Downloads/cirros-0.5.1-x86_64-disk.qcow2
三、基于预制镜像定制OpenStack镜像
1、cloud-init
- cloud-init是一组Python脚本的集合,是一个能够定制云镜像的实用工具。
- 通过修改/etc/cloud/cloud.cfg配置文件来实现。
- cloud-init一般会被包含在用于启动虚拟机实例的镜像文件中。
- 基于镜像部署虚拟机实例,cloud-init会随虚拟机实例的启动自动启动,对虚拟机实例进行自定义的初始配置。
- cloud-init目前支持Ubuntu、Fedora、Debian、RHEL、CentOS等主流的Linux操作系统发行版。
2、实例快照
- 快照(Snapshots)是一种基于时间点的数据备份技术,能够记录某一个时刻的数据信息并将其保存,以便在需要时将数据恢复到之前时间点的状态
- OpenStack中为虚拟机实例生成的快照抓取实例正在运行的磁盘的状态,其实是一个完整的镜像,由Glance镜像服务管理。
3、基于预制镜像定制镜像的方法
四、使用自动化工具制作OpenStack镜像
1、Diskimage-builder工具
- Diskimage-builder简称DIB,是OpenStack的官方项目。
- DIB主要用于构建适用于OpenStack平台的操作系统镜像。
- Diskimage-builder的镜像生成原理
- 将最初启动虚拟机实例时安装操作系统完成后的镜像保存为基础镜像。
- 将该基础镜像挂载到本地。
- chroot到根分区。
-
根据不同的定制需要增加不同的模块。
-
安装完成后保存为特定格式的镜像文件。
-
使用Diskimage-builder首次制作某操作系统镜像时需要从网上下载该操作系统的基础镜像文件,后面再制作同一版本的镜像时,可直接使用镜像缓存文件。
2、其他自动化镜像生成工具
- Oz:自动化生成虚拟机镜像文件的命令行工具。
- Packer:从单个源配置构建多种平台的虚拟机镜像的工具。
- image-bootstrap:生成可启动的虚拟机镜像的命令行工具。
- imagefactory:可以自动构建、转换和上传镜像到不同的云提供商的新型工具。
- KIWI:操作系统镜像构建器,支持多种Linux硬件平台、虚拟化和云系统的操作系统镜像构建。
- virt-builder:快速构建虚拟机镜像的工具。
3、实操
3.1、安装Diskimage-builder
[root@node-a ~]# python # 1、检查python环境
Python 2.7.5 (default, Nov 14 2023, 16:14:06)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
[root@node-a ~]# pip -y install epel-release # 2、安装epel扩展源
[root@node-a ~]# yum -y install python-pip # 3、安装pip工具
[root@node-a ~]# yum -y install qemu-img kpartx # 4、安装支持环境
[root@node-a ~]# pip install --upgrade "pip < 20.0" # 5、升级pip工具
[root@node-a ~]# pip install "diskimage-builder==2.2.0" # 6、安装Diskimage-builder
[root@node-a ~]# disk-image-create --version # 检查是否安装完成,输出版本
2.2.0
3.2、使用Diskimage-builder自动构建Ubuntu操作系统镜像
-
设置相关的环境变量
[root@node-a ~]# export DIB_DEV_USER_USERNAME=ubuntu #初始用户名 [root@node-a ~]# export DIB_DEV_USER_PASSWORD=ubuntu #初始用户密码 [root@node-a ~]# export DIB_DEV_USER_PWDLESS_SUDO=YES #为用户启用无密码sudo [root@node-a ~]# export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack" #cloud-init的源是ConfigDrive和OpenStack
-
构建镜像
[root@node-a ~]# disk-image-create -a amd64 -t qcow2 -o ubuntu.qcow2 ubuntu vm cloud-init-datasources devuser ... 2024-04-16 17:12:19.949 INFO diskimage_builder.block_device.blockdevice [-] Removing temporary dir [/tmp Converting image using qemu-img convert Image file ubuntu.qcow2 created... # 创建完成 ...
-
检查所生成的镜像文件
[root@node-a ~]# ls ubuntu.qcow2 -l -rw-r--r-- 1 root root 537329664 Apr 16 17:13 ubuntu.qcow2
-
开始测试,将该镜像上传到OpenStack云中并查看
[root@node-a ~]# source keystonerc_demo [root@node-a ~(keystone_demo)]# openstack image create --disk-format qcow2 --file ubuntu.qcow2 ubuntu ... # 查看,可以发现上传镜像成功 [root@node-a ~(keystone_demo)]# openstack image list +--------------------------------------+---------+--------+ | ID | Name | Status | +--------------------------------------+---------+--------+ | c6cb27d8-4d93-427d-b67a-af6349dab979 | centos7 | active | | 3669a079-518f-4cb5-b1c1-677dad16096e | cirros | active | | 190b8365-19bc-43a1-8314-e8139d5d8be6 | fedora | active | | bfe8eb08-3da7-4af7-a7ed-b13fa2978e90 | ubuntu | active | +--------------------------------------+---------+--------+
五、手动创建OpenStack镜像
手动制作镜像是最符合实际使用需求的,需要定制什么样的镜像都可以由自己来决定,只是过程比较烦琐。这种方式仅适合开发人员,或小规模的应用。