1. 程式人生 > >在Devstack中使能Cinder的Ceph RBD driver

在Devstack中使能Cinder的Ceph RBD driver

假設已經有了一個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()