上一節我們創建了 volume,本節討論如何將 volume attach 到 Instance,今天是第一部分。
Volume 的最主要用途是作為虛擬硬盤提供給 instance 使用。Volume 是通過 Attach 操作掛載到 instance 上的。本節我們就來詳細討論 Cinder 是如何實現 Attach 的。
上一節我們成功創建了基于 LVM provider 的 volume。每個 volume 實際上是存儲節點上 VG 中的一個 LV。
那么問題來了:存儲節點上本地的 LV 如何掛載到計算節點的 instance 上呢?通常情況存儲節點和計算節點是不同的物理節點。
解決方案是使用 iSCSI,如下圖所示
iSCSI 是 Client-Server 架構,有 target 和 initiator 兩個術語。
Target
提供 iSCSI 存儲資源的設備,簡單的說,就是 iSCSI 服務器。
Initiator
使用 iSCSI 存儲資源的設備,也就是 iSCSI 客戶端。
Initiator 需要與 target 建立 iSCSI 連接,執行 login 操作,然后就可以使用 target 上面的塊存儲設備了。 Target 提供的塊存儲設備支持多種實現方式,我們實驗環境中使用的是 LV。 Cinder 的存儲節點 cinder-volume 默認使用 tgt 軟件來管理和監控 iSCSI target,在計算節點 nova-compute 使用 iscsiadm 執行 initiator 相關操作。
下面來看看 Attach 操作的流程圖
-
向 cinder-api 發送 attach 請求
-
cinder-api 發送消息
-
cinder-volume 初始化 volume 的連接
-
nova-compute 將 volume attach 到 instance
下面我們詳細討論每一個步驟。
向cinder-api發送attach請求
客戶(可以是 OpenStack 最終用戶,也可以是其他程序)向 cinder-api 發送請求:“請將這個 volume attach 到指定的 instance 上。
這里我們將 volume “vol-1” attach 到 instance ”c2”上。 attach 操作之前,c2 上的虛擬磁盤如下:
進入 GUI 操作菜單 Project -> Compute -> Volumes
選擇 volume “vol-1”,點擊“Manage Attachments”
在 “Attach to Instance”下拉列表中,選擇instance “c2”
點擊 ”Attach Volume”
cinder-api 將接收到 attach volume 的請求,attach 請求實際上包含兩個步驟:
-
初始化 volume 的連接 Volume 創建后,只是在 volume provider 中創建了相應存儲對象(比如 LV),這時計算節點是無法使用的。Cinder-volume 需要以某種方式將 volume export 出來,計算節點才能夠訪問得到。這個 export 的過程就是“初始化 volume 的連接”。 下面是 cinder-api 的日志文件 /opt/stack/logs/c-api.log 中記錄的相關信息
Initialize_connection 的具體工作主要由 cinder-volume 完成,將在后面詳細討論。
-
Attach volume 初始化 volume 連接后,計算節點將 volume 掛載到指定的 instance,完成 attach 操作。下面是 cinder-api 的日志文件 /opt/stack/logs/c-api.log 中記錄的相關信息
Attach 的具體工作主要由 nova-compute 完成,也將在后面詳細討論。
cinder-api 發送消息
cinder-api 分兩步完成 attach 操作,所以對應地會先后向 RabbitMQ 發送了兩條消息:
-
初始化 volume 的連接 cinder-api 沒有打印發送消息的日志,只能通過源代碼查看 /opt/stack/cinder/cinder/volume/api.py,方法為 initialize_connection
-
Attach volume cinder-api 沒有打印發送消息的日志,只能通過源代碼查看
下一節我們討論 cinder-volume 和 nova-compute 如何實現 attach 操作。