多後端存儲導⼊鏡像
背景
提到多後端導⼊鏡像,不得不提⼀下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/<url> “
介紹
該功能是對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/<StoreID>/<ImageID>’