根底不牢,地动山摇。无论是何种体系架构,底层存储的抉择都是一个值得探讨的话题。存储承载着业务的数据,其性能间接影响到业务利用的理论体现。也正因为存储和业务的数据关联严密,其可靠性也必须失去关注,存储的生效一旦导致业务数据失落,那将会是一场劫难级别的事变。
1. 云原生时代的存储抉择之路
最近几年,我的工作内容始终围绕着客户 Kubernetes 集群的建设。如何为客户的 Kubernetes 集群抉择一款稳固牢靠、性能体现优异的存储解决方案,这样的问题始终困扰着我。
存储卷能够在 Pod 漂移到其余节点后从新挂载这一最根底的功能性要求,让我一开始就把眼光放在了共享文件系统这一存储类型上。最开始抉择了 Nfs,到起初又投入了 Glusterfs 的怀抱,直到最近开始致力摸索其余更好的云原生存储解决方案,这一路走来也让我对各种存储有了肯定的理解。它们各自有着本人的特点:
- Nfs:Nfs 是一种老牌的基于网络共享文件的存储解决方案。它的长处是简略高效。它的毛病也比拟显著,服务端单点故障,数据没有复制机制。在某些对可靠性要求不高的场景下,Nfs 仍然是不二之选。
- Glusterfs:这是一种开源的分布式共享存储解决方案。绝对于 Nfs 而言,Gfs 通过多正本复制集晋升了数据的可靠性,增加 Brick 的机制也让存储集群的扩大不再受限于一台服务器。Gfs 一度是我部在生产环境下的首选,通过将复制因子设置为 3,保障了数据的可靠性的同时,又可能防止分布式系统下的数据脑裂的问题。随同 Gfs 一起后退了很久之后,咱们也发现了它在密集小文件读写场景下的性能短板。而且繁多的共享文件系统类型的存储,也慢慢不再满足咱们的应用场景须要。
咱们在寻找更适合的存储这一道路上始终没有进行摸索。这两年云原生概念煊赫一时,社区中不断涌现进去各种云原生畛域我的项目,其中也不乏存储相干的我的项目。最开始,咱们将眼光放在 Ceph 身上,它最吸引咱们的是能够提供高性能的块设施类型存储。然而被其简单的部署形式、较高的运维门槛一度劝退。而 CNCF 毕业我的项目 Rook 的呈现,终于铲平了接触 Ceph 的最初一道门槛。
Rook 我的项目提供了一种云原生存储编排工具,为各种类型的存储提供平台级、框架级的反对,统管了存储软件的装置、运维。Rook 在 2018 年公布的 0.9 版本中,正式将 Ceph Operator 作为稳固反对的个性,迄今曾经数年。应用 Rook 部署和治理生产级别的 Ceph 集群还是十分持重的。
绝对于 Gfs,Rook-Ceph 提供了性能极高的块设施类型存储,这相当于为 Pod 挂载了一块硬盘,应答密集小文件读写场景并非难事。Rook-Ceph 除了可能提供块设施类型存储之外,也能够基于 Cephfs 提供分布式共享存储,以及基于 S3 协定的对象存储。多种存储类型对立治理,并提供了可视化治理界面,对于运维人员十分敌对。
作为 CNCF 毕业我的项目,Rook-Ceph 对云原生场景的反对毋庸置疑。部署实现的 Rook-Ceph 集群提供了 CSI 插件,以 StorageClass 的模式面向 Kubernetes 供给数据卷,对于兼容 CSI 标准的各类云原生 PaaS 平台也十分敌对。
2. Rainbond 与 Rook 的对接
在 Rainbond V5.7.0-release 版本中,增加了对 Kubernetes CSI 容器存储接口的反对。
Rainbond 在装置部署阶段,就会援用 Cephfs 来部署默认为所有服务组件提供的共享存储。而对于有状态的服务组件而言,增加长久化存储时,能够抉择以后集群中所有可用的 StorageClass,通过抉择 rook-ceph-block
即可申请块设施进行挂载,全程图形化界面操作,非常不便。
如何部署 Rook-Ceph 并对接到 Rainbond 之中,请参考文档 Rook-Ceph 对接计划。
3. 应用体验
这个章节,我会以直观的形式,形容在 Rainbond 对接了 Rook-Ceph 存储之后的各种应用体验。
3.1 应用共享存储
Rainbond 在装置阶段通过指定参数来对接 Cephfs 作为集群共享存储。在应用 Helm 装置 Rainbond 的过程中,要害的对接参数如下:
--set Cluster.RWX.enable=true \
--set Cluster.RWX.config.storageClassName=rook-cephfs \
--set Cluster.RWO.enable=true \
--set Cluster.RWO.storageClassName=rook-ceph-block
对于任意一个部署在 Rainbond 平台上的服务组件而言,仅须要在挂载长久化存储时,抉择默认的共享存储,即相当于将数据长久化的保留进了 Cephfs 文件系统中。
集群中应用组件英文名能够过滤查问所生成的 PV 资源:
$ kubectl get pv | grep mysqlcephfs
pvc-faa3e796-44cd-4aa0-b9c9-62fa0fbc8417 500Gi RWX Retain Bound guox-system/manual7-volume-mysqlcephfs-0 rainbondsssc 2m7s
3.2 挂载块设施
除了默认的共享存储之外,其余所有集群中的 StorageClass 都面向有状态服务凋谢。手动抉择 rook-ceph-block
即可创立块设施类型存储,并挂载给 Pod 应用。当服务组件领有多个实例时,每个 Pod 都会生成一个块设施挂载应用。
查问所生成的 PV 资源:
$ kubectl get pv | grep mysql6-0
pvc-5172cb7a-cf5b-4770-afff-153c981ab09b 50Gi RWO Delete Bound guox-system/manual6-app-a710316d-mysql6-0 rook-ceph-block 5h15m
3.3 开启 dashboard
Rook-Ceph 默认部署时装置了可视化操作界面 Ceph-dashboard。在这里能够监控整个存储集群,也能够基于图形化界面操作更改各种存储类型的配置。
批改 Ceph 集群配置,禁用 dashboard 内置 ssl:
$ kubectl -n rook-ceph edit cephcluster -n rook-ceph rook-ceph
# 批改 ssl 为 false
spec:
dashboard:
enabled: true
ssl: false
# 重启 operator 使配置失效
$ kubectl delete po -l app=rook-ceph-operator -n rook-ceph
$ kubectl -n rook-ceph get service rook-ceph-mgr-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-mgr-dashboard ClusterIP 10.43.210.36 <none> 7000/TCP 118m
获取 svc,在平台上应用第三方组件的模式代理,开启对外服务地址后,即可通过网关拜访 dashboard。
拜访到仪表板后,默认用户为 admin
,在服务器执行以下命令获取明码:
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
3.4 应用对象存储
请参考文档 Rook-Ceph 部署对接,能够在 Rook-Ceph 中部署对象存储。只须要将对象存储的 service ClusterIP 通过第三方服务代理,咱们就能够失去一个能够被同个控制台纳管的多个集群同时拜访的对象存储地址。Rainbond 能够基于这一个性,实现云端备份迁徙性能。
获取对象存储的 svc 地址:
$ kubectl -n rook-ceph get service rook-ceph-rgw-my-store
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rook-ceph-rgw-my-store ClusterIP 10.43.12.100 <none> 80/TCP 3h40m
通过在企业设置中填写好当时在 Ceph-dashboard 中创立的对象存储 bucket、access-key、secret-key,即可对接好对象存储。
4. 性能比照测试
咱们利用 sysbench 工具,对应用了不同类型存储的 Mysql 进行了性能测试,除数据目录挂载了不同类型的存储,其余试验条件均统一。参加测试的存储类型包含 Glusterfs、Cephfs、Ceph-RBD 三种。
采集的数据为 sysbench 测试返回的每秒事务数(TPS)以及每秒申请数(QPS):
存储类型 | Mysql 内存 | QPS | TPS |
---|---|---|---|
Glusterfs | 1G | 4600.22 | 230.01 |
Cephfs | 1G | 18095.08 | 904.74 |
Ceph-RBD | 1G | 24852.58 | 1242.62 |
测试后果不言而喻,Ceph 块设施性能最高,Cephfs 绝对 Glusterfs 也有较显著的性能劣势。
5. 写在最初
适配 Kubernetes CSI 容器存储接口是 Rainbond v5.7.0-release 版本的一大个性,这个个性让咱们能够轻松对接 Rook-Ceph 这一优良的存储解决方案。通过对 Rook-Ceph 的应用体验的形容以及最初的性能测试比照,不得不说,Rook-Ceph 行将成为咱们在云原生存储畛域摸索的一个主攻方向。