1. 程式人生 > >ceph(1)--安裝和部署

ceph(1)--安裝和部署

flatten true 6.5 集群部署 required ttr 後者 add 相關

本系列文章會深入研究 Ceph 以及 Ceph 和 OpenStack 的集成:

(1)安裝和部署

(2)Ceph RBD 接口和工具

(3)Ceph 物理和邏輯結構

(4)Ceph 的基礎數據結構

(5)Ceph 與 OpenStack 集成的實現

(6)QEMU-KVM 和 Ceph RBD 的 緩存機制總結

(7)Ceph 的基本操作和常見故障排除方法

(8)關於Ceph PGs

1. 測試環境

為了深入學習 Ceph 以及 Ceph 和 OpenStack 的集成,搭建了如下的測試環境:

技術分享圖片

硬件環境:

  • System X 服務器一臺,CPU、內存和磁盤空間足夠
  • 服務器只有一個物理網卡

軟件環境:

  • 服務器安裝 RedHat 6.5 操作系統
  • OpenStack 使用 Ubuntu 鏡像庫中的 Kilo master 版本
  • 每個節點操作系統采用 Ubuntu 14.04 服務器版

2. Ceph 集群部署

從上圖可見,該環境使用三個虛機作為Ceph節點,每個節點上增加兩個虛擬磁盤 vda 和 vdb 作為 OSD 存儲磁盤,每個節點上安裝 MON,前兩個節點上安裝 MDS。三個節點使用物理網絡進行通信。

(0)準備好三個節點 ceph{1,2,3}:安裝操作系統、設置 NTP、配置 ceph1 可以通過 ssh 無密碼訪問其余節點(依次運行 ssh-keygen,ssh-copy-id ceph2,ssh-copy-id ceph3,修改 /etc/ssh/sshd_config 文件中的 PermitRootLogin yes 來使得 ssh 支持 root 用戶)

節點名稱 IP 地址 部署進程 數據盤
ceph1 192.168.1.194 1MON+1MDS+2OSD /dev/vda, /dev/vdb
ceph2 192.168.1.195 1MON+1MDS+2OSD /dev/vda, /dev/vdb
ceph3 192.168.1.218 1MON+1OSD /dev/vda, /dev/vdb

(1)在 ceph1 上安裝 ceph-deploy,接下來會使用這個工具來部署 ceph 集群

(2)在ceph 上,運行 ceph-deploy install ceph{1,2,3} 命令在各節點上安裝 ceph 軟件。安裝好後可以查看 ceph 版本:

root@ceph1:~# ceph -v
ceph version 0.80.10 (ea6c958c38df1216bf95c927f143d8b13c4a9e70)

(3)在 ceph1 上執行以下命令創建 MON 集群

ceph-deploy new ceph{1,2,3}
ceph-deploy mon create ceph{1,2,3}
ceph-deploy mon create-initial

完成後查看 MON 集群狀態:

root@ceph1:~# ceph mon_status
{"name":"ceph1","rank":0,"state":"leader","election_epoch":16,"quorum":[0,1,2],"outside_quorum":[],"extra_probe_peers":[],"sync_provider":[],"monmap":{"epoch":1,"fsid":"4387471a-ae2b-47c4-b67e-9004860d0fd0","modified":"0.000000","created":"0.000000","mons":[{"rank":0,"name":"ceph1","addr":"192.168.1.194:6789\/0"},{"rank":1,"name":"ceph2","addr":"192.168.1.195:6789\/0"},{"rank":2,"name":"ceph3","addr":"192.168.1.218:6789\/0"}]}}

(4)在各節點上準備數據盤,只需要在 fdisk -l 命令輸出中能看到數據盤即可,不需要做任何別的操作,然後在 ceph1 上執行如下命令添加 OSD

ceph-deploy --overwrite-conf osd prepare ceph1:/data/osd:/dev/vda ceph2:/data/osd:/dev/vda ceph3:/data/osd:/dev/vda
ceph-deploy --overwrite-conf osd activate ceph1:/data/osd:/dev/vda ceph2:/data/osd:/dev/vda ceph3:/data/osd:/dev/vda

