譯:塊設備和 OpenStack

libvirt 配置了 librbd 的 QEMU 接口,經過它能夠在 OpenStack 中使用 Ceph 塊設備鏡像。Ceph 塊設備鏡像被看成集羣對象,這意味着它比獨立的服務器有更好的性能。 html

在 OpenStack 中使用 Ceph 塊設備,必須首先安裝 QEMU,libvirt 和 OpenStack。建議 OpenStack 安裝的時候使用獨立的物理節點。OpenStack 節點建議最小 8G RAM和四核處理器。下圖描述了 OpenStack 和 Ceph 技術層次。 node

Important:要在 OpenStack 中使用 Ceph,必須首先運行 Ceph 存儲集羣 python

OpenStack 與 Ceph 的三個結合點: git

  • 鏡像:OpenStack Glance 管理虛擬機鏡像。鏡像是不變的。OpenStack 把鏡像看成二進制對象並以此格式下載。
  • :卷是塊設備。OpenStack 使用捲來啓動虛擬機,或者綁定捲到運行中的虛擬機。OpenStack 使用 Cinder 服務管理卷。
  • 客戶磁盤:客戶磁盤是客戶操做系統磁盤。默認狀況下,當啓動一臺虛擬機時,它的系統盤以文件的形式出如今 hypervisor 系統上(一般在/var/lib/nova/instances/<uuid>)。在 OpenStack Havana 之前的版本,在 Ceph 中啓動虛擬機的惟一方式是使用 Cinder 的 boot-from-volume 功能,如今可以在 Ceph 中直接啓動虛擬機而不用依賴於 Cinder,這是很是有利的由於它可以讓你很容易的進行虛擬機的熱遷移。除此以外,若是 hypervisor 掛掉還可以方便地觸發 nova evacute 而後無縫得在其餘的地方繼續運行虛擬機。

可使用 OpenStack Glance 來存儲鏡像在 Ceph 塊設備中,也可使用 Cinder 經過鏡像的寫時複製來啓動虛擬機。 github

下面詳細介紹 Glance,Cinder 和 Nova 的配置過程,儘管它們沒有必要一塊兒使用。當虛擬機運行使用本地磁盤運行的時候,能夠把鏡像存儲在 Ceph 塊設備中,或者正相反。 後端

Important:Ceph 不支持 QCOW2 格式的虛擬機磁盤。因此,若是想要在 Ceph 中啓動虛擬機(後端文件或者從卷啓動),Glance 鏡像必須是 RAW格式 api

Tip:本文檔描述的 Ceph 塊設備是基於 OpenStack Havana。更早的版本請看Block Devices and OpenStack (Dumpling)
緩存

建立一個池

默認狀況下,Ceph 塊設備使用 rbd 池。可使用任何可以使用的池。建議爲 Cinder 和 Glance 單首創建池。確保 Ceph 集羣正常運行,而後建立池。 服務器

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 來了解指定池的 pg 數量的詳細信息和應該爲你的池指定多少 pg。 ssh

配置 OpenStack Ceph 客戶端

運行 glance-apicinder-volumenova-compute 和 cinder-backup 的節點是 Ceph 客戶端。每個節點都須要 ceph.conf 文件:

ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf

 

安裝 Ceph 客戶端包

在 glance-api 節點,須要爲 librbd 綁定 Python

sudo apt-get install python-ceph
sudo yum install python-ceph

在 nova-computecinder-backup 和 cinder-volume 節點要用到 Python 和 Ceph 客戶端命令行工具:

sudo apt-get install ceph-common
sudo yum install ceph

設置 Ceph 客戶端認證

若是使用了 cephx authentication,建立一個新用戶爲 Nova/Cinder 和 Glance。執行下面的命令:

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.cinderclient.glance 和 client.cinder-backup 添加密鑰來訪問節點並改變全部者:

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

行 nova-compute 的節點 nova-compute 進程須要密鑰文件。它們也存儲 client.cinder 用戶的密鑰在 libvirt。libvirt 進程在 Cinder 中綁定塊設備時須要用到它來訪問集羣。

建立一個臨時的密鑰文件副本在運行 nova-compute 的節點:

ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key

而後在計算節點,爲 libvirt 添加密鑰文件而且移除臨時的副本密鑰:

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:沒有必要保存全部計算節點的 UUID。可是爲了平臺的一致性,最好保存相同的 UUID。

配置 OpenStack 使用 Ceph

配置 Glance

Glance 可以使用多種後端來存儲鏡像。默認使用 Ceph 塊設備,配置 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

更多關於 Glance 的配置信息請看:http://docs.openstack.org/trunk/config-reference/content/section_glance-api.conf.html

