在Devstack中使能Cinder的Ceph RBD driver
阿新 • • 發佈:2019-01-01
假設已經有了一個DevStack和一個Ceph叢集,如何使DevStack上的Cinder能用上Ceph作為其儲存後端呢?
以下步驟如未做特殊說明,都是在DevStack虛機上操作。
1. 使該DevStack VM變成一個Ceph client
1.1 安裝 ceph-common
yum install ceph-common # 或者
apt install ceph-common
1.2 拷貝 Ceph Cluster 的ceph.conf 和 keyring 到 DevStack VM 的 /etc/ceph
# On DevStack sudo mkdir /etc/ceph sudo -R stack:stack /etc/ceph # 這一步很重要,否則RBD driver不能工作 # On monitor node of Ceph cluster scp /etc/ceph/ceph.conf <user>@<devstack_vm>:/etc/ceph scp /etc/ceph/xxx.keyring <user>@<devstack_vm>:/etc/ceph
2. 修改/etc/cinder/cinder.conf
2.1 在最後新增如下一段:
[ceph-rbd]
volume_backend_name=ceph-rbd
volume_driver=cinder.volume.drivers.rbd.RBDDriver
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_user=admin
rbd_pool=rbd
2.2 在enabled_backends一行加上自定義的volume_backend_name,即加上ceph-rbd
enabled_backends = lvmdriver-1,ceph-rbd
3. 重啟所有 cinder服務
sudo systemctl restart [email protected]* # c-api, c-sch, c-vol
4. 新增新driver型別
cd /opt/stack/devstack source openrc admin admin openstack volume type create ceph-rbd openstack volume type set --property volume_backend_name=ceph-rbd ceph-rbd cinder type-list # validate the drivers cinder extra-specs-list # validate the backends
5. 測試
cinder create --name cinder_disk_1 --volume-type ceph-rbd 10
cinder list
6. 其他
如果出錯了,檢視日誌的方法
sudo journalctl -f -u [email protected]
7. 使用程式除錯
最後,附一段Python程式碼可用來除錯RBD driver到Ceph cluster的連通性。
import rados
import rbd
def connect_to_rados(user, name='ceph', pool='rbd',
conf='/etc/ceph/ceph.conf'):
client = rados.Rados(rados_id=user,
clustername=name,
conffile=conf)
try:
client.connect()
ioctx = client.open_ioctx(pool)
return client, ioctx
except rados.Error:
msg = "Error connecting to ceph cluster."
print(msg)
client.shutdown()
def create_rbd(client, ioctx, name):
rbd_inst = rbd.RBD()
size = 1 * 1024**3
rbd_inst.create(ioctx, name, size)
def delete_rbd(ioctx, rbd_name):
rbd_inst = rbd.RBD()
rbd_inst.remove(ioctx, rbd_name)
def main():
client, ioctx = connect_to_rados('admin')
rbd_name = 'finix_rbd_01'
create_rbd(client, ioctx, rbd_name)
# delete_rbd(ioctx, rbd_name)
main()