ceph-deploy --overwrite-conf osd prepare ceph1:/data/osd2:/dev/vdb ceph2:/data/osd2:/dev/vdb ceph3:/data/osd2:/dev/vdb
ceph-deploy --overwrite-conf osd activate ceph1:/data/osd2:/dev/vdb ceph2:/data/osd2:/dev/vdb ceph3:/data/osd2:/dev/vdb

該命令詳細信息:

  • 格式: ceph-deploy osd prepare {node-name}:{data-disk}[:{journal-disk}]
  • 其中,node-name 表示待創建 OSD 的目標 Ceph 節點;data-disk 表示 OSD 的數據盤;journal-disk 表示日誌盤,它可以是一個單獨的磁盤,後者 OSD 數據盤上的一個分區,或者一個 SSD 磁盤上的分區。
  • 比如:ceph-deploy osd prepare osdserver1:sdb:/dev/ssd 表示在 osdserver1 上使用 sdb 磁盤做數據盤和 /dev/ssd 分區做日誌分區來創建一個 OSD 守護進程。

要使得多個OSD數據盤共享一個單獨的 SSD 磁盤,首先要使用 fdisk 對該磁盤進行分區,比如下面的命令將 /dev/sdd 分為兩個區:

技術分享圖片
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 2):
Using default value 2
First sector (1026048-2097151, default 1026048):
Using default value 1026048
Last sector, +sectors or +size{K,M,G} (1026048-2097151, default 2097151):
Using default value 2097151

Command (m for help): w
The partition table has been altered!
技術分享圖片

結果是:

技術分享圖片
Disk /dev/sdd: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6767c86e

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1            2048     1026047      512000   83  Linux
/dev/sdd2         1026048     2097151      535552   83  Linux
技術分享圖片

此時,執行下面的命令來創建並激活 OSD:

ceph-deploy --overwrite-conf osd prepare ceph1:sdb:/dev/sdd1 ceph2:sdb:/dev/sdd1 
ceph-deploy --overwrite-conf osd activate ceph1:sdb1:/dev/sdd1 ceph2:sdb1:/dev/sdd1  

註意prepare 和 activate 兩個命令參數的區別,前者是使用磁盤,後者是使用分區。

備註:看起來最上面的命令有誤,需要修改,TBD。它其實是使用了 /data/osd 目錄存放數據,而磁盤 /dev/vda 作為日誌盤。

另外,如果是第二次安裝的話,需要刪除已經存在的 /dev/sdd1 這樣的分區,然後再使用命令 ceph-deploy disk zap /dev/sdd 來將其數據全部刪除。

完成之後,會將 osd 盤掛載到 /var/lib/ceph/osd 下面的兩個目錄,目錄名為 ceph-<osd id>

/dev/sdc1 on /var/lib/ceph/osd/ceph-2 type xfs (rw,noatime,inode64)
/dev/sdb1 on /var/lib/ceph/osd/ceph-0 type xfs (rw,noatime,inode64)

而日誌盤則會在各自的 osd 目錄下創建一個 link,比如 /var/lib/ceph/osd/ceph-2/journal:

lrwxrwxrwx  1 root root          9 Jun  1 18:07 journal -> /dev/sdd2

完成後查看 OSD 狀態:

技術分享圖片
  root@ceph1:~# ceph osd tree
# id    weight  type name       up/down reweight
-1      0.1399  root default
-2      0.03998         host ceph1
3       0.01999                 osd.3   up      1
6       0.01999                 osd.6   up      1
-3      0.05997         host ceph2
4       0.01999                 osd.4   up      1
7       0.01999                 osd.7   up      1
-4      0.03998         host ceph3
5       0.01999                 osd.5   up      1
8       0.01999                 osd.8   up      1
技術分享圖片

(5)將 Admin key 復制到其余各個節點,然後安裝 MDS 集群

ceph-deploy admin ceph1 ceph2 ceph3
ceph-deploy mds  create ceph1 ceph2

完成後可以使用 “ceph mds” 命令來操作 MDS 集群,比如查看狀態:

root@ceph1:~# ceph mds stat
e13: 1/1/1 up {0=ceph1=up:active}, 1 up:standby

看起來 MDS 集群是個 active/standby 模式的集群。

至此,Ceph 集群部署完成,可以使用 ceph 命令查看集群狀態:

技術分享圖片
root@ceph1:~# ceph mds stat
e13: 1/1/1 up {0=ceph1=up:active}, 1 up:standby
root@ceph1:~# ceph -s
    cluster 4387471a-ae2b-47c4-b67e-9004860d0fd0
     health HEALTH_OK
     monmap e1: 3 mons at {ceph1=192.168.1.194:6789/0,ceph2=192.168.1.195:6789/0,ceph3=192.168.1.218:6789/0}, election epoch 16, quorum 0,1,2 ceph1,ceph2,ceph3
     mdsmap e13: 1/1/1 up {0=ceph1=up:active}, 1 up:standby
     osdmap e76: 10 osds: 7 up, 7 in
技術分享圖片

在這過程中,失敗和反復是難免的,在任何時候,可以使用如下的命令將已有的配置擦除然後從頭安裝:

ceph-deploy purge ceph{1,2,3}
ceph-deploy purgedata ceph{1,2,3}
ceph-deploy forgetkeys

3. OpenStack 集群部署

3.1 網絡準備

為方便起見,管理網絡直接連接物理網卡;租戶網絡就比較麻煩一點,因為機器上只有一個物理網卡,幸虧所有的計算節點都在同一個物理服務器上,因此可以:

1. 在物理服務器上,創建一個虛擬網卡 tap0,再創建一個 linux bridge ‘mgtbr0’

tunctl -t tap0 -u root
chmod 666 /dev/net/tun
ifconfig tap0 0.0.0.0 promisc
brctl addbr mgtbr0
brctl addif mgtbr0 tap0 

2. 這是 mgtbr0 的配置腳本:

技術分享圖片
[root@rh65 ~]# cat /etc/sysconfig/network-scripts/ifcfg-mgtbr0
DEVICE=mgtbr0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=10.0.0.100
PREFIX=24
GATEWAY=10.0.0.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
TYPE=Bridge
技術分享圖片

3. 在網絡和各計算節點上,增加一塊網卡,連接到物理服務器上的 bridge。

技術分享圖片

把所有的節點連接到管理和租戶網絡後,在物理服務器上看到的 linux bridge 是這樣子:

技術分享圖片
bridge name     bridge id               STP enabled     interfaces
br0             8000.3440b5d905ee       no              eth1                 #物理網卡
                                                        vnet0                #controller 節點 
                                                        vnet1                #network 節點
                                                        vnet2                #compute1 節點
                                                        vnet3                #compute2 節點
                                                        vnet4                #ceph1 節點 
                                                        vnet5                #ceph2 節點
                                                        vnet8                #ceph3 節點
br1             8000.000000000000       no
mgtbr0          8000.f29e2c075ca6       no              tap0                 #虛擬網卡
                                                        vnet6                #network 節點
                                                        vnet7                #compute1 節點
                                                        vnet9                #compute2 節點
技術分享圖片

3.2 OpenStack 安裝和配置

參考 Installation Guide for Ubuntu 14.04 (LTS) 完成配置,沒感覺到 Kilo 版本和 Juno 版本太大的不同,除了 keystone 使用 Apache web server 替代了 Keystone WSGI Server 以外(註意不能同時啟動 apache2 和 keystone 服務,兩者有沖突,感覺 Kilo 版本中 Identity 部分改動很大,還是存在不少問題)。

4. OpenStack 和 Ceph 整合配置

本例中,OpenStack Cinder、Glance 和 Nova 分別會將卷、鏡像和虛機鏡像保存到 Ceph 分布式塊設備(RBD)中。

4.1 Ceph 中的配置

(1)在 ceph 中創建三個 pool 分別給 Cinder,Glance 和 nova 使用

ceph osd pool create volumes 64
ceph osd pool create images 64
ceph osd pool create vms 64

(2)將 ceph 的配置文件傳到 ceph client 節點 (glance-api, cinder-volume, nova-compute andcinder-backup)上:

ssh controller sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
ssh compute1 sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
ssh compute2 sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf

(3)在各節點上安裝ceph 客戶端

在 glance-api 節點,安裝 librbd
sudo apt-get install python-rbd

在 nova-compute 和 cinder-volume 節點安裝 ceph-common:
sudo apt-get install ceph-common

(4)配置 cinder 和 glance 用戶訪問 ceph 的權限

# cinder 用戶會被 cinder 和 nova 使用,需要訪問三個pool
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

# glance 用戶只會被 Glance 使用,只需要訪問 images 這個 pool ceph auth get-or-create client.glance mon allow r osd allow class-read object_prefix rbd_children, allow rwx pool=images

(5)將 client.cinder 和 client.glance 的 keystring 文件拷貝到各節點並設置訪問權限

技術分享圖片
ceph auth get-or-create client.glance | ssh controller sudo tee /etc/ceph/ceph.client.glance.keyring
ssh controller  sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring

ceph auth get-or-create client.cinder | ssh controller  sudo tee /etc/ceph/ceph.client.cinder.keyring
ssh controller  sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring

ceph auth get-or-create client.cinder | ssh compute1 sudo tee /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder | ssh compute2 sudo tee /etc/ceph/ceph.client.cinder.keyring
技術分享圖片

(6)在 compute1 和 compute2 節點上做 libvirt 配置

技術分享圖片
ceph auth get-key client.cinder | ssh compute1 tee client.cinder.key
cat > secret.xml <<EOF
<secret ephemeral=‘no‘ private=‘no‘>
  <uuid>e21a123a-31f8-425a-86db-7204c33a6161</uuid>
  <usage type=‘ceph‘>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF
sudo virsh secret-define --file secret.xml
sudo virsh secret-set-value --secret e21a123a-31f8-425a-86db-7204c33a6161 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
技術分享圖片

4.2 OpenStack 中的配置

4.2.1 Glance 中的配置

技術分享圖片
在 /etc/glance/glance-api.conf 文件中做如下修改:

[DEFAULT]
...
show_image_direct_url = True
...
[glance_store]
stores=glance.store.rbd.Store (設置為 rbd 也可以?)
default_store = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8
技術分享圖片

註意:如果在創建 image 時候出現 AttributeError: ‘NoneType‘ object has no attribute ‘Rados‘ 錯誤,則需要安裝 python-rados

4.2.2 配置 Cinder volume

技術分享圖片
修改 /etc/cinder/cinder.conf:

[DEFAULT]
...
#volume_group = cinder-volumes
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
rbd_user = cinder
rbd_secret_uuid = e21a123a-31f8-425a-86db-7204c33a6161
...
技術分享圖片

註意:

(1)cinder-volume 節點上的 ceph 配置文件是必須存在的,因為 cinder-volume 需要使用它來建立和 Ceph 集群的連接,不存在的話則會報錯誤。

cinder/volume/drivers/rbd.py 文件:

client = self.rados.Rados(rados_id=self.configuration.rbd_user, conffile=self.configuration.rbd_ceph_conf)

缺失 ceph 配置文件時 cinder-volume 報錯:

2016-01-02 18:23:54.127 25433 INFO cinder.volume.manager [req-d921feed-db0b-4643-b01b-13dde3da6285 - - - - -] Starting volume driver RBDDriver (1.1.0)
2016-01-02 18:23:54.162 25433 ERROR cinder.volume.manager [req-d921feed-db0b-4643-b01b-13dde3da6285 - - - - -] Error encountered during initialization of driver: RBDDriver
2016-01-02 18:23:54.163 25433 ERROR cinder.volume.manager [req-d921feed-db0b-4643-b01b-13dde3da6285 - - - - -] error calling conf_read_file: errno EINVAL

對 cinder-volume 來說,它所需要的 ceph.conf 中的信息主要是 MON 服務器的地址,以及cinder 所使用的用戶的驗證方式,因此需要將 keystring 文件 ceph.client.cinder.keyring 放在同一個目錄下面。

mon_initial_members = ceph1, ceph2, ceph3
mon_host = 9.115.251.194,9.115.251.195,9.115.251.218
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
filestore_xattr_use_omap = true

(2)可以支持 multi-backend 配置,在每個 backend 中使用不同的 Ceph pool,甚至使用不同的 rbd_ceph_conf 來支持多個 Ceph 集群。

做完以上配置之後,你就可以通過cinder 在 Ceph 中創建 volume 了。

4.3.3 配置 Nova Compute

其實 nova compute 使用 RBD 有兩種功能:

  • 一種是將 cinder volume 掛接給虛擬機
  • 另一種是從 cinder volume 上啟動虛擬機,此時 nova 需要創建一個 RBD image,把 glance image 的內容導入,再交給 libvirt
4.3.3.1 將 cinder volume 掛接給 nova instance

修改 nova compute 節點上的 nova.conf 文件:

[libvirt]
rbd_user = cinder
rbd_secret_uuid = e21a123a-31f8-425a-86db-7204c33a6161

如果只是將 ceph volume 掛接到 Nova 虛機的話,nova-compute 是不需要從 ceph 配置文件中讀取 MON 服務器的信息的,而是調用 cinder api 去獲取。因此,在計算節點上缺失 ceph 配置文件其實是不影響將 ceph 卷掛接到 nova 虛機的。 註意這是 Havana 以後的行為,對於之前的版本,nova-compute 從 ceph 配置文件中讀取 MON 信息,因此需要 ceph 配置文件。詳見 ticket:Nova failed to mount a RBD volume without extra ceph.conf。做了這個改動以後,另一個好處是,向 nova 支持多個 ceph 集群提供了可能,因為使用 ceph 配置文件的話只能使用一個文件,而 cinder 中可以 使用 multi-backend 技術來支持多個 ceph 集群。

所以 nova.conf 中主要是配置訪問 ceph 的 user 和 secret id,以便從本機上保存的 secrets 中獲取密鑰。配置文件中只保存有 rbd secret id,因為本機上需要有該 id 對應的 secret的完整內容。

關於為什麽只需要這兩個參數,還可以閱讀 LibvirtNetVolumeDriver 類的代碼,該類實現了 libirt 訪問 Ceph 等網絡存儲的功能。

在執行 nova attach-volume 之後(如下圖步驟5),nova-compute 會修改 nova instance 的 libvirt xml 文件。示例如下:

技術分享圖片
<disk type=‘network‘ device=‘disk‘>
      <driver name=‘qemu‘ type=‘raw‘ cache=‘writeback‘/>
      <auth username=‘cinder‘>
        <secret type=‘ceph‘ uuid=‘e21a123a-31f8-425a-86db-7204c33a6161‘/>
      </auth>
      <source protocol=‘rbd‘ name=‘volumes/volume-b4e9a905-d59e-46e4-aa6d-e57c90000013‘>
        <host name=‘9.115.251.194‘ port=‘6789‘/>
        <host name=‘9.115.251.195‘ port=‘6789‘/>
        <host name=‘9.115.251.218‘ port=‘6789‘/>
      </source>
      <backingStore/>
      <target dev=‘vdb‘ bus=‘virtio‘/>
      <serial>b4e9a905-d59e-46e4-aa6d-e57c90000013</serial>
      <alias name=‘virtio-disk1‘/>
      <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x06‘ function=‘0x0‘/>
    </disk>
技術分享圖片

因此,如果只是需要支持將 Ceph 卷掛接到 nova 虛機的話,可以在計算節點上的 ceph 配置文件中,可以只保留 client 部分的配置信息,包括 RBD Cache 的配置以及日誌配置等,這樣就可以避免和具體哪一個 Ceph 集群的硬綁定。而這個配置其實是給 librbd 準備的,便於對它進行調試。下面是一個配置示例:

技術分享圖片
[client]
rbd cache = true
#rbd cache = false
#rbd cache writethrough until flush = true
#admin socket = /var/run/ceph/$cluster-$type.$id.$pid.$cctid.asok
log file = /var/log/ceph/qemu-guest.$pid.log
#log file = /var/lib/libvirt/qemu/qemu-guest.$pid.log
admin socket=/var/log/ceph/rbd-$pid.asok
debug rbd = 20
debug rbd = 20,
debug objectcacher=20
debug objecter=20
debug ms = 1 
技術分享圖片
掛接 Ceph RBD 卷給虛機的大致交互流程如下:

技術分享圖片

詳細過程可參考文章 http://int32bit.me/2017/09/08/OpenStack%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%8C%82%E8%BD%BD%E6%95%B0%E6%8D%AE%E5%8D%B7%E8%BF%87%E7%A8%8B%E5%88%86%E6%9E%90/

作為參考,下圖為掛接 iSCSI volume 給虛機的大致流程,可以看出來掛接 Ceph volume 的流程簡化了很多,因為不需要做 iSCSI 配置:

技術分享圖片

說明:

  • 與 Ceph RBD volume 流程相比,這裏面還需要 cinder volume driver 在 iSCSI Target 側做 initiator 配置,還需要 libvirtISCSIVolumeDriver 在 host 側進行 iSCSI session 配置,這樣才能在 host 和 volume 之間建立起 iSCSI session,供 Qemu block iSCSI module 使用。
  • 如果是 TGT iSCSI 的話,上圖第4步返回的iSCSI信息的示例
技術分享圖片
{‘driver_volume_type’: ‘iscsi’,  ‘data’: {‘auth_password’: ‘YZ2Hceyh7VySh5HY’,
                ‘target_discovered’: False,
                ‘encrypted’: False,
                ‘qos_specs’: None,
                ‘target_iqn’: ‘iqn.2010-10.org.openstack:volume-8b1ec3fe-8c5
                ‘target_portal’: ‘11.0.0.8:3260′,
                ‘volume_id’: ‘8b1ec3fe-8c57-45ca-a1cf-a481bfc8fce2′,
                ‘target_lun’: 1,
                ‘access_mode’: ‘rw’,
                ‘auth_username’: ‘nE9PY8juynmmZ95F7Xb7′,
                ‘auth_method’: ‘CHAP’}}
技術分享圖片
  • Dom xml 中 iSCSI 磁盤的信息示例
  • 技術分享圖片
    <disk type=block device=disk>
          <driver name=qemu type=raw cache=none io=native/>
          <source dev=/dev/disk/by-path/ip-10.0.0.2:3260-iscsi-iqn.2010-10.org.openstack:volume-2ed1b04c-b34f-437d-9aa3-3feeb683d063-lun-0/>
          <target dev=vdb bus=virtio/>
          <serial>2ed1b04c-b34f-437d-9aa3-3feeb683d063</serial>
          <address type=pci domain=0x0000 bus=0x00 slot=0x06 function=0x0/>
    </disk>
    技術分享圖片

4.3.3.2 nova 從 cinder volume 上啟動
在每個計算節點上的 /etc/nova/nova.conf 文件中做如下修改。與 4.3.3.1 中的配置相比,增加了 images 相關配置,這是因為 nova-compute 需要自己管理 rbd image 了(實現是通過 RBD imagebackend,它會調用 rbd 命令來創建 volume 並導入 image,並在需要的時候做 resize)。
技術分享圖片
[libvirt]
images_type = rbd #只有在 boot disk 放在 ceph 中才需要配置這個,否則,設置為 qcow2
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = e21a123a-31f8-425a-86db-7204c33a6161

disk_cachemodes="network=writeback"
hw_disk_discard = unmap
inject_password = false
inject_key = false
inject_partition = -2
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
技術分享圖片

當用戶選擇將 boot disk 放在 Ceph 中的話,需要在 nova.conf 中配置 images_rbd_ceph_conf ,這是因為就像 cinder-volume 一樣,nova-compute 需要使用 ceph.conf 和其它參數創建和 Ceph 的連接,然後使用 ”rbd import --pool “命令來創建 image。這種情況下,如果沒有 ceph.conf 文件的話,啟動 nova-compute 服務時就會報錯:

2016-01-02 22:27:30.920 25407 ERROR nova.openstack.common.threadgroup [req-9a61379c-52e9-48b7-9f7c-91c928fdaf2b - - - - -] error calling conf_read_file: errno EINVAL

因此,此時的 nova-compute 和 glance 以及 cinder-volume 的角色沒什麽不同,它們也需要使用相同的 ceph 配置文件。

至此,環境安裝和配置完成,通過 cinder,glance 和 nova 命令創建的卷、鏡像和虛機的鏡像都會被保存在 Ceph 的 RBD 中。接下來的文章會深入分析其中的原理和實現。

參考文檔:

  • http://docs.ceph.com/docs/master/rbd/rbd-openstack/
  • nova與cinder服務交互
  • https://libvirt.org/storage.html#StorageBackendISCSI

  • Ceph 官方的一個測試環境:(來源:http://ceph.com/category/performance-2/)

技術分享圖片

ceph(1)--安裝和部署