多后端存储导⼊镜像
背景
提到多后端导⼊镜像,不得不提⼀下glance多后端存储。
Glance ⼀开始仅⽀持单⼀后端存储,后来 Multi Store功能在Rocky中作为EXPERIMENTAL引⼊的,现已在Train版本中得到完全⽀持。该功能⽀持将镜像存储到多个后端存储。
U版本之前尽管已经⽀持多后端存储,但我们还是需要⼿动执⾏很多步骤才能在将镜像存储到其他后端并使⽤。
打个⽐⽅:
在不⽀持多后端存储时。centos镜像在ceph1中,要在ceph2上创建虚机,这时我们要把ceph1⾥的镜像下载并上传到ceph2中后VM1才能创建成功。
从Rocky版本中添加了多后端存储功能,但是需要⼿动指定要导⼊的存储中,并且会有很多⼿动操作步骤。
从U版本开始我们可以省去⼿动操作的步骤,在import镜像的时候就可以向多个后端存储导⼊镜像。
当前有了多后端存储功能,可以向ceph1和ceph2同时导⼊镜像,ceph1和ceph2中都有centos镜像,所以创建根⽬录在ceph2上的虚机VM1时直接从ceph2⾥拿镜像快照就可以,减少了很多步骤。
目的
在使⽤多后端存储时,减少⼿动操作;
API介绍和使⽤⽅式
此更改需要所有endpoint都将在v2 Glance API下。如果未明确指定,则假定为” /v2/
介绍
该功能是对API: /v2/images/{image_id}/import 的增强。
我们可以先⽤curl命令来参考如何使⽤该API:
curl -i -X POST -H "X-Auth-Token: $token"
-H "Content-Type: application/json"
-d '{"method":{"name":"glance-direct"},
"stores": ["ceph1", "ceph2"],
"all_stores_must_succeed": false}'
$image_url/v2/images/{image_id}/import
Import api 新增参数详解
POST /v2/images/{image_id}/import
⽤户可以通过查看2个属性来跟踪任务进度:
注意:
如果在请求过程中删除了镜像,导⼊其余后端存储的操作将不会执⾏并且会删除已经上传的镜像。
如果未指定“ stores”参数,则会去找request中header⾥的“ X-Image-Meta-Store”。
如果未指定任何参数(即“ X-Image-Meta-Store”和“stores”),则将配置为默认值(例如default_backend)的后端存储导⼊镜像。
如果“ all_stores”参数设置为true,并且设置了“ X-Image-Meta-Store”或“ stores”,则该请求将被拒绝为错误请求(即:http 400)。
举例
发送API请求向”ceph1“和”ceph2“导⼊镜像。
curl -i -X POST -H "X-Auth-Token: $token"
-H "Content-Type: application/json"
-d '{"method":{"name":"glance-direct"},
"stores": ["ceph1", "ceph2"],
"all_stores_must_succeed": false}'
$image_url/v2/images/{image_id}/import
跟踪任务进度Notififications
该请求要将镜像导⼊到ceph1和ceph2,先导⼊到ceph1
{ "priority": "INFO",
"event_type": "image.prepare",
"timestamp": "2019-08-27 16:10:30.066867",
"payload": {"status": "importing",
"name": "example",
"backend": "ceph1",
"os_glance_importing_to_stores": ["ceph1", "ceph2"],
"os_glance_failed_import": [],
...},
"message_id": "1c8993ad-e47c-4af7-9f75-fa49596eeb10",
...
}
正在将镜像导⼊到ceph1中
{
"priority": "INFO",
"event_type": "image.upload",
"timestamp": "2019-08-27 16:11:30.058812",
"payload": {"status": "active",
"name": "example",
"backend": "ceph1",
"os_glance_importing_to_stores": ["ceph2"],
"os_glance_failed_import": [],
...},
"message_id": "8b8993ad-e47c-4af7-9f75-fa49596eeb11",
...
}
准备导⼊到ceph2中
{
"priority": "INFO",
"event_type": "image.prepare",
"timestamp": "2019-08-27 16:10:30.066867",
"payload": {"status": "importing",
"name": "example",
"backend": "ceph2",
"os_glance_importing_to_stores": ["ceph2"],
"os_glance_failed_import": [],
...},
"message_id": "1c8993ad-e47c-4af7-9f75-fa49596eeb10",
...
}
导⼊ceph2失败
{
"priority": "ERROR",
"event_type": "image.upload",
"timestamp": "2019-08-27 16:11:30.058812",
"payload": {"status": "active",
"name": "example",
"backend": "ceph2",
"os_glance_importing_to_stores": [],
"os_glance_failed_import": ["ceph2"],
...},
"message_id": "8b8993ad-e47c-4af7-9f75-fa49596eeb11",
...
}
从上⾯的Notififications中可知上传“ ceph2”失败,但成功上传“ ceph1”。
当导⼊成功时,os_glance_importing_to_stores 中已经成功导⼊的后端存储会被删除;
当导⼊失败时导⼊失败的后端存储会增加到os_glance_failed_import中;
由于参数“ all_stores_must_succeed”已设置为“ false”,因此任务成功结束,并且镜像处于”ACTIVE“状态。
多后端存储复制镜像
介绍
该功能依赖于”多后端导⼊镜像“功能,API⽤的也是 /v2/images/{image_id}/import ,但是区别在于:import API中method参数中原来只有glance-direct和web-download两种选项,在U版本中增加了copy-image。注意:
如果要导⼊的镜像状态不是”ACTIVE“该请求会被拒绝;
如果该镜像存在,则会被复制到暂存区,复制到暂存区后,再导⼊所有指定的后端存储中。
万⼀在导⼊暂存区过程中或者copy/import 镜像时失败,则该镜像会从暂存区删除;
如果”all_stores“参数为True,则拒绝该请求;
如果图像已存在于指定位置,则拒绝该请求;
复制镜像时,会先从default_backend中找源镜像,如果镜像没在default_backend中,会遍历所有的后端存储寻找镜像复制到暂存区。
举例
POST /v2/images/{image_id}/import
从下⾯的curl请求中会发现:
选择的method为copy-image。
要导⼊到ceph1和ceph2中。
curl -i -X POST -H "X-Auth-Token: $token"
-H "Content-Type: application/json"
-d '{"method":{"name":"copy-image"},
"stores": ["ceph1", "ceph2"],
"all_stores_must_succeed": false}'
$image_url/v2/images/{image_id}/import
多后端存储删除镜像
因为glance增加了多后端存储功能,所以增加了”从指定后端存储删除镜像“功能。
API
DELETE /v2/stores//’