教你如何使用Ceph塊設(shè)備增強(qiáng)OpenStack云環(huán)境
也許Ceph最有意思的部分就是同OpenStack的集成了。libvirt 配置了 librbd 的 QEMU 接口,通過(guò)它可以在 OpenStack 中使用 Ceph 塊設(shè)備鏡像。Ceph 塊設(shè)備鏡像被當(dāng)作集群對(duì)象,這意味著它比獨(dú)立的服務(wù)器有更好的性能。
在 OpenStack 中使用 Ceph 塊設(shè)備,必須首先安裝 QEMU,libvirt 和 OpenStack。建議 OpenStack 安裝的時(shí)候使用獨(dú)立的物理節(jié)點(diǎn)。OpenStack 節(jié)點(diǎn)建議最小 8G RAM和四核處理器。下圖描述了 OpenStack 和 Ceph 技術(shù)層次。
Important:要在 OpenStack 中使用 Ceph,必須首先運(yùn)行 Ceph 存儲(chǔ)集群
OpenStack 與 Ceph 的三個(gè)結(jié)合點(diǎn):
- 鏡像:OpenStack Glance 管理虛擬機(jī)鏡像。鏡像是不變的。OpenStack 把鏡像當(dāng)作二進(jìn)制對(duì)象并以此格式下載。
- 卷:卷是塊設(shè)備。OpenStack 使用卷來(lái)啟動(dòng)虛擬機(jī),或者綁定卷到運(yùn)行中的虛擬機(jī)。OpenStack 使用 Cinder 服務(wù)管理卷。
- 客戶磁盤(pán):客戶磁盤(pán)是客戶操作系統(tǒng)磁盤(pán)。默認(rèn)情況下,當(dāng)啟動(dòng)一臺(tái)虛擬機(jī)時(shí),它的系統(tǒng)盤(pán)以文件的形式出現(xiàn)在 hypervisor 系統(tǒng)上(通常在/var/lib/nova/instances/<uuid>)。在 OpenStack Havana 以前的版本,在 Ceph 中啟動(dòng)虛擬機(jī)的唯一方式是使用 Cinder 的 boot-from-volume 功能,現(xiàn)在能夠在 Ceph 中直接啟動(dòng)虛擬機(jī)而不用依賴于 Cinder,這是非常有利的因?yàn)樗軌蜃屇愫苋菀椎倪M(jìn)行虛擬機(jī)的熱遷移。除此之外,如果 hypervisor 掛掉還能夠方便地觸發(fā) nova evacute 然后無(wú)縫得在其他的地方繼續(xù)運(yùn)行虛擬機(jī)。
可以使用 OpenStack Glance 來(lái)存儲(chǔ)鏡像在 Ceph 塊設(shè)備中,也可以使用 Cinder 通過(guò)鏡像的寫(xiě)時(shí)復(fù)制來(lái)啟動(dòng)虛擬機(jī)。
下面詳細(xì)介紹 Glance,Cinder 和 Nova 的配置過(guò)程,盡管它們沒(méi)有必要一起使用。當(dāng)虛擬機(jī)運(yùn)行使用本地磁盤(pán)運(yùn)行的時(shí)候,可以把鏡像存儲(chǔ)在 Ceph 塊設(shè)備中,或者正相反。
Important:Ceph 不支持 QCOW2 格式的虛擬機(jī)磁盤(pán)。所以,如果想要在 Ceph 中啟動(dòng)虛擬機(jī)(后端文件或者從卷啟動(dòng)),Glance 鏡像必須是 RAW格式
Tip:本文檔描述的 Ceph 塊設(shè)備是基于 OpenStack Havana。更早的版本請(qǐng)看Block Devices and OpenStack (Dumpling)。
創(chuàng)建一個(gè)池
默認(rèn)情況下,Ceph 塊設(shè)備使用 rbd 池??梢允褂萌魏文軌蚴褂玫某亍=ㄗh為 Cinder 和 Glance 單獨(dú)創(chuàng)建池。確保 Ceph 集群正常運(yùn)行,然后創(chuàng)建池。
- ceph osd pool create volumes 128
- ceph osd pool create images 128
- ceph osd pool create backups 128
- ceph osd pool create vms 128
看 Create a Pool 和 Placement Groups 來(lái)了解指定池的 pg 數(shù)量的詳細(xì)信息和應(yīng)該為你的池指定多少 pg。
配置 OpenStack Ceph 客戶端
運(yùn)行 glance-api,cinder-volume,nova-compute 和 cinder-backup 的節(jié)點(diǎn)是 Ceph 客戶端。每一個(gè)節(jié)點(diǎn)都需要 ceph.conf 文件:
- ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
安裝 Ceph 客戶端包
在 glance-api 節(jié)點(diǎn),需要為 librbd 綁定 Python
- sudo apt-get install python-ceph
- sudo yum install python-ceph
在 nova-compute,cinder-backup 和 cinder-volume 節(jié)點(diǎn)要用到 Python 和 Ceph 客戶端命令行工具:
- sudo apt-get install ceph-common
- sudo yum install ceph
設(shè)置 Ceph 客戶端認(rèn)證
如果使用了 cephx authentication,創(chuàng)建一個(gè)新用戶為 Nova/Cinder 和 Glance。執(zhí)行下面的命令:
- 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'
- ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
- ceph auth get-or-create client.cinder-backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backups'
為 client.cinder,client.glance 和 client.cinder-backup 添加密鑰來(lái)訪問(wèn)節(jié)點(diǎn)并改變所有者:
- ceph auth get-or-create client.glance | ssh {your-glance-api-server} sudo tee /etc/ceph/ceph.client.glance.keyring
- ssh {your-glance-api-server} sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring
- ceph auth get-or-create client.cinder | ssh {your-volume-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
- ssh {your-cinder-volume-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
- ceph auth get-or-create client.cinder-backup | ssh {your-cinder-backup-server} sudo tee /etc/ceph/ceph.client.cinder-backup.keyring
- ssh {your-cinder-backup-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring
運(yùn)行 nova-compute 的節(jié)點(diǎn) nova-compute 進(jìn)程需要密鑰文件。它們也存儲(chǔ) client.cinder 用戶的密鑰在 libvirt。libvirt 進(jìn)程在 Cinder 中綁定塊設(shè)備時(shí)需要用到它來(lái)訪問(wèn)集群。
創(chuàng)建一個(gè)臨時(shí)的密鑰文件副本在運(yùn)行 nova-compute 的節(jié)點(diǎn):
- ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key
然后在計(jì)算節(jié)點(diǎn),為 libvirt 添加密鑰文件并且移除臨時(shí)的副本密鑰:
- uuidgen
- 457eb676-33da-42ec-9a8c-9293d545c337
- cat > secret.xml <<EOF
- <secret ephemeral='no' private='no'>
- <uuid>457eb676-33da-42ec-9a8c-9293d545c337</uuid>
- <usage type='ceph'>
- <name>client.cinder secret</name>
- </usage>
- </secret>
- EOF
- sudo virsh secret-define --file secret.xml
- Secret 457eb676-33da-42ec-9a8c-9293d545c337 created
- sudo virsh secret-set-value --secret 457eb676-33da-42ec-9a8c-9293d545c337 \
- --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
Important:沒(méi)有必要保存所有計(jì)算節(jié)點(diǎn)的 UUID。但是為了平臺(tái)的一致性,最好保存相同的 UUID。
配置 OpenStack 使用 Ceph
配置 Glance
Glance 能夠使用多種后端來(lái)存儲(chǔ)鏡像。默認(rèn)使用 Ceph 塊設(shè)備,配置 Glance 如下:
Juno 之前的版本
編輯 /etc/glance/glance-api.conf 并且添加下面的 [DEFAULT] 部分:
- default_store = rbd rbd_store_user = glance rbd_store_pool = images rbd_store_chunk_size = 8
Juno
編輯 /etc/glance/glance-api.conf 并且添加 [glance_store] 部分:
- [DEFAULT]
- ...
- default_store = rbd
- ...
- [glance_store]
- stores = rbd
- rbd_store_pool = images
- rbd_store_user = glance
- rbd_store_ceph_conf = /etc/ceph/ceph.conf
- rbd_store_chunk_size = 8
更多關(guān)于 Glance 的配置信息請(qǐng)看:http://docs.openstack.org/trunk/config-reference/content/section_glance-api.conf.html。
Important:Glance 還沒(méi)有完全移到 'store'。所以仍然需要在 DEFAULT 部分配置 store。
#p#
所有 OpenStack 版本
如果要啟用鏡像的寫(xiě)時(shí)復(fù)制功能,添加下面的 [DEFAULT] 部分:
- show_image_direct_url = True
注意這會(huì)在 Glance API 中暴露后端存儲(chǔ)位置,所以 endpoint 不應(yīng)該被公開(kāi)訪問(wèn)
禁用 Glance 緩存管理來(lái)避免鏡像被緩存到 /var/lib/glance/image-cache/,確保配置文件中有 flavor = keystone+cachemanagement:
- [paste_deploy] flavor = keystone
配置 Cinder Backup
OpenStack Cinder Backup 需要一個(gè)守護(hù)進(jìn)程,不要忘記安裝它。在 Cinder Backup 節(jié)點(diǎn),編輯 /etc/cinder/cinder.conf 并添加:
- backup_driver = cinder.backup.drivers.ceph
- backup_ceph_conf = /etc/ceph/ceph.conf
- backup_ceph_user = cinder-backup
- backup_ceph_chunk_size = 134217728
- backup_ceph_pool = backups
- backup_ceph_stripe_unit = 0
- backup_ceph_stripe_count = 0
- restore_discard_excess_bytes = true
配置 Nova 綁定 Ceph rbd 塊設(shè)備
為了綁定 Cinder 設(shè)備(塊設(shè)備或者啟動(dòng)卷),必須告訴 Nova(和 libvirt)用戶和 UUID。libvirt 在與 Ceph 集群進(jìn)行連接和認(rèn)證的時(shí)候提供這個(gè)用戶。
- rbd_user = cinder
- rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
這兩個(gè)配置項(xiàng)同樣用于 Nova 的后端。
配置 Nova
為了直接從 Ceph 啟動(dòng)所有虛擬機(jī),你必須配置 Nova 的臨時(shí)后端。
建議在 Ceph 配置文件中啟用 RBD 緩存(從 Giant 版本默認(rèn)啟用)。還有,啟用 admin socket 對(duì)于故障排除的時(shí)候很有幫助。每臺(tái)使用 Ceph 塊設(shè)備的虛擬機(jī)都有一個(gè) socket 有助于性能分析和錯(cuò)誤判斷。
socket 可以通過(guò)這種方式訪問(wèn):
- ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help
現(xiàn)在,在每個(gè)計(jì)算節(jié)點(diǎn)編輯 Ceph 配置文件:
- [client]
- rbd cache = true
- rbd cache writethrough until flush = true
- admin socket = /var/run/ceph/$cluster-$type.$id.$pid.$cctid.asok
Tip:如果虛擬機(jī)正在運(yùn)行,可以直接重啟來(lái)獲得 socket。
HAVANA 和 ICEHOUSE
HAVANA 和 ICEHOUSE 需要補(bǔ)丁來(lái)實(shí)現(xiàn)寫(xiě)時(shí)復(fù)制并且修復(fù) rbd 臨時(shí)磁盤(pán)的鏡像大小和熱遷移 Bug。這些可用的分支基于主干 Nova stable/havana 和 stable/icehouse。使用它們不是強(qiáng)制性的但是是非常建議的,為了利用寫(xiě)時(shí)復(fù)制的功能。
在每個(gè)計(jì)算節(jié)點(diǎn),編輯 /etc/nova/nova.conf 并且添加:
- libvirt_images_type = rbd
- libvirt_images_rbd_pool = vms
- libvirt_images_rbd_ceph_conf = /etc/ceph/ceph.conf
- rbd_user = cinder
- rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
禁用文件注入也是一個(gè)好的習(xí)慣。啟動(dòng)一個(gè)實(shí)例的時(shí)候,Nova 通常試圖去打開(kāi)虛擬機(jī)的根文件系統(tǒng)。然后 Nova 注入值比如密碼,ssh 密鑰等,直接進(jìn)入文件系統(tǒng)。然而,最好依賴元數(shù)據(jù)服務(wù)和 cloud-init。
在每個(gè)計(jì)算節(jié)點(diǎn),編輯 /etc/nova/nova.conf 并且添加:
- libvirt_inject_password = false libvirt_inject_key = false libvirt_inject_partition = -2
確保熱遷移,使用下面的標(biāo)志:
- libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"
Juno
在 Juno 版本,Ceph 塊設(shè)備被移到 [libvirt] 部分。在每個(gè)計(jì)算節(jié)點(diǎn),編輯 /etc/nova/nova.conf 在 [libvirt] 部分添加:
- [libvirt]
- images_type = rbd
- images_rbd_pool = vms
- images_rbd_ceph_conf = /etc/ceph/ceph.conf
- rbd_user = cinder
- rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
禁用文件注入也是一個(gè)好的習(xí)慣。啟動(dòng)一個(gè)實(shí)例的時(shí)候,Nova 通常試圖去打開(kāi)虛擬機(jī)的根文件系統(tǒng)。然后 Nova 注入值比如密碼,ssh 密鑰等,直接進(jìn)入文件系統(tǒng)。然而,最好依賴元數(shù)據(jù)服務(wù)和 cloud-init。
在每個(gè)計(jì)算節(jié)點(diǎn),編輯 /etc/nova/nova.conf 并且添加:
- libvirt_inject_password = false libvirt_inject_key = false libvirt_inject_partition = -2
確保熱遷移,使用下面的標(biāo)志:
- libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"
重啟 OpenStack
激活 Ceph 塊設(shè)備驅(qū)動(dòng)并且載入塊設(shè)備池的名稱到配置中,必須重啟 OpenStack?;?Debian 的系統(tǒng)執(zhí)行這些命令:
- sudo glance-control api restart
- sudo service nova-compute restart
- sudo service cinder-volume restart
- sudo service cinder-backup restart
基于 Red Hat 的系統(tǒng)執(zhí)行這些命令:
- sudo service openstack-glance-api restart
- sudo service openstack-nova-compute restart
- sudo service openstack-cinder-volume restart
- sudo service openstack-cinder-backup restart
OpenStack 啟動(dòng)并運(yùn)行起來(lái)之后,就能夠創(chuàng)建一個(gè)卷并從它啟動(dòng)。
從塊設(shè)備啟動(dòng)
使用下面的 Cinder 命令創(chuàng)建一個(gè)來(lái)自鏡像的卷:
- cinder create --image-id {id of image} --display-name {name of volume} {size of volume}
注意鏡像必須是 RAW 格式??梢允褂?qemu-img 轉(zhuǎn)換鏡像格式。例如:
- qemu-img convert -f {source-format} -O {output-format} {source-filename} {output-filename}
- qemu-img convert -f qcow2 -O raw precise-cloudimg.img precise-cloudimg.raw
當(dāng) Glance 和 Cinder 都使用 Ceph 塊設(shè)備,鏡像是寫(xiě)時(shí)復(fù)制的,所以創(chuàng)建一個(gè)新的卷非常迅速。在 OpenStack Dashboard 中,可以通過(guò)下面的步驟來(lái)從卷啟動(dòng)虛擬機(jī):
- 載入一個(gè)新實(shí)例;
- 選擇鏡像關(guān)聯(lián)到寫(xiě)時(shí)復(fù)制克??;
- 選擇“從卷啟動(dòng)”;
- 選擇創(chuàng)建的卷。