Important:Glance 尚未徹底移到 'store'。因此仍然須要在 DEFAULT 部分配置 store。

全部 OpenStack 版本

若是要啓用鏡像的寫時複製功能,添加下面的 [DEFAULT] 部分:

show_image_direct_url = True

注意這會在 Glance API 中暴露後端存儲位置,因此 endpoint 不該該被公開訪問

禁用 Glance 緩存管理來避免鏡像被緩存到 /var/lib/glance/image-cache/,確保配置文件中有 flavor = keystone+cachemanagement

[paste_deploy] flavor = keystone

配置 Cinder

OpenStack 須要驅動來與 Ceph 塊設備交互。必須爲塊設備指定池,在 OpenStack 節點編輯 /etc/cinder/cinder.conf 並添加

volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
glance_api_version = 2

配置 Cinder Backup

OpenStack Cinder Backup 須要一個守護進程,不要忘記安裝它。在 Cinder Backup 節點,編輯 /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 塊設備

爲了綁定 Cinder 設備(塊設備或者啓動卷),必須告訴 Nova(和 libvirt)用戶和 UUID。libvirt 在與 Ceph 集羣進行鏈接和認證的時候提供這個用戶。

rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337

這兩個配置項一樣用於 Nova 的後端。

配置 Nova

爲了直接從 Ceph 啓動全部虛擬機,你必須配置 Nova 的臨時後端。

建議在 Ceph 配置文件中啓用 RBD 緩存(從 Giant 版本默認啓用)。還有,啓用 admin socket 對於故障排除的時候頗有幫助。每臺使用 Ceph 塊設備的虛擬機都有一個 socket 有助於性能分析和錯誤判斷。

socket 能夠經過這種方式訪問:

ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help

如今,在每一個計算節點編輯 Ceph 配置文件:

[client]
    rbd cache = true
    rbd cache writethrough until flush = true
    admin socket = /var/run/ceph/$cluster-$type.$id.$pid.$cctid.asok

Tip:若是虛擬機正在運行,能夠直接重啓來得到 socket。

HAVANA 和 ICEHOUSE

HAVANA 和 ICEHOUSE 須要補丁來實現寫時複製而且修復 rbd 臨時磁盤的鏡像大小和熱遷移 Bug。這些可用的分支基於主幹 Nova stable/havana 和 stable/icehouse。使用它們不是強制性的可是是很是建議的,爲了利用寫時複製的功能。

在每一個計算節點,編輯 /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 

禁用文件注入也是一個好的習慣。啓動一個實例的時候,Nova 一般試圖去打開虛擬機的根文件系統。而後 Nova 注入值好比密碼,ssh 密鑰等,直接進入文件系統。然而,最好依賴元數據服務和 cloud-init

在每一個計算節點,編輯 /etc/nova/nova.conf 而且添加:

libvirt_inject_password = false libvirt_inject_key = false libvirt_inject_partition = -2

確保熱遷移,使用下面的標誌:

libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"

Juno

在 Juno 版本,Ceph 塊設備被移到 [libvirt] 部分。在每一個計算節點,編輯 /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

禁用文件注入也是一個好的習慣。啓動一個實例的時候,Nova 一般試圖去打開虛擬機的根文件系統。而後 Nova 注入值好比密碼,ssh 密鑰等,直接進入文件系統。然而,最好依賴元數據服務和 cloud-init。

在每一個計算節點,編輯 /etc/nova/nova.conf 而且添加:

libvirt_inject_password = false libvirt_inject_key = false libvirt_inject_partition = -2

確保熱遷移,使用下面的標誌:

libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"

重啓 OpenStack

激活 Ceph 塊設備驅動而且載入塊設備池的名稱到配置中,必須重啓 OpenStack。基於 Debian 的系統執行這些命令:

sudo glance-control api restart
sudo service nova-compute restart
sudo service cinder-volume restart
sudo service cinder-backup restart

基於 Red Hat 的系統執行這些命令:

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 啓動並運行起來以後,就可以建立一個卷並從它啓動。

從塊設備啓動

使用下面的 Cinder 命令建立一個來自鏡像的卷:

cinder create --image-id {id of image} --display-name {name of volume} {size of volume}

注意鏡像必須是 RAW 格式。可使用 qemu-img 轉換鏡像格式。例如:

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


當 Glance 和 Cinder 都使用 Ceph 塊設備,鏡像是寫時複製的,因此建立一個新的卷很是迅速。在 OpenStack Dashboard 中,能夠經過下面的步驟來從卷啓動虛擬機:

  1. 載入一個新實例;
  2. 選擇鏡像關聯到寫時複製克隆;
  3. 選擇「從卷啓動」;
  4. 選擇建立的卷。
相關文章
相關標籤/搜索