RBD可以挂载为磁盘设备,被kvm当做磁盘设备。

创建块设备:

1、创建存储池

ceph osd pool create kube 64 64

2、在存储池上启用RBD功能

ceph osd pool application enable kube rbd

3、初始化块设备,之后就可以当块存储池使用了

rbd pool init kube



创建镜像:

查看帮助:

rbd help create

创建镜像有两种方式:

格式一:

]$ rbd create --pool kube --image vol01 --size 2G
]$ rbd ls --pool kube 
vol01

格式二:

rbd create --size 2G kube/vol02

常见参数:

--order:块大小的排序

--object-size:指定块大小

--image-feature:镜像文件的特性(带+号的默认启用)

        layering:分成镜像,分层克隆,快照

        exclusive-lock:分布式排它锁

        object-map:对象映射,对象位图,一些关于磁盘的信息,还剩多少槽位信息

        fast-diff:快照比较

        deep-flatten:平展操作,将快照前的数据和快照之后的数据合并为一个数据

        object-map, fast-diff, deep-flatten 这三个特性被linux内核作为磁盘加载使用时是不支持的,需要禁用。

        journaling:日志

查看镜像列表:

]$ rbd ls --pool kube -l
NAME   SIZE PARENT FMT PROT LOCK 
vol01 2 GiB          2           
vol02 2 GiB          2

以json格式输出:

]$ rbd ls --pool kube -l --format json --pretty-format
[
    {
        "image": "vol01",
        "size": 2147483648,
        "format": 2
    },
    {
        "image": "vol02",
        "size": 2147483648,
        "format": 2
    }
]

查看rbd的详细信息:

]$ rbd info --pool kube --image vol01
rbd image 'vol01':
	size 2 GiB in 512 objects
	order 22 (4 MiB objects)
	id: fb226b8b4567
	block_name_prefix: rbd_data.fb226b8b4567
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Fri Jan 10 20:32:14 2020

或者:效果一样

rbd info kube/vol01
rbd info -p kube vol01

禁用或启用特性:

rbd help feature disable
rbd feature disable <features> # 禁用某个特性
rbd feature enable <features> # 启用某个特性

例:object-map、fast-diff、deep-flatten这三个特性是不被linux内核支持的,挂载使用时需要关闭这些特性。

]$ rbd feature disable kube/vol01 object-map fast-diff deep-flatten
[cephadm@ceph01 ceph-cluster]$ rbd info --pool kube vol01
rbd image 'vol01':
	size 2 GiB in 512 objects
	order 22 (4 MiB objects)
	id: fb226b8b4567
	block_name_prefix: rbd_data.fb226b8b4567 # 每个对象的前缀名称
	format: 2 # 镜像文件格式
	features: layering, exclusive-lock # 当前启用的对象特性,上面设置的特性已被关闭
	op_features: # 可选特性
	flags: # 标志位
	create_timestamp: Fri Jan 10 20:32:14 2020


linux使用rbd设备


常见方式有如下几种:1、直接在linux中识别为内核设备。2、让kvm当磁盘设备使用。3、把Ceph整合到openstack中。

将镜像作为磁盘挂载到linux中:

在linux客户端安装ceph客户端插件:

yum install ceph-common -y

查看内核是否支持ceph:rbd使用的是librbd,cephfs使用的是ceph模块

modinfo ceph

在管理端创建镜像设备:

rbd create --size 1G kube/vol01

禁用这三个特性object-map、fast-diff、deep-flatten:

rbd feature disable kube/vol01 object-map fast-diff deep-flatten

创建用于访问此设备的账号:并将结果保存在keyring文件里面。

ceph auth get-or-create client.kube mon 'allow r' osd 'allow * pool=kube' > /etc/ceph/ceph.client.kube.keyring

将创建出的keyring文件放入到客户端的/etc/ceph目录中。

scp /etc/ceph/ceph.client.kube.keyring root@192.168.1.12:/etc/ceph

复制配置文件到客户端:

scp /etc/ceph/ceph.conf root@192.168.1.12:/etc/ceph

