Ceph RBD
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/