cinder-volume 支持多種 volume provider,前面咱們一直使用的是默認的 LVM,本節咱們將增長 NFS volume provider。swift
雖然 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 這些遠程目錄到本地,而後像使用本地目錄同樣建立、讀寫文件以及子目錄。ide
cinder-volume
存儲節點經過 NFS driver 管理 NFS volume provider 中的 volume,這些 volume 在 NFS 中其實是一個個文件。性能
nova-compute
計算節點將 NFS volume provider 存放 volume 的目錄 mount 到本地,而後將 volume 文件做爲虛擬硬盤映射給 instance。學習
這裏有幾點須要強調:spa
在 Cinder 的 driver 架構中,運行 cinder-volume 的存儲節點和 Volume Provider 能夠是徹底獨立的兩個實體。 cinder-volume 經過 driver 與 Volume Provider 通訊,控制和管理 volume。設計
Instance 讀寫 volume 時,數據流不須要通過存儲節點,而是直接對 Volume Provider 中的 volume 進行讀寫。 正如上圖所示,存儲節點與 NFS Volume Provider 的鏈接只用做 volume 的管理和控制(綠色連線);真正的數據讀寫,是經過計算節點和 NFS Volume Proiver 之間的鏈接完成的(紫色連線)。這種設計減小了中間環節,存儲節點不直接參與數據傳輸,保證了讀寫效率。ci
其餘 Volume Provider(例如 ceph,swift,商業存儲等)均遵循這種控制流與數據流分離的設計。效率
在實驗環境中,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。