对rbd进行进行快照

发布时间 2023-10-27 16:25:55作者: 坚强的小蚂蚁

参考:

https://www.cnblogs.com/hukey/p/13283351.html
https://www.cnblogs.com/potato-chip/p/12350720.html

一. 找到某个k8s中pod使用存储镜像的具体位置

方法如下. 以kuaikong 名字空间下的mysql为例子

1.找到此pod所在的节点
kubectl get pod -n kuaikong -o wide  
2.进入到容器内部, 执行df -h, 找到挂载的磁盘
kubectl exec -it mysql-ha-mysqlha-0 -n kuaikong -- bash 
root@mysql-ha-mysqlha-0:/# df -h
Filesystem                         Size  Used Avail Use% Mounted on
overlay                            2.2T   60G  2.0T   3% /
/dev/mapper/ubuntu--vg-ubuntu--lv  2.2T   60G  2.0T   3% /etc/hosts
shm                                 64M     0   64M   0% /dev/shm
/dev/rbd1                          197G   64G  134G  33% /var/lib/mysql

这里为/dev/rbd1
3.在pod所在的节点上执行rbd showmapped,找到对应的image
root@k8s-master1:/mnt/ceph-block-device-test10# rbd showmapped
id  pool         namespace  image                                         snap  device   
0   replicapool             csi-vol-21de62eb-fc10-11eb-b89e-62196757365f  -     /dev/rbd0
1   replicapool             csi-vol-2cc12d1a-fb4f-11eb-b89e-62196757365f  -     /dev/rbd1
2   replicapool             csi-vol-1668e0a3-71db-11ec-9442-1657fcb4c9aa  -     /dev/rbd2

存储镜像为csi-vol-2cc12d1a-fb4f-11eb-b89e-62196757365f

二. 测试使用testPool池中的test10镜像

1.查看所有的池
ceph osd lspools
2.查看某个池中有哪些镜像
# 这里查看testPool这个池中的镜像
rbd ls testPool
3.rbd映射特定镜像到主机
rbd  map testPool/test10
rbd showmapped  查看本机所有的映射信息
取消块设备映射:rbd unmap /dev/rbd4  #挂载位置根据实际情况填写
4.格式化块设备
mkfs.ext4 -q /dev/rbd4
5.挂载使用
mkdir -p /mnt/ceph-block-device-test10
mount /dev/rbd4 /mnt/ceph-block-device-test10
6.扩展image大小
rbd resize testPool/test10 --size 100m
resize2fs /dev/rbd4

三. 对rbd快照

1.写入测试文件
在/mnt/ceph-block-device-test10中写入一个测试文件
echo "snapshot test1" > 1.txt
echo "snapshot test2" > 2.txt
2.创建快照
rbd snap create testPool/test10@snap1
3.查看快照列表
rbd snap ls testPool/test10 
4.还原快照
为了检验快照恢复后数据的正确性,先把上面的2.txt删除
rm 2.txt

卸载image
umount /dev/rbd4
rbd unmap testPool/test10 或者 rbd unmap /dev/rbd4  取消块设备映射

查看快照是否还存在
rbd snap ls testPool/test10

进行快照还原
rbd snap rollback testPool/test10@snap1

映射image
rbd map testPool/test10
mount /dev/rbd4 /mnt/ceph-block-device-test10

查看数据是否恢复到快照前
ls /mnt/ceph-block-device-test10

四. 克隆

1.保护快照
rbd snap protect testPool/test10@snap1
rbd snap ls testPool/test10
2.创建克隆
克隆的名字testPool/test10-snap1-clone可以随意写,这里用"/"表明是哪个pool的,是个好习惯
rbd clone testPool/test10@snap1 testPool/test10-snap1-clone
3.查看克隆
root@k8s-master1:/mnt/ceph-block-device-test10# rbd ls testPool -l
NAME                SIZE     PARENT                 FMT  PROT  LOCK
image1              100 MiB                           2            
test10              100 MiB                           2            
test10@snap1        100 MiB                           2  yes       
test10-snap1-clone  100 MiB  testPool/test10@snap1    2    

注意:如果不加-l 看不到快照信息
发现新克隆的名字中没有testPool/
4.查看克隆的详细信息
克隆成功的镜像是依赖于快照的,能看到 parent 和 overlap
rbd info testPool/test10-snap1-clone
rbd image 'test10-snap1-clone':
     size 100 MiB in 25 objects
     order 22 (4 MiB objects)
     snapshot_count: 0
     id: 213dfa95277790
     block_name_prefix: rbd_data.213dfa95277790
     format: 2
     features: layering
     op_features: 
     flags: 
     create_timestamp: Wed Jan 12 14:03:43 2022
     access_timestamp: Wed Jan 12 14:03:43 2022
     modify_timestamp: Wed Jan 12 14:03:43 2022
     parent: testPool/test10@snap1
     overlap: 100 MiB
5.对克隆进行合并
比如想要 克隆独立存在,不依赖于快照,就需要对克隆和快照做一个合并:
rbd flatten testPool/test10-snap1-clone

查看克隆是否独立存在了
rbd info testPool/test10-snap1-clone
6.删除快照
克隆独立后,此时就可以删除快照了
首先解除快照的保护模式
rbd snap unprotect testPool/test10@snap1
rbd info testPool/test10@snap1
rbd ls testPool -l

进行快照删除操作
rbd snap rm testPool/test10@snap1
rbd ls testPool -l