1. Openstack 與 Ceph
1.1. Ceph 簡介
Ceph 是當前非常流行的開源分布式存儲系統,具有高擴展性、高性能、高可靠性等優點,同時提供塊存儲服務(RBD)、對象存儲服務(RGW)以及文件系統存儲服務(CEPHFS)。目前也是 OpenStack 的主流后端存儲,和 OpenStack 親如兄弟,為 OpenStack 提供統一共享存儲服務。使用 Ceph 作為 OpenStack 后端存儲,具有如下優點:
- 所有的計算節點共享存儲,遷移時不需要拷貝根磁盤,即使計算節點掛了,也能立即在另一個計算節點啟動虛擬機(evacuate)。
- 利用COW(Copy On Write)特性,創建虛擬機時,只需要基於鏡像 clone 即可,不需要下載整個鏡像,而 clone 操作基本是0開銷,從而實現了秒級創建虛擬機。
- Ceph RBD 支持 thin provisioning,即按需分配空間,有點類似Linux文件系統的 sparse 稀疏文件。創建一個20GB的虛擬硬盤時,最開始並不占用物理存儲空間,只有當寫入數據時,才按需分配存儲空間。
Ceph 的更多知識可以參考官方文檔,這里我們只關注 RBD,RBD 管理的核心對象為塊設備(block device),通常我們稱為 volume,不過 Ceph 中習慣稱之為 image(注意和 OpenStack image 的區別)。
1.2. Glance 介紹
Glance管理的核心實體是image,它是OpenStack的核心組件之一,為OpenStack提供鏡像服務(Image as Service),主要負責OpenStack鏡像以及鏡像元數據的生命周期管理、檢索、下載等功能。Glance支持將鏡像保存到多種存儲系統中,后端存儲系統稱為store,訪問鏡像的地址稱為location,location可以是一個http地址,也可以是一個rbd協議地址。只要實現store的driver就可以作為Glance的存儲后端,其中driver的主要接口如下:
- get: 獲取鏡像的location。
- get_size: 獲取鏡像的大小。
- get_schemes: 獲取訪問鏡像的URL前綴(協議部分),比如rbd、swift+https、http等。
- add: 上傳鏡像到后端存儲中。
- delete: 刪除鏡像。
- set_acls: 設置后端存儲的讀寫訪問權限。
為了便於維護,glance store目前已經作為獨立的庫從Glance代碼中分離出來,由項目glance_store維護。目前社區支持的store列表如下:
- filesystem: 保存到本地文件系統,默認保存/var/lib/glance/images到目錄下。
- cinder: 保存到Cinder中。
- rbd:保存到Ceph中。
- sheepdog:保存到sheepdog中。
- swift: 保存到Swift對象存儲中。
- vmware datastore: 保存到Vmware datastore中。
- http: 以上的所有store都會保存鏡像數據,唯獨http store比較特殊,它不保存鏡像的任何數據,因此沒有實現add方法,它僅僅保存鏡像的URL地址,啟動虛擬機時由計算節點從指定的http地址中下載鏡像。
本文主要關注rbd store,它的源碼在這里,該store的driver代碼主要由國內Fei Long Wang負責維護,其它store的實現細節可以參考源碼 glance store drivers.
1.3. Nova 介紹
Nova管理的核心實體為server,為OpenStack提供計算服務,它是OpenStack最核心的組件。注意 Nova 中的server不只是指虛擬機,它可以是任何計算資源的抽象,除了虛擬機以外,也有可能是baremetal裸機、容器等。
不過我們在這里假定:
- server 為虛擬機。
- image type 為 rbd。
- compute driver 為 libvirt。
啟動虛擬機之前首先需要准備根磁盤(root disk),Nova稱為image,和Glance一樣,Nova的image也支持存儲到本地磁盤、Ceph以及Cinder(boot from volume)中。需要注意的是,image保存到哪里是通過image type決定的,存儲到本地磁盤可以是raw、qcow2、ploop等,如果image type為rbd,則image存儲到Ceph中。不同的image type由不同的image backend負責,其中rbd的backend為nova/virt/libvirt/imageackend
中的Rbd類模塊實現。
1.4. Cinder 介紹
Cinder是OpenStack的塊存儲服務,類似AWS的EBS,管理的實體為volume。Cinder並沒有實現volume provide功能,而是負責管理各種存儲系統的volume,比如Ceph、fujitsu、netapp等,支持volume的創建、快照、備份等功能,對接的存儲系統我們稱為backend。只要實現了cinder/volume/driver.py
中VolumeDriver類定義的接口,Cinder就可以對接該存儲系統。
Cinder不僅支持本地volume的管理,還能把本地volume備份到遠端存儲系統中,比如備份到另一個Ceph集群或者Swift對象存儲系統中,本文將只考慮從源Ceph集群備份到遠端Ceph集群中的情況。
1.5. 總結
Ceph 集群可以作為 OpenStack 的后端存儲,分別向 Glance、Nova、Cinder 組件提供塊設備服務。——《Ceph 設計原理與實現》
根據官方文檔,OpenStack 里有三個地方可以和 Ceph 塊設備結合:
-
Images:OpenStack 的 Glance 管理着 VM 的 image 。Image 相對恆定,OpenStack 把它們當作二進制文件、並以此格式下載。
-
Volumes:OpenStack 用 Cinder 服務管理 Volumes 。Volume 是塊設備,OpenStack 用它們引導虛擬機、或掛載到運行中的虛擬機上。
-
Guest Disks: Guest disks 是裝有客戶操作系統的磁盤。默認情況下,啟動一台虛擬機時,它的系統盤表現為 hypervisor 文件系統的一個文件(通常位於 /var/lib/nova/instances/${uuid}/)。
2. 准備工作
- OpenStack 處於正常工作狀態
- Ceph 集群正常工作
- OpenStack 各節點與 Ceph 集群各節點網絡互通
OpenStack 部署情況
IP | 節點名稱 | 組件 | 對應存儲池 | 說明 |
---|---|---|---|---|
192.168.0.121 | controller | Glacne | images | 控制節點 |
192.168.0.122 | compute | Nova | vms | 計算節點 |
192.168.0.123 | blockstorage | Cinder | volumes | 存儲節點 |
Ceph 部署情況
IP | 節點名稱 |
---|---|
192.168.0.131 | node1 |
192.168.0.132 | node2 |
192.168.0.133 | node3 |
3. 安裝 Ceph 客戶端
在 OpenStack 的所有節點配置好 Ceph 安裝包 yum 源,在 /etc/yum.repos.d/ 目錄下編輯 ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
然后安裝 Ceph 客戶端
yum install -y ceph
將任意一個 Ceph 集群節點的 Ceph 配置文件和 ceph.client.admin.keyring 拷貝到所有 OpenStack 節點
scp {ceph-node-ip}:/etc/ceph/ceph.conf {openstack-node-ip}:/etc/ceph
scp {ceph-node-ip}:/etc/ceph/ceph.client.admin.keyring {openstack-node-ip}:/etc/ceph
4. 創建存儲池
創建 Glance、Nova、Cinder 對應存儲池:
ceph osd pool create images {pg_num}
ceph osd pool create vms {pg_num}
ceph osd pool create volumes {pg_num}
5. 配置存儲池鑒權
在控制節點創建 Ceph 客戶端及存儲池的鑒權,生成相應的 key 文件:
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' -o /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' -o /etc/ceph/ceph.client.glance.keyring
將生成的 key 文件拷貝到其他所有 OpenStack節點:
scp *.keyring 192.168.0.122:/etc/ceph/
scp *.keyring 192.168.0.123:/etc/ceph/
在 OpenStack 控制節點修改密鑰文件擁有者為對應的組件用戶:
chown glance:glance /etc/ceph/ceph.client.glance.keyring
chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
在運行 nova-compute 的節點上,將密鑰添加到 libvcirt,刪除臨時的密鑰文件:
ceph auth get-key client.cinder | tee client.cinder.key
uuidgen
ae3d9d0a-df88-4168-b292-c07cdc2d8f02
// 注:uuidgen 只需要運行一次即可,所有涉及 uuid 的地方都共用這個生成的 uuid
cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
<uuid>ae3d9d0a-df88-4168-b292-c07cdc2d8f02</uuid>
<usage type='ceph'>
<name>client.cinder secret</name>
</usage>
</secret>
EOF
// 注:以上 cat 段落是整個拷貝一次執行
virsh secret-define --file secret.xml
生成 secret ae3d9d0a-df88-4168-b292-c07cdc2d8f02
virsh secret-set-value --secret ae3d9d0a-df88-4168-b292-c07cdc2d8f02 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
// 注:出現刪除提示,輸入y,回車
6. 修改配置 OpenStack 配置文件
6.1. 配置 Glance
Glance 有多種后端用於存儲鏡像,如果默認使用 Ceph 塊設備,則需要在 Glance 組件所在節點進行配置:
openstack-config --set /etc/glance/glance-api.conf DEFAULT "show_image_direct_url" "True"
openstack-config --set /etc/glance/glance-api.conf glance_store "default_store" "rbd"
openstack-config --set /etc/glance/glance-api.conf glance_store "rbd_store_user" "glance"
openstack-config --set /etc/glance/glance-api.conf glance_store "rbd_store_pool" "images"
openstack-config --set /etc/glance/glance-api.conf glance_store "stores" "glance.store.filesystem.Store, glance.store.http.Store, glance.store.rbd.Store"
openstack-config --set /etc/glance/glance-api.conf paste_deploy "flavor" "keystone"
6.2. 配置 Cinder
使 Cinder 組件訪問 Ceph 塊設備,需要配置 Cinder 對應的塊設備驅動及其他選項,在 Cinder 組件所在節點進行配置:
openstack-config --set /etc/cinder/cinder.conf DEFAULT "enabled_backends" "ceph"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_driver" "cinder.volume.drivers.rbd.RBDDriver"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_backend_name" "ceph"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_pool" "volumes"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_ceph_conf" "/etc/ceph/ceph.conf"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_flatten_volume_from_snapshot" "false"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_max_clone_depth" "5"
openstack-config --set /etc/cinder/cinder.conf ceph "rados_connect_timeout" "-1"
openstack-config --set /etc/cinder/cinder.conf ceph "glance_api_version" "2"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_user" "cinder"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_secret_uuid" "ae3d9d0a-df88-4168-b292-c07cdc2d8f02"
6.3. 配置 Nova
Nova 組件訪問 Ceph 的塊設備,需要在運行 Nova 的各節點上進行配置:
openstack-config --set /etc/nova/nova.conf libvirt "images_type" "rbd"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_pool" "vms"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_ceph_conf" "/etc/ceph/ceph.conf"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_user" "cinder"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_secret_uuid" "ae3d9d0a-df88-4168-b292-c07cdc2d8f02"
openstack-config --set /etc/nova/nova.conf libvirt "inject_password" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_key" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_partition" "-2"
openstack-config --set /etc/nova/nova.conf libvirt "live_migration_flag" "VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"
7. 重啟 OpenStack 各服務
在控制節點,重啟各服務:
sudo service openstack-glance-api restart
sudo service openstack-nova-api restart
sudo service openstack-cinder-api restart
sudo service openstack-cinder-scheduler restart
在計算節點,重啟 Nova 服務:
sudo service openstack-nova-compute restart
在存儲節點,重啟 Cinder 服務:
sudo service openstack-cinder-volume restart
8. 驗證對接有效性
8.1. Ceph 客戶端驗證
在各 OpenStack 節點上運行命令:
ceph status
ceph -s
如果能順利執行,則證明客戶端安裝成功。
8.2. Glance 組件對接驗證
在控制節點上,先獲取key:
source /root/keystone_admin
然后通過 Glance 上傳一個鏡像:
glance image-create --name cirros --disk-format raw --container-format ovf --f {your-image-path}
通過查詢 Glance存儲池信息,查看鏡像是否已經上傳:
rbd ls images
如果查看到鏡像信息,則證明 Glance 組件對接成功。
8.3. Cinder 組件對接驗證
例如,在控制節點通過 Cinder 創建一個空白雲盤:
cinder create --display-name {volume-name} {volume-size}
這里使用上傳的鏡像通過 Cinder 創建一個鏡像雲盤:
cinder create --display-name {volume-name} --image-id ${image-id} {volume-size}
通過查詢 Cinder 存儲池信息,查看空白雲盤及鏡像雲盤是否已經承載在 Ceph:
rbd ls volumes
如果查詢到雲盤信息,則證明 Cinder 組件對接成功。
8.4. Nova 組件對接驗證
首先通過 Dashboard 創建一個 VM,從剛才創建的鏡像雲盤(volume)啟動(前提:有可用網絡):
nova boot --image {image-id} --flavor {flavor-id} --nic net-id={net-id} {instance-name}
然后查詢 VM 是否創建成功:
nova list | grep {instacne-name}
如果創建的 VM 為 Active 狀態,則證明 Nova 組件對接成功。
參考鏈接: