分布式存储ceph创建RBD接口
—、RBD介绍
RBD全称为RADOS Block Device,是一种构建在RADOS集群之上为客户端提供块设备接口的存储服务 中间层。这类的客户端包括虚拟机KVM和云计算操作系统OpenStack、CloudStack等。RBD为条带化,支持存储空间的动态扩容等特性,并可以借助RADOS实现快照,副本和一致性。客户端访问RBD 有两种方式。
•通过内核模块rbd.k。将镜像映射为本地块设备,通常设置文件一般为:/dev/rbd*
•另一种是通过librbd接口,KVM虚拟机就是使用这种接口。
二、RBD基本操作
1、创建RBD接口需要创建专门用于RBD的存储池
#1、先创建一个名为kvm的普通存储池,并指定pg与pgp都为32
ceph osd pool create kvm 32 32
#2、再将存储池转换为RBD模式
ceph osd pool application enable kvm rbd
#3、如果自定义过crush rule,请记得为pool指定crush rule,关于crush rule详见《08
...ceph运维操作》
ceph osd pool set kvm crush_rule egon_rule
2、 初始化存储池
rbd pool init -p kvm
3、 创建镜像
#语法:
rbd create 一一size 5G 一一pool <pool name〉 <image name〉
#例如
rbd create 一一size 1G 一一pool kvm imgl
4、 查看镜像
#查看存储池下存在哪些镜像
rbd ls 一一pool kvm -l
#查看某一镜像的详细信息
rbd 一一image imgl 一一pool kvm info # 可简写为:rbd info kvm/imgl
显了内容注解:
size :镜像的大小与被分割成的条带数。
order 22:条带的编号,有效范围是12到25,对应4K到32M,而22代表2的22次方,这样刚好是4M。
id:镜像的ID标识。
block_name_prefix :名称前缀。
format :使用的镜像格式,默认为2。
features :当前镜像的功能特性。
op_features :可选的功能特性。
5、 修改镜像大小
rbd resize ——pool kvm ——image imgl ——size 5G
使用resize就可以调整镜像的大小,一般建议只增不减,如果是减少的话需要加一个选项-allow-
shrink,如。
rbd resize 一一pool kvm 一一image imgl 一一size 2G 一一allow-shrink
6、删除镜像
使用remov e或者rm都可以,通常不推荐直接删除镜像,下述方法删除镜像后,镜像将不可恢复。
rbd remove kvm/img1
推荐使用trash命令,这个命令删除是将镜像移动一回收站,如果想找回还可以恢复,如。
rbd trash move <pool name>/<image name>
rbd trash list 一一pool <pool name>
rbd trash restore <pool name>/<id>
#例
rbd trash move kvm/img1
rbd trash list 一一pool kvm
rbd trash restore kvm/5b6376b8b4567
rbd ls --pool kvm -l #发现还原回来了
三、快照
对rbd镜像进行快照,可以保留镜像的状态历史,另外还可以利用快照的分层技术,通过将快照克隆为 新的镜像使用。
3.1创建快照
rbd snap create --pool <pool name> --image <image name> --snap <snap name>
•-pool :指定哪个存储池。
•-image:指定哪个镜像。
•-snap :指定快照的名称。
还可以使用下面的命令创建快照,更方便,简单。
rbd snap create <pool name>/<image name>@<snap name>
例
rbd snap create kvm/img1@img1_snap1
3.2查看快照
列出指定镜像所有快照。
rbd snap list <pool name>/<image name>
还可以用json格式输出。
rbd snap list <pool name>/<image name> 一一format json 一一pretty-format 例
rbd snap list kvm/imgl --format json --pretty-format
3.3回滚快照
回滚镜像到指定快照。
rbd snap rollback <pool name>/<image name>@<snap name>
注意:在回滚快照之需要将镜像取消镜像的映射,然后再回滚。
例
rbd snap rollback kvm/img1@img1_snap1
3.4限制快照数
限制镜像可创建快照数。
rbd snap limit set <pool name>/<image name> --limit 3
解除限制。
rbd snap limit clear <pool name>/<image name>
3.5删除快照
删除指定快照。
rbd snap rm <pool name>/<image name>@<snap name>
删除所有快照。
rbd snap purge <pool name>/<image name>
3.6快照分层
快照分层支持用快照的克隆生成新镜像,这种镜像与直接创建的镜像几乎完全一样,支持镜像的所有操 作。唯一不同的是克隆镜像引用了一个只读的上游快照,而且此快照必须要设置保护模式。
快照克隆
1.将上游快照设置为保护模式。
rbd snap protect <pool name>/<image name>@<snap name>
#例
rbd snap create kvm/img1@img1_snap666
rbd snap protect kvm/img1@img1_snap666
2、克隆快照为新的镜像。
rbd clone <pool name>/<image name>@<snap name> 一一dest <pool name>/<image name>
#例
rbd clone kvm/img1@img1_snap666 一一dest kvm/img3
•-dest:指定新的镜像名。克隆完成后可以通过下面命令查看快照的子项。
rbd children <pool name>/<image name>@<snap name>
快照展平
通常情况下通过快照克隆而得到的镜像会保留对父快照的引用,这时候不可以删除该父快照,否则会有 影响
rbd snap rm kvm/img1@img1_snap666
#报错 snapshot 'img1_snap666' is protected from removal.
如果要删除快照但想保留其子镜像,必须先展平其子镜像,展平的时间取决于镜像的大小,操作方法如 下。
1、 展平子镜像。
rbd flatten <pool name>/<image name>
#例:因为kvm/img3是由快照img1_snap666克隆而来的,所以我们先将它展平
rbd flatten kvm/img3
当展平完成后,正常情况下该快照还是受保护的,无法删除,所以还需要先取消保护。
2、 取消快照保护。
rbd snap unprotect <pool name>/<image name>@<snap name>
#例
rbd snap unprotect kvm/img1@img1_snap666
3、删除快照
rbd snap rm <pool name>/<image name>@<snap name>
#例
rbd snap rm kvm/img1@img1_snap666
在删除掉快照后,查看镜像kvm/img3依然存在
rbd ls 一一pool kvm -ls
四Linux客户端使用
本例主要是使用Linux客户端挂载RBD镜像为本地磁盘使用。开始之前需要在所需要客户端节点上面安 装ceph-common软件包,因为客户端需要调用rbd命令将RBD镜像映射到本地当作一块普通硬盘使用。 并还需要把ceph.conf配置文件和授权keyring文件复制到对应的节点。
4.1 ceph集群操作
1、 在ceph集群,例如在管理节点创建并授权一个用户可访问指定的rbd存储池,这里指定存储池为 kvm。
ceph auth get-or-create client.osd-mount osd "allow * pool=kvm" mon "allow r"
> /etc/ceph/ceph.client.osd-mount.keyring
以上是本案例所需要的权限,指定用户标识为client.osd-mount,可以为其它的标识。对另对OSD有所 有的权限,对Mon有只读的权限
2、 修改RBD镜像特性,需要提前创建一个镜像。默认情况下只支持layering和striping特性,需要将其 它的特性关闭。
rbd feature disable kvm/img1 object-map, fast-diff, deep-flatten
3、 将用户的keyring文件和ceph.conf文件发送到客户端的/etc/ceph目录下
ssh root@ 客户端主机 mkdir /etc/ceph
scp /etc/ceph/ceph.client.osd-mount.keyring root@ 客户端主机:/etc/ceph
scp /etc/ceph/ceph.conf root@ 客户端主机:/etc/ceph
4.2 linux客户端操作
注意大前提:客户端必须在public network网络内
1、 安装ceph-common软件包。
yum install ceph-common -y
注意:安装ceph-common软件包推荐使用软件包源与Ceph集群源相同,软件版本一致。
2、 执行客户端映射
#注意用户名为:osd-mount
cd /etc/ceph
rbd map 一一pool kvm --image imgl --keyring /etc/ceph/ceph.client.osd- mount.keyring --user osd-mount
3、 查看/断开映射
rbd showmapped
rbd unmap kvm/img1
4、 格式化并挂载
mkfs.xfs /dev/rbdO
mount /dev/rbd0 /mnt
5、 验证快照
#1、在客户端写入文件
echo egon666 > /mnt/egon.txt
#2、在ceph集群中对镜像做快照
rbd snap create kvm/img1@img1_snap6
#3、在客户端删除文件
rm -rf /mnt/egon.txt
#4、卸载客户端、断开映射
umount /mnt
rbd unmap kvm/img1
#5、在ceph集群恢复快照
rbd snap rollback kvm/img1@img1_snap6
# 6、客户端重新映射并挂载
rbd map --pool kvm --image img1 --keyring /etc/ceph/ceph.client.osd- mount.keyring --user osd-mount
mount /dev/rbd0 /mnt
ls /mnt #发现数据还原回来了
6、在线扩容
#1、在ceph集群中调整镜像的大小
rbd resize ——pool kvm ——image imgl ——size 5G
#2、在客户端,执行下述命令
resize2fs /dev/rbd0
xfs_growfs /dev/rbd0
五镜像的导出导入
5.1镜像的导出导入
导出镜像
[root@admin ~]# rbd 一一pool kvm ls
img1
img2
img3
[root@admin ~]# rbd export kvm/imgl /tmp/kvm_img1_bak
删除镜像
#卸载客户端挂载,并取消映射
rbd unmap kvm/img1
#清除镜像下的所有快照
rbd snap purge kvm/img1
#删除镜像
rbd remove kvm/img1
#查看存储池kvm下的镜像,发现img 1已经删除
[root@admin ~]# rbd --pool kvm ls
img2
img3
[root@admin ~]#
导入镜像
#1、导入镜像
rbd import /tmp/kvm_img1_bak kvm/imgl
#2、查看存储池kvm下的镜像,发现img 1已经还原
[root@admin ceph]# rbd --pool kvm Is
imgl
img2
img3
[root@admin ceph]#
#3、按照第四章节的步骤操作ceph集群与客户端,可以让img 1重新被客户端挂载使用
5.2也可以从快照导入镜像
导出镜像的快照
#1、为镜像kvm/imgl创建快照
rbd snap create kvm/img1@snap666
#2、导出快照
rbd export kvm/img1@snap666 /tmp/xxx.bak
删除镜像文件
#删除镜像
rbd snap purge kvm/img1 #先清理掉镜像下的所有快照
rbd remove kvm/img1 #然后再删除镜像
从xxx.bak中导入镜像
rbd import /tmp/xxx.bak --dest-pool kvm --dest img1
重新挂载使用,镜像中原来的数据依然存在
#ceph集群:以为之前已经创建过账号了,所以只需执行
rbd feature disable kvm/img1 object-map, fast-diff, deep-flatten
#在客户端执行
cd /etc/ceph
rbd map --pool kvm --image img1 --keyring /etc/ceph/ceph.client.osd- mount.keyring --user osd-mount
#在客户端挂载即可,无需再格式化制作文件系统
mount /dev/rbd0 /mnt
ls /mnt #发现数据还愿回来了
六、KVM虚拟机使用
在开始之前首先需要部署一台KVM虚拟,然后指定虚拟机xml配置文件,最后修改虚拟机配置文件指定 从Ceph集群加载磁盘即可。同样使用KVM作为Ceph集群客户端,那么客户端节点必须安装ceph- common软件包,并把ceph.conf配置文件和授权keyring文件复制到对应的节点。
6.1准备KVM虚拟机环境
部署KVM的服务器需要支持虚拟化,否则无法正常使用。使用下面命令可判断服务器是否支持虚拟化, 如果有输出表示支持,否则可能需要另外开启。
lsmod |grep kvm
1、 假设底层支持环境没有问题,安装虚拟机。
yum -y install qemu-kvm qemu-kvm-tools virt-manager virt-install libvirt
2、 启动服务
systemctl enable libvirtd.service
systemctl start libvirtd.service
6.2准备用户授权
ceph auth caps client.osd-mount osd "allow * pool=kvm" mon "allow r"
6.3创建KVM使用Secret
1、 创建一个xml文件,文件名称随意,内容如下。
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.kvm secret</name>
</usage>
</secret>
client.kvm代表Ceph集群的用户,type为ceph表示用户类型为Ceph用户。
2、 将创建的xml文件转换为Secret。
virsh secret-define --file secret.xml
–file:指定前面的xml文件,该命令会返回一串Secret字符串。Secret相当于KVM去访问Ceph集群时使 用的认证,但这个里面只包含了用户名。
3、 将对应用的Ceph用户的Key与Secret合并。
virsh secret-set-value --secret 7b64bd4d-ed43-4ddf-8e36-97c82397e718 --base64 AQCpE9VcOrHbBhAASQ36s2IWCEdw+8wbjoyU/w==
•–secret:指定第2步生成的Secret值。
•–base64 :指定Ceph用户的Key信息。
6.4创建虚拟机模板
原则上可以直接通过创建一个虚拟机模板,该模板内指定使用RBD镜像作为启动盘,然后通过定义了这 个模板来直接启动虚拟机。但有有可能每个人所定义的配置不一样,这时候可以通过自定义创建一台虚 拟机出来,然后在此虚拟机的模板基础上修改得到新的虚拟机。
1.在Ceph集群创建KVM虚拟机使用的RBD镜像,同样也需要修改该镜像的特性,只支持layering和 striping特性。这里直接使用Linux客户端挂载时创建的镜像,镜像名为img1。
2.在本地创建KVM虚拟机使用的本地镜像。作为虚拟机首次创建获取模板所用,后面将不使用此镜 像启动。
qemu-img create -f raw /opt/CentOS7.raw 2G
#-f:指定镜像格式,raw相当于全镜像模式,性能最好,另外还有一种格式为qcow2,这种为稀疏 格式,性能较差。
#镜像存储在/opt/CentOS7.raw,并指定大小为2G。
3.使用刚创建的本地镜像,并将一个系统ISO挂载到虚拟驱内一起启动。
virt-install --name CentOS7 --virt-type kvm --ram 1024 -- cdrom=/opt/CentOS-7-x86_64-Minimal-1810.iso --disk path=/opt/CentOS7.raw - -network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
#--cdrom:指定系统ISO镜像。
#--disk:指定本地硬盘镜像,第2步创建的镜像。
#--name:虚拟机名称。
#--virt-type :虚拟机类型。
#--network :虚拟机使用的网络类型。
#--graphics :指定图形相关配置,启动成功后监听0.0.0.0:5900号端口,如果第二台就是 0.0.0.0:5901,以此类推。可以使用VNC客户端进行连接。
#--noautoconsole:不自动连接至控制吧。
4.虚拟机创建成功后,查看监听端口,这时候使用VNC客户端连接至该端口,正常情况该虚拟机已经 启动,并进入系统安装界面。
5.命令下面的命令可以查看所有虚拟机运行状态。
virsh list --all
6.关闭虚拟机,并获取获取机的配置文件。
virsh destroy CentOS7
默认虚拟机配置文件存放在/etc/libvirt/qemu/下以虚拟机名称命名,只需要将该配置文件复制一 份即可。
cp /etc/libvirt/qemu/CentOS7.xml ./CentOS7-RBD.xml
7,将新配置文件修改如下,前面的2到6步操作主要是为了演示配置文件的由来,如果在实验的情况 下,此配置文件可直接根据自己的信息修改后使用。
〈domain type='kvm'>
<name>CentOS7-RBD</name>
<memory unit='KiB'>1048576</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64'>hvm</type>
<boot dev="cdrom"/>
</os>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='network' device='disk'>
<source protocol='rbd' name='kvm/img1'>
<host name='192・168・6・126,192・168・6・127,192・168・6・128'
port='6789'/>
</source>
<auth username='osd-mount'>
<secret type='ceph' uuid='6c5a16cc-7b16-4bdc-be85-d9d664b14570'/>
</auth>
〈target dev='vda' bus='virtio'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
〈target dev='hda' bus='ide'/>
<source file='/opt/CentOS-7-x86_64-Minimal-1810.iso'/>
〈readonly/>
〈/disk>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
〈/interface>
〈graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
〈listen type='address' address='0・0・0・0'/>
〈/graphics>
〈/devices>
</domain>
将配置文件必须的部分保留,注意更改了最上面的,删除了与虚拟机相关的配置。在内指定了引导 启动设备为cdrom,并且在内指定了cdrom相关的配置。主要配置为,有两个配置,一个为ISO镜 像的配置,另一个配置如下。
<disk type='network' device='disk'>
<source protocol='rbd' name='kvm/img1'>
<host name='192.168.6.126,192.168.6.127,192.168.6.128' port='6789'/> </source>
<auth username='osd-mount'>
<secret type='ceph' uuid='6c5a16cc-7b16-4bdc-be85-d9d664b14570'/>
</auth>
〈target dev='vda' bus='virtio'/>
</disk>
- type:指定磁盘从网络获取。
- :指定源协议为rbd,镜像名为kvm/imgl。相当于/。
- :指定Mon主机的IP与端口,多个主机使用逗号分隔,端口单独指定。
- :指定认证信息,username用来指定用户名。secret指定密码,其中type指定为ceph类 型,而uuid为前面创建的Secret的ID,可以使用命令virsh secret-list获取。
8.将配置文件定义为虚拟机。
virsh define CentOS7-RBD.xml
9.这时候通过virsh list --all查看新创建的虚拟机,此时状态为关闭。接下来就是开机安装系统即可。
virsh start CentOS7-RBD
正常情况下虚拟机启动成功后就可以用V NC客户端连接上面正常安装系统即可,关于虚拟机网络即 其它相关配置这里不过多介绍,有兴趣可查阅更多相关资料。系统安装完成后将disk设置为开机 弓I导项即可,删除cdrom的块即可。可再使用一份新的配置文件重新定义一台虚拟机,如。
<domain type='kvm'>
<name>CentOS7-RBD</name>
<memory unit='KiB'>1048576</memory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64'>hvm</type>
</os>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='network' device='disk'>
<source protocol='rbd' name='kvm/img1'>
<host name='192・168・6・126,192・168・6・127,192・168・6・128' port='6789'/>
</source>
<auth username='osd-mount'>
<secret type='ceph' uuid='6c5a16cc-7b16-4bdc-be85-d9d664b14570'/>
</auth>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
</interface>
<graphics type='vnc' port='-1' autoport='yes <listen type='address' address='0.0.0.0'/>
</graphics>
</devices>
</domain>