OpenStack Glance是一种提供发现、注册、和下载的镜像服务,也可以理解成是一个提供虚拟机镜像的集中式仓库。通过Glance的RESTful API,可以查询镜像元数据下载镜像。
虚拟机的镜像可以很方便的存储在各种地方,从简单的文件系统到对象存储系统(如OpenStack Swift项目)。在Glane里镜像被当做模板来存储,用于启动新实例。
Glance是一个可以组织和管理大量虚拟磁盘镜像的独立服务。Glance为云磁盘镜像提供了一个端到端的解决方案。它还可以从正在运行的实例建立快照用于备份虚拟机的状态。
通常情况下,我们会使用 NFS,Ceph,File 等作 为 Glance 映像和 Cinder 卷提供共享存储,有时候我们甚至会利用 iSCSI 的 Cinder 驱动程序。总而言之,这是一个普遍的配置方式,可以用来测试 OpenStack 功能。
我们最近发现了 Minio,Minio 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
Minio 可与 Docker 一起安装,因此我们决定在 Glance 中测试 OpenStack重新引入的对 S3 后端的支持。甚至,我们也会使用它来作为 Cinder 的卷备份。
配置 Minio
为了在我们的环境中通过 Docker 安装 Minio。
安装后,只需最少的配置即可与 Glance 以及 Cinder 一起使用。你需要如下配置:
- 具有 r/w 权限的用户
- 定义的区域
Docker 安装 Minio 仅需要一个命令:
docker run -p 9000:9000 -p 8800:8000--name minio --restart=always \
-e "MINIO_ACCESS_KEY=admin" \
-e "MINIO_SECRET_KEY=admin12345" \
-v /mydata/minio/data:/data \
-v /mydata/minio/config:/root/.minio \
minio/minio server /data
要创建用户,请导航到用户->创建用户并提供访问密钥和秘密密钥以及适当的权限:
ACCESS_KEY: admin
SECRET_KEY: admin123456
POLICY: readwrite
要定义区域,请导航至设置->区域并在服务器位置字段中设置区域名称。
MinIO Client (mc)为ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案。它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。
ls 列出文件和文件夹。
mb 创建一个存储桶或一个文件夹。
cat 显示文件和对象内容。
pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。
share 生成用于共享的URL。
cp 拷贝文件和对象。
mirror 给存储桶和文件夹做镜像。
find 基于参数查找文件。
diff 对两个文件夹或者存储桶比较差异。
rm 删除文件和对象。
events 管理对象通知。
watch 监听文件和对象的事件。
policy 管理访问策略。
session 为cp命令管理保存的会话。
config 管理mc配置文件。
update 检查软件更新。
version 输出版本信息。
下载安装
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
配置 Glance 使用 Minio
如果通过 OpenStack-Ansible 进行安装的话,那么有些配置需要变更,修改 playbook 配置 Glance 的后端。使用glance_additional_stores变量,注意必须确保同时还指定了其他默认值(因为是附加变量,而不是完全覆盖)。
下面的name可以是任意的,本处使用minio,用来指定 Minio 存储,同时type是指定后端存储的类型,本处使用 s3 。
glance_additional_stores:
- http
- cinder
- name: minio
type: s3
除了glance_additional_stores,您还必须定义一个映射到新后端定义的新配置块。对于 OpenStack-Ansible,这可以作为配置覆盖来完成:
glance_glance_api_conf_overrides:
minio:
s3_store_host: http://10.100.100.110:9000
s3_store_access_key: admin
s3_store_secret_key: admin123456
s3_store_bucket: glance
s3_store_create_bucket_on_put: True
s3_store_bucket_url_format: auto
在glance-api.conf中,完整的配置信息如下:
[minio]
s3_store_host = http://10.100.100.110:9000
s3_store_access_key = admin
s3_store_secret_key = admin123456
s3_store_bucket = glance110
s3_store_create_bucket_on_put = True
s3_store_bucket_url_format = auto
如果使用的是 Kolla 进行 Openstack 的安装,则创建如下/etc/kolla/config/glance/glance-api.conf配置文件,进行覆盖:
[DEFAULT]
enabled_backends = file:file, http:http, cinder:cinder, minio:s3
[glance_store]
default_backend = minio
[minio]
s3_store_host = http://10.100.100.110:9000
s3_store_access_key = admin
s3_store_secret_key = admin123456
s3_store_bucket = glance110
s3_store_create_bucket_on_put = True
s3_store_bucket_url_format = auto
配置 Cinder-backup 使用 Minio
如果使用的是 Kolla 进行 Openstack 的安装,则创建如下/etc/kolla/config/cinder/cinder-backup.conf配置文件,进行覆盖:
[DEFAULT]
backup_driver = cinder.backup.drivers.s3.S3BackupDriver
backup_s3_endpoint_url = http://10.100.100.110:9000
backup_s3_store_access_key = admin
backup_s3_store_secret_key = admin123456
backup_s3_store_bucket = cinderbackup110
如果使用 OpenStack-Ansible 安装的话,修改方式同 Glance。
测试后端
如果默认 Glance 后端(文件)没有更改,仍然可以使用glance客户端将单个镜像上传到新的 S3 后端。
在此示例中,将上传 Cirros 镜像像到minio后端:
[root@node110 ~(keystone_admin)]#~/images# glance image-create --file cirros-0.5.1-x86_64-disk.img --disk-format raw --container-format bare --name cirros3 --store minio --progress
[=============================>] 100%
+------------------+----------------------------------------------------------------------------------+
| Property | Value |
+------------------+----------------------------------------------------------------------------------+
| checksum | b874c39491a2377b8490f5f1e89761a4 |
| container_format | bare |
| created_at | 2022-09-13T08:53:50Z |
| disk_format | qcow2 |
| id | bfe5579e-96ce-4acb-8c36-871935beda33 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros3 |
| os_hash_algo | sha512 |
| os_hash_value | 6b813aa46bb90b4da216a4d19376593fa3f4fc7e617f03a92b7fe11e9a3981cbe8f0959dbebe3622 |
| | 5e5f53dc4492341a4863cac4ed1ee0909f3fc78ef9c3e869 |
| os_hidden | False |
| owner | 71a836dac0b044a4b47f6a9ecd4533c6 |
| protected | False |
| size | 16300544 |
| status | active |
| stores | minio |
| tags | [] |
| updated_at | 2022-09-13T08:53:51Z |
| virtual_size | 117440512 |
| visibility | shared |
+------------------+----------------------------------------------------------------------------------+
上传后,可以通过指定镜像名称或 UUID 来创建实例。
在如下的案例中,将会创建卷vol1以及对应的备份。
[root@node110 ~(keystone_admin)]# openstack volume create --size 1 vol1
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2022-09-13T08:56:19.058924 |
| description | None |
| encrypted | False |
| id | 683c20ed-debb-4531-b176-f623826a9197 |
| migration_status | None |
| multiattach | False |
| name | vol1 |
| properties | |
| replication_status | None |
| size | 1 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| type | __DEFAULT__ |
| updated_at | None |
| user_id | b80333df70ad4856a7fb7a490ade7063 |
+---------------------+--------------------------------------+
[root@node110 ~(keystone_admin)]# openstack volume backup create --name vol1-back1 683c20ed-debb-4531-b176-f623826a9197
+-------+--------------------------------------+
| Field | Value |
+-------+--------------------------------------+
| id | 231d4985-ef9e-43b1-bb50-ec653556c711 |
| name | vol1-back1 |
+-------+--------------------------------------+
[root@node110 ~(keystone_admin)]# openstack volume backup show 231d4985-ef9e-43b1-bb50-ec653556c711
+-----------------------+--------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------+
| availability_zone | None |
| container | cinderbackup110 |
| created_at | 2022-09-13T08:59:19.000000 |
| data_timestamp | 2022-09-13T08:59:19.000000 |
| description | None |
| fail_reason | None |
| has_dependent_backups | False |
| id | 231d4985-ef9e-43b1-bb50-ec653556c711 |
| is_incremental | False |
| name | vol1-back1 |
| object_count | 21 |
| size | 1 |
| snapshot_id | None |
| status | available |
| updated_at | 2022-09-13T08:59:43.000000 |
| volume_id | 683c20ed-debb-4531-b176-f623826a9197 |
+-----------------------+--------------------------------------+
通过 Minio 提供的客户端命令 mc 查看 Minio 中的数据:
[root@node110 ~(keystone_admin)]# mc ls minio/glance110/
[2022-09-11 17:49:43 CST] 243MiB STANDARD 0f56bb90-8c40-44dd-8ad8-650a0c2afd64
[2022-09-13 16:53:51 CST] 16MiB STANDARD bfe5579e-96ce-4acb-8c36-871935beda33
[root@node110 ~(keystone_admin)]# mc ls minio/cinderbackup110/
[2022-09-13 17:09:13 CST] 0B volume_683c20ed-debb-4531-b176-f623826a9197/
基准测试 Minio
Minio 团队提供了一个名为 Warp 的基准测试实用程序,它可以在Github(https://github.com/minio/warp) 上作为预编译二进制文件的源代码获得。
要进行测试,您需要 Minio 端点以及访问密钥和密钥:
# warp mixed --host=10.100.100.110:9000 --access-key=admin --secret-key=admin123456 --autoterm
Throughput 7.3 objects/s within 7.500000% for 25.802s. Assuming stability. Terminating benchmark.
warp: Benchmark data written to "warp-mixed-2021-12-24[050521]-hCzP.csv.zst"
Mixed operations.
Operation: DELETE, 10%, Concurrency: 20, Ran 1m33s.
* Throughput: 2.39 obj/s
Operation: GET, 44%, Concurrency: 20, Ran 1m33s.
* Throughput: 104.80 MiB/s, 10.48 obj/s
Operation: PUT, 15%, Concurrency: 20, Ran 1m32s.
* Throughput: 36.17 MiB/s, 3.62 obj/s
Operation: STAT, 30%, Concurrency: 20, Ran 1m33s.
* Throughput: 7.00 obj/s
Cluster Total: 139.94 MiB/s, 23.35 obj/s over 1m34s.
概括
在本文中,我们很轻松的实现通过 Minio 的 S3 接口来存储 Glance 镜像以及 Cinder 卷的备份数据。同时我们也上传了镜像以及创建卷备份来验证 Minio 是否正常存储了数据。
对于我们的用例来说,使用像 Ceph,Swift(用于对象)这样的分布式存储有点过重,在很多中小环境以及实验环境中,我们仅仅需要一个快速,高效,简单的对象存储。另外,我们也可能会尝试实现一个 Swift 代理来将 Swift 后端指向 Minio, 这样就实现了 Minio 与 Openstack 的完整对接。