#作者:Unstopabler
前言
Rook 是一个开源的云原生存储编排器,为各种存储解决方案提供平台、框架和支持,以便与云原生环境进行原生集成。
Rook 将分布式存储系统转变为自管理、自扩展、自修复的存储服务。它使存储管理员的部署、引导、配置、配置、扩展、升级、迁移、灾难恢复、监控和资源管理等任务自动化。简而言之,Rook 就是一组 Kubernetes 的 Operator,它可以完全控制多种数据存储解决方案(例如 Ceph、EdgeFS、Minio、Cassandra)的部署,管理以及自动恢复。rook利用Kubernetes平台的强大功能,通过Kubernetes Operator为每个存储提供商提供服务。Rook目前支持Ceph、NFS、Minio Object Store和CockroachDB。
部署rook-ceph on kubernets条件
- 已经部署好的kubernetes集群1.19版本或者更高
- osd节点需要有未格式化文件系统磁盘,至少需要3块硬盘
注:这里pvc快照基于rook-ceph为云原生存储支撑,
部署参考文档:https://rook.io/docs/rook/v1.10/Getting-Started/quickstart/#tldr
rook与kubernets结合架构如如下
Ceph快照概述
Ceph rbd块原生提供了快照与克隆的能力,什么是快照?快照就是镜像某个时刻的状态,包括当时已经落盘的数据。制作快照后成为一个只读镜像文件,无法对快照的数据进行写入操作,因此需要保护起来,数据丢失之后可以基于快照进行回滚操作。rbd提供一个好用的功能copy-on-write,即基于快照快速的克隆功能,克隆处理的子镜像和快照是一个相互依赖的关系,可以完成虚拟机秒级的高级特性。
快照卷作为源数据,提供给上层业务使用应用于对数据只读场景,如开发测试的部分场景。该场景下,先对逻辑卷进行快照创建,将创建好的快照卷提供给上层业务使用,快照卷的只读特性不仅可满足上层业务的访问需求,也可以有效防止误操作对原逻辑卷数据的更改。
Ceph-rbd快照详解 官方文档:https://docs.ceph.com/en/latest/rbd/rbd-snapshot/
什么是PVC
PVC是PersistentVolumeClaim的缩写,pvc描述 Pod想要使用的持久化属性,比如存储大小、读写权限等。PVC是在Kubernetes中一种抽象的存储卷类型,代表了某个具体类型存储的数据卷表达。 其设计意图是分离存储与应用编排,将存储细节抽象出来并实现存储的编排。 这样Kubernetes中存储卷对象独立于应用编排而单独存在,在编排层面使应用和存储解耦。
容器中并没有直接使用rbd块集成,而是通过pvc实现和底层块存储的调用,容器中完成快照制作,需要snapshot的控制器来实现这个功能,snapshot控制器是一个第三方crd,其通过crds的方式和kubernets集成,能够完成pvc快照到底层rbd块的控制逻辑。
安装快照控制器和CRD
1.安装crds资源
下载第三方crds
[root@k8s-master~]#git clone https://github.com/kubernetes-csi/external-snapshotter.git
Cloning into 'external-snapshotter'...
remote: Enumerating objects: 51112, done.
remote: Total 51112 (delta 0), reused 0 (delta 0), pack-reused 51112
Receiving objects: 100% (51112/51112), 64.98 MiB | 1.85 MiB/s, done.
Resolving deltas: 100% (26577/26577), done.
Updating files: 100% (4018/4018), done.
应用crd资源
[root@k8s-master ~]# kubectl apply -f external-snapshotter/client/config/crd/
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io configured
[root@k8s-master ~]#
查看crd资源
[root@k8s-master ~]# kubectl get customresourcedefinitions.apiextensions.k8s.io | grep volumesnap
volumesnapshotclasses.snapshot.storage.k8s.io 2022-11-23T01:51:36Z
volumesnapshotcontents.snapshot.storage.k8s.io 2022-11-23T01:51:36Z
volumesnapshots.snapshot.storage.k8s.io 2022-11-23T01:51:36Z
[root@k8s-master ~]#
2.安装控制器
[root@k8s-master ~]# kubectl apply -f external-snapshotter/deploy/kubernetes/snapshot-controller/
serviceaccount/snapshot-controller created
clusterrole.rbac.authorization.k8s.io/snapshot-controller-runner created
clusterrolebinding.rbac.authorization.k8s.io/snapshot-controller-role created
role.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
rolebinding.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
deployment.apps/snapshot-controller created
[root@k8s-master ~]#
查看控制器pod运行状态
[root@k8s-master ~]# kubectl get pod -n kube-system -l app=snapshot-controller
NAME READY STATUS RESTARTS AGE
snapshot-controller-5655ff978f-dh5dc 1/1 Running 0 8m12s
snapshot-controller-5655ff978f-fbtch 1/1 Running 0 8m12s
[root@k8s-master ~]#
3.安装快照类
控制器和crds后,为了能够使用快照的功能,需要定义一个volumesnapshotclass,类似storageclass,volumesnapshotclass是专门针对快照功能而提供的存储类,是kubernets中定义的一个特性。
安装方法如下
[root@k8s-master rbd]# pwd
/root/yml/rook/deploy/examples/csi/rbd
[root@k8s-master rbd]# kubectl apply -f snapshotclass.yaml
volumesnapshotclass.snapshot.storage.k8s.io/csi-rbdplugin-snapclass created
[root@k8s-master rbd]#
查看快照类
[root@k8s-master rbd]# kubectl get volumesnapshotclasses.snapshot.storage.k8s.io
NAME DRIVER DELETIONPOLICY AGE
csi-rbdplugin-snapclass rook-ceph.rbd.csi.ceph.com Delete 38s
[root@k8s-master rbd]#