cinder-volume 支持多種 volume provider,前面我們一直使用的是默認的 LVM,本節我們將增加 NFS volume provider。
雖然 NFS 更多地應用在實驗或小規模 cinder 環境,由於性能和缺乏高可用的原因在生產環境中不太可能使用,但是學習 NFS volume provider 的意義在於:
1. 理解 cinder-volume 如何支持多 backend
2. 更重要的,可以理解 cinder-volume,nova-compute 和 volume provider 是如何協同工作,共同為 instance 提供塊存儲。
3. 舉一反三,能夠快速理解並接入其他生產級 backend ,比如 Ceph,商業存儲等。
下圖展示了 cinder、nova 是如何與 NFS volume provider 協調工作的。
NFS Volume Provider
就是我們通常說的 NFS Server,提供遠程 NFS 目錄,NFS Clinet 可以 mount 這些遠程目錄到本地,然后像使用本地目錄一樣創建、讀寫文件以及子目錄。
cinder-volume
存儲節點通過 NFS driver 管理 NFS volume provider 中的 volume,這些 volume 在 NFS 中實際上是一個個文件。
nova-compute
計算節點將 NFS volume provider 存放 volume 的目錄 mount 到本地,然后將 volume 文件作為虛擬硬盤映射給 instance。
這里有幾點需要強調:
-
在 Cinder 的 driver 架構中,運行 cinder-volume 的存儲節點和 Volume Provider 可以是完全獨立的兩個實體。 cinder-volume 通過 driver 與 Volume Provider 通信,控制和管理 volume。
-
Instance 讀寫 volume 時,數據流不需要經過存儲節點,而是直接對 Volume Provider 中的 volume 進行讀寫。 正如上圖所示,存儲節點與 NFS Volume Provider 的連接只用作 volume 的管理和控制(綠色連線);真正的數據讀寫,是通過計算節點和 NFS Volume Proiver 之間的連接完成的(紫色連線)。這種設計減少了中間環節,存儲節點不直接參與數據傳輸,保證了讀寫效率。
-
其他 Volume Provider(例如 ceph,swift,商業存儲等)均遵循這種控制流與數據流分離的設計。
配置 NFS Volume Provider
在實驗環境中,NFS volume provider 的 NFS 遠程目錄為 192.168.104.11:/storage cinder-volume 服務節點上 mount point 為 /nfs_storage。
在 /etc/cinder/cinder.conf 中添加 nfs backend。
-
enabled_backends = lvmdriver-1,nfs 讓 cinder-volume 使用 nfs backend
-
[nfs] 中詳細配置 nfs backend。包括: a) 指定存儲節點上 /nfs_storage 為 nfs 的 mount point。
nfs_mount_point_base = /nfs_storage
b) 查看 /etc/cinder/nfs_shares 活動 nfs 共享目錄列表。 nfs_shares_config = /etc/cinder/nfs_shares,其內容為
列表中只有 192.168.104.11:/storage。如果希望有多個 nfs 共享目錄存放 volume,則可以添加到該文件中。
c) nfs volume driver。
volume_driver=cinder.volume.drivers.nfs.NfsDriver
d) 設置 volume backend name。在 cinder 中需要根據這里的 volume_backend_name 創建對應的 volume type,這個非常重要。 volume_backend_name = nfs
重啟 cinder-volume,cinder service-list 確認 nfs cinder-volume 服務正常工作。
創建 nfs volume type。
打開GUI頁面Admin -> System -> Volumes -> Volume Types,點擊 “Create Volume Type”。
命名 nfs,點擊“Create Volume Type”。
選擇 nfs volume tyep,點擊下拉菜單“View Extra Specs”
點擊“Create”,Key 輸入 volume_backend_name ;Value 輸入 nfs。
NFS volume provider 准備就緒,下一節我們將創建 NFS 為 backend 的 volume。