查看创建的账号:可以看到刚刚创建的kube用户的权限

]# ceph auth get client.kube
exported keyring for client.kube
[client.kube]
	key = AQCgfz5ei0SXHBAAwf7SAY5MZdg8YP43fZURKQ==
	caps mon = "allow r"
	caps osd = "allow * pool=kube"
或:

]# ceph auth list | grep -A 3 client.kube

使用指定用户查看集群的状态:

ceph -s --user=kube

在客户端中将创建的磁盘设备映射到本地:

]# rbd map kube/vol01 --user=kube
/dev/rbd0

查看本地的磁盘设备:

fdisk -l | grep -A 3 /dev/rbd0

格式化磁盘:

mkfs.xfs /dev/rbd0

挂载使用:

mount /dev/rbd0 /mnt/

卸载:

umount /mnt/

映射关系:

查看映射关系:

rbd showmapped
id pool image snap device    
0  kube vol01 -    /dev/rbd0

取消映射关系:

sudo rbd unmap /dev/rbd/{poolname}/{imagename}

例1:使用poolname/imagename

sudo rbd unmap /dev/rbd/rbd/foo

例2:使用设备名的方式

rbd unmap /dev/rbd0

再次查看:此时已经正式卸载并取消关联关系了

rbd showmapped


调整镜像空间容量:

空间扩展:

rbd resize -s 2G kube/vol01

缩减空间:需要加上选项 --allow-shrink

rbd resize --allow-shrink -s 1G kube/vol01

查看空间:

rbd ls -p kube -l
NAME   SIZE PARENT FMT PROT LOCK 
vol01 1 GiB          2


删除设备:

注意:这里是真的删除了

rbd rm kube/vol01

移动到回收站:一般情况下是把镜像移动到回收站即可。

rbd trash move kube/vol01

查看回收站:

rbd trash list -p kube
653176b8b4567 vol01

回收镜像:

rbd trash restore -p kube  kube/vol01 --image-id 653176b8b4567

查看镜像:此时镜像已近恢复。

]# rbd ls -p kube -l
NAME   SIZE PARENT FMT PROT LOCK 
vol01 1 GiB          2

从回收站中删除:

rbd trash remove -p kube --image-id 653176b8b4567



镜像快照


创建快照:

cow写时复制,写时把数据复制到快照,改元数据。

raw写时重定向,原卷数据不变改快照数据。

在客户端将镜像挂载到目录写入文件:

rbd map kube/vol01 --user=kube
mount /dev/rbd0 /mnt/
cd /mnt
touch demo.txt

在管理端创建快照:

rbd snap create kube/vol01@snap1

查看快照:

]# rbd snap list kube/vol01
SNAPID NAME   SIZE TIMESTAMP                
     4 snap1 1 GiB Sun Feb  9 01:38:47 2020

再到刚才的目录下将写入的文件删除:

rm -rf /mnt/demo.txt

卸载目录并解除关联关系:

umount /mnt/
rbd unmap /dev/rbd0

到管理端回滚该镜像:

rbd snap rollback kube/vol01@snap1

回滚后再将镜像挂载到目录:

rbd map kube/vol01 --user=kube
mount /dev/rbd0 /mnt/

查看目录:刚才的文件又回到磁盘中了

]# ls /mnt/
demo.txt


删除快照:

rbd snap rm kube/vol01@snap1


限制快照数量:如果想修改数量重新设定即可

rbd snap limit set kube/vol01 --limit 10

清除快照限制:

rbd snap limit clear kube/vol01


多层快照:
类似vmware虚拟机中的快照模式。

一、创建镜像

创建镜像并建立映射关系:相当于创建一个系统镜像

rbd create --pool kube --image vol02 --size 1G
rbd feature disable kube/vol02 object-map fast-diff deep-flatten
rbd map --pool kube --image vol02 --user kube
mkfs.xfs /dev/rbd1
mount /dev/rbd1 /mnt/

在这个磁盘里面写入内容:

echo "ceph" > /mnt/demo.txt

二、创建快照模板:相当于给系统镜像创建模板

