參考文檔:
- Install-guide:https://docs.openstack.org/install-guide/
- OpenStack High Availability Guide:https://docs.openstack.org/ha-guide/index.html
- 理解Pacemaker:http://www.cnblogs.com/sammyliu/p/5025362.html
十八.Openstack集成Ceph准備
Openstack環境中,數據存儲可分為臨時性存儲與永久性存儲。
臨時性存儲:主要由本地文件系統提供,並主要用於nova虛擬機的本地系統與臨時數據盤,以及存儲glance上傳的系統鏡像;
永久性存儲:主要由cinder提供的塊存儲與swift提供的對象存儲構成,以cinder提供的塊存儲應用最為廣泛,塊存儲通常以雲盤的形式掛載到虛擬機中使用。
Openstack中需要進行數據存儲的三大項目主要是nova項目(虛擬機鏡像文件),glance項目(共用模版鏡像)與cinder項目(塊存儲)。
下圖為cinder,glance與nova訪問ceph集群的邏輯圖:
- ceph與openstack集成主要用到ceph的rbd服務,ceph底層為rados存儲集群,ceph通過librados庫實現對底層rados的訪問;
- openstack各項目客戶端調用librbd,再由librbd調用librados訪問底層rados;
- 實際使用中,nova需要使用libvirtdriver驅動以通過libvirt與qemu調用librbd;cinder與glance可直接調用librbd;
- 寫入ceph集群的數據被條帶切分成多個object,object通過hash函數映射到pg(構成pg容器池pool),然后pg通過幾圈crush算法近似均勻地映射到物理存儲設備osd(osd是基於文件系統的物理存儲設備,如xfs,ext4等)。
1. 創建pool
# Ceph默認使用pool的形式存儲數據,pool是對若干pg進行組織管理的邏輯划分,pg里的對象被映射到不同的osd,因此pool分布到整個集群里。 # 可以將不同的數據存入1個pool,但如此操作不便於客戶端數據區分管理,因此一般是為每個客戶端分別創建pool。 # 為cinder,nova,glance分別創建pool,命名為:volumes,vms,images # 創建pool,需要覆蓋默認的pg num,官方文檔對pg num的數量有如下建議:http://docs.ceph.com/docs/master/rados/operations/placement-groups/; # 同時綜合考量全部pool的pg num總和的上限:pg num * 副本數量 < mon_max_pg_per_osd(默認200) * num_in_osds(osd總進程數); # pool創建在monitor節點操作,以controller01節點為例; # 這里volumes池是永久性存儲,vms是實例臨時后端存儲,images是鏡像存儲 [root@controller01 ~]# su - cephde [cephde@controller01 ~]$ sudo ceph osd pool create volumes 256 [cephde@controller01 ~]$ sudo ceph osd pool create vms 256 [cephde@controller01 ~]$ sudo ceph osd pool create images 256
# 查看狀態 [cephde@controller01 ~]$ sudo ceph pg stat [cephde@controller01 ~]$ sudo ceph osd lspools
2. 安裝Ceph客戶端
# glance-api服務所在節點需要安裝python-rbd; # 這里glance-api服務運行在3個控制節點,以controller01節點為例 [root@controller01 ~]# yum install python-rbd -y # cinder-volume與nova-compute服務所在節點需要安裝ceph-common; # 這里cinder-volume與nova-compute服務運行在3個計算(存儲)節點,以compute01節點為例 [root@compute01 ~]# yum install ceph-common -y
3. 授權設置
1)創建用戶
# ceph默認啟用cephx authentication(見ceph.conf),需要為nova/cinder與glance客戶端創建新的用戶並授權; # 可在管理節點上分別為運行cinder-volume與glance-api服務的節點創建client.glance與client.cinder用戶並設置權限; # 針對pool設置權限,pool名對應創建的pool [root@controller01 ~]# ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images' [root@controller01 ~]# ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
2)推送client.glance秘鑰
# 將創建client.glance用戶生成的秘鑰推送到運行glance-api服務的節點 [root@controller01 ~]# ceph auth get-or-create client.glance | tee /etc/ceph/ceph.client.glance.keyring [root@controller01 ~]# ceph auth get-or-create client.glance | ssh root@controller02 tee /etc/ceph/ceph.client.glance.keyring [root@controller01 ~]# ceph auth get-or-create client.glance | ssh root@controller03 tee /etc/ceph/ceph.client.glance.keyring # 同時修改秘鑰文件的屬主與用戶組 [root@controller01 ~]# chown glance:glance /etc/ceph/ceph.client.glance.keyring [root@controller01 ~]# ssh root@controller02 chown glance:glance /etc/ceph/ceph.client.glance.keyring [root@controller01 ~]# ssh root@controller03 chown glance:glance /etc/ceph/ceph.client.glance.keyring
3)推送client.cinder秘鑰(nova-volume)
# 將創建client.cinder用戶生成的秘鑰推送到運行cinder-volume服務的節點 [root@controller01 ~]# ceph auth get-or-create client.cinder | ssh root@compute01 tee /etc/ceph/ceph.client.cinder.keyring [root@controller01 ~]# ceph auth get-or-create client.cinder | ssh root@compute02 tee /etc/ceph/ceph.client.cinder.keyring [root@controller01 ~]# ceph auth get-or-create client.cinder | ssh root@compute03 tee /etc/ceph/ceph.client.cinder.keyring # 同時修改秘鑰文件的屬主與用戶組 [root@controller01 ~]# ssh root@compute01 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring [root@controller01 ~]# ssh root@compute02 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring [root@controller01 ~]# ssh root@compute03 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
4)推送client.cinder秘鑰(nova-compute)
這里nova-compute服務與nova-volume服務運行在相同節點,不必重復操作。
5)libvirt秘鑰
nova-compute所在節點需要將client.cinder用戶的秘鑰文件存儲到libvirt中;當基於ceph后端的cinder卷被attach到虛擬機實例時,libvirt需要用到該秘鑰以訪問ceph集群; # 在管理節點向計算(存儲)節點推送client.cinder秘鑰文件,生成的文件是臨時性的,將秘鑰添加到libvirt后可刪除 [root@controller01 ~]# ceph auth get-key client.cinder | ssh root@compute01 tee /etc/ceph/client.cinder.key [root@controller01 ~]# ceph auth get-key client.cinder | ssh root@compute02 tee /etc/ceph/client.cinder.key [root@controller01 ~]# ceph auth get-key client.cinder | ssh root@compute03 tee /etc/ceph/client.cinder.key # 在計算(存儲)節點將秘鑰加入libvirt,以compute01節點為例; # 首先生成1個uuid,全部計算(存儲)節點可共用此uuid(其他節點不用操作此步); # uuid后續配置nova.conf文件時也會用到,請保持一致 [root@compute01 ~]# uuidgen
# 添加秘鑰 [root@compute01 ~]# cd /etc/ceph [root@compute01 ceph]# touch secret.xml [root@compute01 ceph]# vim secret.xml <secret ephemeral='no' private='no'> <uuid>10744136-583f-4a9c-ae30-9bfb3515526b</uuid> <usage type='ceph'> <name>client.cinder secret</name> </usage> </secret> [root@compute01 ceph]# virsh secret-define --file secret.xml [root@compute01 ceph]# virsh secret-set-value --secret 10744136-583f-4a9c-ae30-9bfb3515526b --base64 $(cat /etc/ceph/client.cinder.key)