rbd snap create kube/vol02@clonetpl1

]# rbd snap list kube/vol02
SNAPID NAME       SIZE TIMESTAMP                
     6 clonetpl1 1 GiB Sun Feb  9 02:49:14 2020

置入保护模式:使其数据不被修改

rbd snap protect kube/vol02@clonetpl1

对快照进行克隆:

rbd clone kube/vol02@clonetpl1 kube/myimg01

]# rbd ls --pool kube ls
myimg01
vol01
vol02

三、使用快照:对快照修改不影响原件

rbd map --pool kube --image myimg01 --user kube
mount /dev/rbd0 /mnt/

]# cat /mnt/demo.txt 
ceph

查看一个快照被创建了多少个克隆:

]# rbd children kube/vol02@clonetpl1
kube/myimg01


删除原件:删除克隆镜像的初始镜像需要对已近克隆出来的镜像进行展平操作。因为快照之前的数据都在原件中。

rbd flatten kube/myimg01

解除保护状态:

rbd snap unprotect kube/vol02@clonetpl1

删除快照:

rbd snap rm kube/vol02@clonetpl1

再删除原件:

rbd rm kube/vol02


Ceph为kvm提供存储


先安装libvirt、qemu-kvm、ceph-common等操作。

将配置和keyring文件导入到libvirt的节点:

scp ceph.client.kube.keyring root@192.168.1.6:/etc/ceph
scp ceph.conf root@192.168.1.6:/etc/ceph

创建secret文件:

<secret ephemeral='no' private='no'>
    <usage type='ceph'>
        <name>client.kube secret</name>
    </usage>
</secret>

生成Secret:全局统一标识符

]# virsh secret-define client.kube.xml 
secret 37cfafcb-3c32-4d92-af50-48feb060b815 created

将秘钥导入到libvirt中:

virsh secret-set-value --secret 37cfafcb-3c32-4d92-af50-48feb060b815 --base64 AQCgfz5ei0SXHBAAwf7SAY5MZdg8YP43fZURKQ==

查看秘钥:

]# virsh secret-list 
 UUID                                  Usage
--------------------------------------------------------------------------------
 37cfafcb-3c32-4d92-af50-48feb060b815  ceph client.kube secret

这个值也可以get到:

]# virsh secret-get-value --secret 37cfafcb-3c32-4d92-af50-48feb060b815
AQCgfz5ei0SXHBAAwf7SAY5MZdg8YP43fZURKQ==

编辑xml文件:

    <disk type='network' device='disk'>
        <source protocol='rbd' name='kube/vol03'>
        <host name='ceph01,ceph02,ceph03' port='6789'/>
        </source>
        <auth username='kube'>
        <secret type='ceph' uuid='37cfafcb-3c32-4d92-af50-48feb060b815'/>
        </auth>
        <target dev='vda' bus='virtio'/>
    </disk>

注释:

<disk type='网络方式network' device='disk'>
	<source protocol='rbd协议' name='存储池/镜像'>
	<host name='monitor节点,多个用逗号隔开' port='端口'/>
	</source>
	<auth username='用户名'>
	<secret type='ceph' uuid='secret的uuid'/>
	</auth>
	<target dev='vda' bus='virtio'/>
</disk>

导入镜像:

rbd import demo.qcow2 kube/vol03

扩展磁盘:

rbd resize --size 16G kube/vol03

使用xml文件定义虚拟机:

virsh define ceph-disk.xml

启动虚拟机:

virsh start centos7-ceph

查看磁盘信息:

]# virsh qemu-monitor-command --hmp centos7-ceph 'info block'
drive-virtio-disk0: removable=0 io-status=ok file=rbd:kube/centos7:id=kube:key=AQCgfz5ei0SXHBAAwf7SAY5MZdg8YP43fZURKQ==:auth_supported=cephx\\;none:mon_host=192.168.1.61\\:6789 ro=0 drv=raw encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0

查看磁盘状态:

]# virsh domblklist centos7-ceph 
目标     源
------------------------------------------------
vda        kube/centos7

详见官方文档:

http://docs.ceph.org.cn/rbd/libvirt/